Avatar billede ostehamster Nybegynder
19. december 2005 - 21:05 Der er 21 kommentarer og
1 løsning

Beregning bliver forskellig, hvis jeg bruger printf lige inden?

Hejsa

Jeg er ved at lave en skakcomputer, og har en meget mærklig fejl.

Jeg har en metode til at beregne alle de ryk der skal beregnes, hvilket ca. giver 93000

Det underlige er, at hvis jeg lige inden skriver printf("");, så bliver der kun 79000

Hvordan kan det hænge sammen? Det er som printf("") over skriver et eller andet. Hvordan finder jeg lige fejlen?

mvh
Christoffer
Avatar billede arne_v Ekspert
19. december 2005 - 21:08 #1
det kunne være en funktion som returnerer adressen på en lokal variabel
Avatar billede ostehamster Nybegynder
19. december 2005 - 21:11 #2
men hvordan kan printf lave om på det?

Umiddelbart laver jeg et int array, og kalder funktionen med en pointer til dette, således at jeg kan skrive i det
Avatar billede ostehamster Nybegynder
19. december 2005 - 21:12 #3
cout gør iøvrigt det samme
Avatar billede arne_v Ekspert
19. december 2005 - 21:13 #4
fordi en lokal variabel ligger på stak og et funktions kald ændrer på stak
Avatar billede ostehamster Nybegynder
19. december 2005 - 21:18 #5
Hmm ok...
Avatar billede ostehamster Nybegynder
19. december 2005 - 21:36 #6
Tror bare det her er en af de ting jeg ikke skal forstå :)

Jeg har kigget alt igennem, og kan ikke se noget der skulle retunere mærkeligt. Og da det er en stor rekursiv funktion, dur det ikke rigtig noget at debugge
Avatar billede thomas_nj Nybegynder
19. december 2005 - 21:41 #7
Bare et gæt, gemmer du dine antal træk i en int variabel?
Avatar billede arne_v Ekspert
19. december 2005 - 21:45 #8
der er også andre mulige årsager, men det var den mest sandsynlige
Avatar billede ostehamster Nybegynder
19. december 2005 - 21:47 #9
Jeps, i det rekursive kald bliver der lavet en variabel kalder int moves[1000][2], som indeholde alle ryk
Avatar billede arne_v Ekspert
19. december 2005 - 21:49 #10
må vi se en kode snippet

funktions erklæring, funktionas kald og data definition

(du må godt udelade din deep blue killer algoritme)
Avatar billede ostehamster Nybegynder
19. december 2005 - 21:53 #11
void movegenerator(int farve, int moves[1000][2], int bedstGammel=0, int bedstNy=0);

Når man skal lave moves, så laver man
int moves[1000][2];

Som som indsættes som argument i movegenerator. Den vil jeg så blive en reference, så når jeg skriver til den, bliver det gemt i den jeg oprettede inden koden blev kørt.

Og der virker også, jeg får de rigtige moves ud. Men, når jeg køre det mange gange, så begynder det at betyde noget, om jeg køre printf("") før eller efter funktionen.
Avatar billede ostehamster Nybegynder
19. december 2005 - 21:54 #12
Kan det være fordi moves[1000][2] ikke kaldes explicit som en reference?
Avatar billede bertelbrander Novice
19. december 2005 - 22:33 #13
Næppe, moves bliver til en pointer når man kalder. Man kan ikke overføre arrays til funktioner i C eller C++.

Men hvis du laver mange moves[1000][2] på stakken på én gang,  kan det være et problem.
Avatar billede ostehamster Nybegynder
19. december 2005 - 22:36 #14
Det må man sige jeg gør. Funktionen bliver kaldt rigtig mange gange :)

Så det er ligefrem et stack overflow? Hvordan tester jeg for det?
Avatar billede bertelbrander Novice
19. december 2005 - 22:39 #15
Jeg ved ikke hvordan man tester for stack overflow, men jeg ville forvente at programmet gik ned, og ikke fejler.

Hvilken kompiler bruger du?
Avatar billede ostehamster Nybegynder
19. december 2005 - 22:47 #16
gcc 4.0
Avatar billede bertelbrander Novice
19. december 2005 - 22:50 #17
Avatar billede segmose Nybegynder
20. december 2005 - 10:39 #18
Det kunne også være buffer overflow.
Hvordan bounds checker du din moves[1000][2]?
hvordan tæller du dine mulig moves?
løbende eller efter alle er genereret?
Avatar billede scheea2000 Nybegynder
20. december 2005 - 10:40 #19
Se evt. min artikel om Minimax algoritmen: http://www.eksperten.dk/artikler/322

Beregner du alle moves først? Eller har du "moveGenerator" i din rekursive funktion.
Avatar billede ostehamster Nybegynder
22. december 2005 - 22:51 #20
Så blev opgaven afleveret, så nu er "problemet" væk :)

Vi fandt ud af, at hvis man lavede int moves[1000][2]; om til int moves[200][2];, opstod fejlen rent faktisk ikke. Så det har jo nok været fordi det har fyldt for meget.

Hvis der er nogle der gerne vil have point, så bare lig et svar :)
Avatar billede ostehamster Nybegynder
22. december 2005 - 22:51 #21
Takker iøvrigt for alle inputs!
Avatar billede ostehamster Nybegynder
18. januar 2006 - 20:50 #22
Der var vidst ingen der ville have point....
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