PDA

View Full Version : [C] liste e funzioni


diego86
29-02-2008, 13:22
Ho un problema con le funzioni di inserimento in una lista ordinata.
Devo inserire in una lista di assex vuota, una lista di asse y vuota alla quale assegnerò una biglia. Il problema è che il tutto funziona, assegno la biglia, ma poi tornando alla funzione chiamante, il puntatore alla nuova struttura rimane NULL.

void inseriscix(struct assex *pl, int x, int y, struct biglia *b)
{ if(pl==NULL) {
pl=malloc(sizeof(struct assex));
(*pl).x=x;
(*pl).nextx=NULL;
(*pl).nexty=NULL;
inserisciy((*pl).nexty,x,y,b);
return;
}
}

void inserisciy(struct assey *pl, int e, int z, struct biglia *b)
{ if(pl==NULL) {
pl=malloc(sizeof(struct assey));
(*pl).x=e;
(*pl).y=z;
(*pl).nexty=NULL;
(*pl).b=b;
return;
}
}

Quindi inseriscix richiama inserisciy che assegna correttamente la biglia (ho verificato con il debug), ma quando ritorna il comando a inseriscix, mi da che (*pl).nexty = NULL invece che puntare all'indirizzo della nuova struttura creata dalla funzione inserisciy.
Lo stesso problema lo riscontro nel ritorno da inseriscix al main.
dov'è l'errore? grazie..

cionci
29-02-2008, 15:00
Leggi qui:
http://www.hwupgrade.it/forum/showpost.php?p=21292328&postcount=3
Ti trovi davanti alla stessa situazione, il valore assegnato a pl, in entrambi i casi, viene perso perché hai passato il puntatore pl per valore. O passi pl per indirizzo o ritorni pl alla fine della funzione.

Attenzione: (*pl).x equivale a pl->x

diego86
29-02-2008, 15:24
struct assey* inserisciy(struct assey *pl, int e, int z, struct biglia *b)
{ if(pl==NULL) {
pl=malloc(sizeof(struct assey));
(*pl).x=e;
(*pl).y=z;
(*pl).nexty=NULL;
(*pl).b=b;
return pl;
}
}

perchè non funziona nemmeno così?? :(

cionci
29-02-2008, 15:29
Come hai richiamato quella funzione ?

diego86
29-02-2008, 15:45
void inseriscix(struct assex *pl, int x, int y, struct biglia *b)
{ if(pl==NULL) {
pl=malloc(sizeof(struct assex));
(*pl).x=x;
(*pl).nextx=NULL;
(*pl).nexty=NULL;
(*pl).nexty=inserisciy((*pl).nexty,x,y,b);
return;
}
}

cionci
29-02-2008, 15:52
La stessa cosa la devi fare anche per inseriscix, altirmenti il chiamante non trova pl modificato ;)

diego86
29-02-2008, 15:55
si ma con questo codice, all'interno di inseriscix, al termine della funzione mi da che pl contiene la x corretta e due puntatori a null...
quello a nextx giustamente, ma quello a nexty (viste le modifiche di inserisciy) dovrebbe essere diverso da null..

ho riprovato e funziona... :) grazie mille...adesso modifico anche inserisci x per il ritorno al main...speriamo tutto bene