28. januar 2014 - 11:07Der er
2 kommentarer og 1 løsning
Brug af EN Delphi genereret STACK !
HEJ,
Dette er en SUDOKU-opgave. (16 X 16 matrix)
Min matrix er 16 * 16 (eller 16 blokke af 4 X 4 Celler).
Tal i opgaven er 0-9 A-F .
Som det formodes kendt kan enhver celle indeholde de tal nævnt i forrige linie, men kun EEN gang i hver 4*4 blok. Kolonnen kan indeholde tal , også kun forekommende 1 gang.
Tallene udelukker således hinanden.
Nogle celler i en opgave er udfyldt og opgaven består i at finde resten.
Nogle opgaver er (* Censur *) vanskelige og derfor har jeg besluttet at lave et comp.program, som kan løse dem.
Jeg overvejer om jeg skal bruge en RECURSIV programmering eller en STACK- løsning (m / uden pointere).
Hælder selv til sidstnævnte løsning.
Men kan ikke finde noget der ligner på nettet.
Nogen, som kender nogle gode link(s) ?
(Har programmeret m. pointere i Turbo Pascal for ca. 10 år siden - og ikke rørt det siden ! , så jeg trænger LIDT hjælp her ... !)
Hej kr. hvis du har konkrete problemer med pointere, så prøv at spørge...
Brug pointere til: 1. som reference til objekter/data... 2. til at arbejde med data.
Opret en pointer ved at: 1. forespørge om en parameter (var,const): eks. pointer(s); 2. bede OS om at allokere: getMem, dispose
try getMem(p1,SZ) except p1:=nil end; //spørg OS at reservere SZ bytes ned i "p1". //hvis success er p1 nu et 32-bit tal til data i memory...
if p1=nil then exit;
//Nu vil vi arbejde lidt med data i p1, men først: //tag en kopi af p1, for at huske denne position til senere...
p:=p1;
//arbejde lidt med data:
while sz<>0 do begin p^:=#0; //NULL //skriv "0" i nuværende byte (af "p") inc(p); //gå til næste byte dec(sz); //tæl ned (fra total længde) end;
//til sidst frigøres data igen, ved hjælp af position "getMem" tidl. dispose(p1);
//...
Et andet eksempel er records:
type rec1=record b:byte;i:word end; //total 3 bytes
var r1:rec1; b:byte; ch:char;
//Brug af pointer giver ekstra muligheder for eks:
b := pByte(@r1)^; //svarer til b:=r1.b; ch := pChar(@r1)^; //udtræk r1.b som char.
// "@" snabel-a: henter pointer til data i record (r1) // "^" caret: henter byte fra position i pointeren.
Endelig er pointere fantastisk hurtig til at arbejde med tekst. Man går frem og tilbage i teksten vha inc, dec,... men en god ting er at kende lengden på teksten i forvejen.
ANSI-text (8-bit) string, ansistring, array of ansichar. Denne type data afsluttes som regel med #0 (null).
Så for at vide om en pointer er gyldig kontrolleres to ting: 1. er pointeren nil 2. er pointerens byte i hukommelsen null
if (p=nil) or (p^=NULL) then exit;
Dermed ved allokering, reserveres een ekstra byte for NULL tegnet:
Efter nogen tid (og mit pandehår (det lidt, som er tilbage) begyndte at antage grålige nuancer!) fandt jeg af aften (nærmest for adspredelsens skyld) min ældgamle Turbo Pascal 4 bog (fra 1986 (!) frem og begyndte at blade lidt i den.
Der var osse et afsnit om pointere. Især et godt et om linked pointes.
Prøvede sådan nærmest for sjov at tilpasse det D7. OG FAN(* censur *) - galenme om det ikke virkede. Fik blod på tanden og prøvede at udvide til en to-vejs linked pointer.
Efter at have prøvet at indsætte NIL og prt^.NEXT og ditto^.prev diverse steder og jeg ved ikke hvormange fejl-meddelelser senere må alligevel ha' ramt den rigtige kombination, for da virkede det. Prøved' så at indsætte data - og HEURERKA - viola - eller hvad "man" nu siger - det funkede stadig.
De næste mange timer sad jeg med analyse- hjernen sat til (og en kop god kaffe i den anden (!) (* inspireret af de gamle Western film hvor helten aldrig ladede sin seksløber, den ene hånd på ryggen, den anden omkring livet på heltinden, hans seksløber ramte hvergang og skurkene skød elendigt .... *). Så nu har jeg lidt mere begreb om hvad det her er for noget og hvordan det skal håndteres.
Omkring SUDOKU-projektet har jeg læst lidt mere om Euler (spansk/russisk matematiker 17XX - 18yy) og lidt om hans måde at løse "Sudoku-problemet" på (det var ham som "opfandt" det oprindeligt og ikke et nyt bi(l)-produkt fra the Land of the Rising Sun). Det viser sig (selvfølgeligt) at jeg har gået på problemet på en skrup-forkert måde. Så pointer- (og for den sags skyld også recursiv-) løsningen er droppet.
Lige nu er jeg i gang med at implementere denne nye "Euler" løsning. Og foreløbig ser det lovende ud.
Den fungerer pefekt ved lettere opgaver men knirker lidt ved sværere opgaver. Er pt. i tænkebok hvorfor ?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.