PDA

Visualizza la versione completa : [C] Problemi con liste


Ivan1985111
03-07-2005, 17:14
Non so se sia il forum giusto, ma ho dei problemi con un programma sulle liste in C :dh: !Lo scrivo qui sotto:

#include<stdio.h>
#include<conio.h>
typedef enum {FALSE,TRUE} boolean;

typedef struct pol_gen
{
int coeff;
int esp;
struct pol_gen *next;
} polinomio;

/*prototipi*/
boolean crea_pol(char[],polinomio);
void calcola_prodotto();
void stampa_prodotto();

/*dichiaro teste delle liste*/
polinomio* polA_testa;
polinomio* polB_testa;
polinomio* polP_testa;

main()
{
char fileA[6];
char fileB[6];
/*clrscr();*/
printf("Calcolo del prodotto tra due polinomi memorizzati su file!\n");
strcpy(fileA,"A.txt");
strcpy(fileB,"B.txt");
if(!((crea_pol(fileA, polA_testa))&&(crea_pol(fileB,polB_testa))))
/*Controllo sulla corretta lettura da file dei due polinomi*/
printf("Impossibile leggere uno dei due polinomi!\n");
/*else
calcola_prodotto();*/
}/*end main*/

boolean crea_pol(char nome_file[6], polinomio *testa)
{
FILE *fp;
boolean lettura_riuscita;
boolean flag;
polinomio *mon_corr;
polinomio *temp;
int coeff=0;
int esp;
if((fp=fopen(nome_file,"r"))==NULL)
lettura_riuscita = FALSE;
else
{
lettura_riuscita = TRUE;
flag = FALSE;
while(flag == FALSE)/*PRIMO ERRORE!!!!*/
{
fscanf(fp,"%d%d",&coeff,&esp);
mon_corr = (polinomio *) malloc (sizeof(polinomio));
mon_corr->coeff = coeff;
mon_corr->esp = esp;
if(testa == NULL)/*Non ci sono ancora elementi nella lista*/
{
if(coeff==0) /*SECONDO ERRORE!!!!*/
flag = TRUE;
testa = mon_corr;
mon_corr->next = NULL;
}/* end if(coeff==0) */
else
{
if(coeff==0)
flag=TRUE;
else
{
temp = testa;
while(temp->next != NULL)
temp = temp->next;
temp->next = mon_corr;
mon_corr->next = NULL;
}
}
}/*end while*/
}/*end if(fp=fopen....)*/
return(lettura_riuscita);
}/*end crea_pol*/


Ecco... Il problema che io passo polA_testa come parametro alla funzione crea_pol, ma nonostante il parametro sia passato by ref, non mi modifica il valore di polA_testa. :bh: Chiunque possa aiutarmi ben accetto!!! Grazie guys... :maLOL:

byaur
04-07-2005, 14:11
non mi sembra sia passato by ref come dici tu :dh: :dh:
:prrr:
dei passare &pol_testa per "simulare" il passaggio per riferimento...
in C non contemplato il riferimento, solo passaggio per valore!!!
...
:messner: :messner:

Ivan1985111
04-07-2005, 14:17
Ma scusa, se io ho dichiarato

polinomio *polA_testa

per passare l'indirizzo (e quindi passare la variabile by ref) non devo togliere l'asterisco (DEREFERENZIARE LA VARIABILE, per fare i fighi)??

byaur
04-07-2005, 20:00
Originariamente inviato da Ivan1985111
Ma scusa, se io ho dichiarato

polinomio *polA_testa

per passare l'indirizzo (e quindi passare la variabile by ref) non devo togliere l'asterisco (DEREFERENZIARE LA VARIABILE, per fare i fighi)??
no...
devi passare &polA_testa alla funzione
e nella dichiarazione della funzione dichiari polinomio **testa...
dopodich per accedere ad un'elemento(e quindi)della struttura fai
(*testa)->esp...

proprio il contrario di cio che dici tu. l'operatore di deferenziamento proprio *... quindi non si toglie...

e, se ti riferivi a me :dh: :master: , non faccio il figo.
studio.
mi informo
e cerco di aiutare le persone che lo chiedono educatamente
chiaro??
:nonono: :nonono:

Ivan1985111
04-07-2005, 20:10
Ma figurati se mi riferivo a te :confused: , era una specie di battuta visto che il nostro prof. parlava sempre di deferenziamento e io e un mio compagno ci guardavamo spersi :oVVoVe: !! Hai completamente frainteso, figurati un po' se io vado a prendere in giro qualcuno dopo che gli ho chiesto un aiuto! :bh:
Sperando di aver chiarito, ora mi potresti spiegare perch devo mettere il doppio asterisco?? Quello non sta ad indicare un vettore di vettori, o qualcosa del genere? Insomma, non riesco a capire qual la logica di dichiarare polA_testa con il doppio asterisco... Io ho sempre risolto tutti i problemi relativi alle liste dichiarando un puntatore alla testa della lista, e il puntatore lo dichiaro con un asterisco solo... Grazie mille... Scusa ancora per l'incomprensione... :fighet:

byaur
05-07-2005, 10:39
niente tranquillo...
ho frainteso...scusa :dh: :dh: :unz:

allora il doppio asterisco...

quando tu passi qualsiasi variabile con il simbolo tipo_variabile &variabile ad una funzione a(), passi proprio l'indirizzo di quella variabile(cio un puntatore, pi o meno)...
quindi la funzione a() dovrebbe essere dichiarata cosi
a(tipo_variabile *var,...) cio deve essere un puntatore a tipo_variabile... poich nel tuo caso tipo_variabile gia un puntatore ad una struttua, se non ricordo male, ti viene fuori il doppio asterisco, o doppio puntatore ....

e quando accedi ad una variabile nella struttura(dentro la funzione), poich stata dichiarata ** devi usare l'operatore di deferenziamento (*var)->var_interna (cio a parole... "risolvo il puntatore a variabile e poi accedo alla struttura sulla variabile interna")... :confused: :confused:

stai attento che i puntatori son cose toste... ci si pu far male a volte...
a me capitavano spesso errori di segmentation fault...

ciao ciao

:ciauz:

Loading