28. januar 2014 - 11:07 Der 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 ... !)

KRISTIAN
Avatar billede mbsnet Nybegynder
04. februar 2014 - 16:10 #1
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:

getMem(length(s)+1)
04. februar 2014 - 17:19 #2
HEJ Morten,

Sjovt du netop siger dette...

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 ?

KR
12. februar 2014 - 15:28 #3
Ingen tilbage kommentarer.

Lukker spm.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester