Gå til innhold

Merkverdigheter avslørt av gdb...


Anbefalte innlegg

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
Videoannonse
Annonse

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
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

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
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
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...