kyrsjo Skrevet 19. mai 2005 Del Skrevet 19. mai 2005 Har en bit kode som ser slik ut: printf ("Generating gravity data...\n"); for (i = 0; i < OBJECTS; i++); for (x = 0; x < ROWS; x++) { for (y = 0; y < COLS; y++) { dx = grav_planet[i].posX - x; dy = grav_planet[i].posY - y; //Popluate the array grav_planet[i].gravDepth[x] [y].scalar = grav_calcScalar (grav_UnitConv(dx), grav_UnitConv(dy), grav_planet[i].mass); grav_planet[i].gravDepth[x] [y].angle = atan (dy / dx); //HACK ALLERT!! HACK ALLERT!! if (dx < 0) { grav_planet[i].gravDepth[x] [y].angle = gravDepth2[x] [y].angle + M_PI; //atan really giving two possible answers } grav_planet[i].gravDepth[x] [y].Xvec = grav_planet[i].gravDepth[x] [y].scalar * cos (grav_planet[i].gravDepth[x] [y].angle); grav_planet[i].gravDepth[x] [y].Yvec = grav_planet[i].gravDepth[x] [y].scalar * sin (grav_planet[i].gravDepth[x] [y].angle); } } hvor definisjonene ser slik ut: //Arrays to keep the info typedef struct grav_data { //Data for a single datapoint - i.e. a pixel double Xvec; double Yvec; double scalar; double angle; } grav_data; grav_data gravDepth1 [ROWS] [COLS]; grav_data gravDepth2 [ROWS] [COLS]; grav_data gravDepthSum [ROWS] [COLS]; typedef struct grav_object { double radius; double mass; int posX; //In pixels so far :P int posY; grav_data gravDepth [ROWS] [COLS]; int set; } grav_object; grav_object grav_planet [OBJECTS]; Nå har jeg et merkelig problem med i i koden vist ovenfor: (gdb) run --drawmethod 1 Starting program: /home/kyrre/Desktop/GravityMap (head)/gravitymap --drawmethod 1 [Thread debugging using libthread_db enabled] [New Thread -1208980704 (LWP 5781)] i=0 i=1 [Switching to Thread -1208980704 (LWP 5781)] Breakpoint 1, main (argc=3, argv=0xbffd31c4) at main.c:260 260 printf ("Generating gravity data...\n"); (gdb) print i $13 = 2 (gdb) next Generating gravity data... 261 for (i = 0; i < OBJECTS; i++); (gdb) print i $14 = 2 (gdb) next 262 for (x = 0; x < ROWS; x++) { (gdb) print i $15 = 2 (gdb) i skulle da endres til null her?!? dette blir et problem lengre ned, da jeg da forsøker å lese utenfor arrayet... 262 for (x = 0; x < ROWS; x++) { (gdb) print i $15 = 2 (gdb) next 263 for (y = 0; y < COLS; y++) { (gdb) 264 dx = grav_planet[i].posX - x; (gdb) print grav_planet $16 = {{radius = 6371000, mass = 5.9740000000000004e+24, posX = 128, posY = 240, gravDepth = {{{Xvec = 0, Yvec = 0, scalar = 0, angle = 0} <repeats 480 times>} <repeats 640 times>}, set = -1}, { radius = 1740000, mass = 7.3500000000000001e+22, posX = 538, posY = 240, gravDepth = {{{Xvec = 0, Yvec = 0, scalar = 0, angle = 0} <repeats 480 times>} <repeats 640 times>}, set = -1}} (gdb) print grav_planet[i] $17 = {radius = 1.0024739778560128e-315, mass = 0, posX = 0, posY = 0, gravDepth = {{{Xvec = 0, Yvec = 0, scalar = 0, angle = 0} <repeats 480 times>} <repeats 640 times>}, set = 0} (gdb) print i $18 = 2 (gdb) - noe som helt klart gir humbug-data... Utrolig nok ingen segfault. Er det ikke en option til GCC som får den til å krasje på sånne ting (gjør programmet noe treigere, men *alt* for å finne bugs!)? Har en litt gammel versjon, så kansje det ikke er støttet... Har en boks med gcc4 på også ved nærmere ettertanke. Hvorfor denne vrede? Hva har jeg gjort den for noe ondskapsfullt her i livet? Lenke til kommentar
kyrsjo Skrevet 19. mai 2005 Forfatter Del Skrevet 19. mai 2005 Er det foresten noen kommando i gdb som gjør at man kan endre innholdet i en variabel, mens programmet kjører? Lenke til kommentar
A_N_K Skrevet 19. mai 2005 Del Skrevet 19. mai 2005 Denne gjør ingenting annet enn å inkrementere i: for (i = 0; i < OBJECTS; i++); Hvis jeg forsto deg riktig var du også interessert i å fange feilaktig minneaksess, bruk Valgrind til dette. For å endre verdier under kjøring i gdb: 'help set'. Lenke til kommentar
kyrsjo Skrevet 20. mai 2005 Forfatter Del Skrevet 20. mai 2005 Denne gjør ingenting annet enn å inkrementere i: for (i = 0; i < OBJECTS; i++); Hvis jeg forsto deg riktig var du også interessert i å fange feilaktig minneaksess, bruk Valgrind til dette. For å endre verdier under kjøring i gdb: 'help set'. Ok - så det er det valgrind er til. Greit å vite Men: om du ser på koden samt utsnittet fra gdb, så skulle den jo sette i = 0, kjøre igjennom en gang, sjekke, inkrementere, kjøre, sjekke, inkrementere osv. Problemet er at i = 2 både før og etter.... Lenke til kommentar
kyrsjo Skrevet 20. mai 2005 Forfatter Del Skrevet 20. mai 2005 HaGRRRRR!!! Fant feilen: for (i = 0; i < OBJECTS; i++); for (;;; [/code] for skal da ikke ha ; men {}!!! GRR synes alvorlig talt gcc burde gitt en warning her... Lenke til kommentar
A_N_K Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 Det var jo akkurat det jeg påpekte. Dessuten er det fullt gyldig C hihi. Lenke til kommentar
kyrsjo Skrevet 20. mai 2005 Forfatter Del Skrevet 20. mai 2005 ja ser jo det... "gyldig" c my ass! Hadde en greie hvor programmet "krasjet" - viste seg å skyldes en while (et-eller annet); - men den så jeg lettere (det ble en uendelig løkke. Lenke til kommentar
A_N_K Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 (endret) Er det noen som tvinger deg til å skrive C? Det har tross alt vært med oss noen år. Endret 20. mai 2005 av A_N_K Lenke til kommentar
kyrsjo Skrevet 20. mai 2005 Forfatter Del Skrevet 20. mai 2005 Nei, det er ingen som tvinger meg til å skrive C. Men generellt sett synes jeg det er et fint språk uten alt for mye rot rundt. Har ikke hatt noen store behov for klasser etc. hittill. Synes likevel gcc burde gitt meg en warning med -Wall skrudd på for en så idiotisk og opplagt feil... Lenke til kommentar
hishadow Skrevet 20. mai 2005 Del Skrevet 20. mai 2005 Nei, det er ingen som tvinger meg til å skrive C. Men generellt sett synes jeg det er et fint språk uten alt for mye rot rundt. Har ikke hatt noen store behov for klasser etc. hittill. Synes likevel gcc burde gitt meg en warning med -Wall skrudd på for en så idiotisk og opplagt feil... Kjekt å kunne når kompleksiteten til programmene dine begynner å stige. Lenke til kommentar
kyrsjo Skrevet 20. mai 2005 Forfatter Del Skrevet 20. mai 2005 Nei, det er ingen som tvinger meg til å skrive C. Men generellt sett synes jeg det er et fint språk uten alt for mye rot rundt. Har ikke hatt noen store behov for klasser etc. hittill. Synes likevel gcc burde gitt meg en warning med -Wall skrudd på for en så idiotisk og opplagt feil... Kjekt å kunne når kompleksiteten til programmene dine begynner å stige. mulig. Begynner å få lyst til å lære meg python skikkelig, samt finne ut hvordan man skriver python-moduler i C. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå