Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] Problemi con liste

  1. #1

    Problemi programma C liste

    Non so se sia il forum giusto, ma ho dei problemi con un programma sulle liste in C !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. Chiunque possa aiutarmi è ben accetto!!! Grazie guys... :maLOL:

  2. #2
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    non mi sembra sia passato by ref come dici tu

    dei passare &pol_testa per "simulare" il passaggio per riferimento...
    in C non è contemplato il riferimento, solo passaggio per valore!!!
    ...
    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  3. #3

    Ma... :master:

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

  4. #4
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061

    Re: Ma... :master:

    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 :master: , non faccio il figo.
    studio.
    mi informo
    e cerco di aiutare le persone che lo chiedono educatamente
    chiaro??
    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  5. #5

    Misunderstanding

    Ma figurati se mi riferivo a te , era una specie di battuta visto che il nostro prof. parlava sempre di deferenziamento e io e un mio compagno ci guardavamo spersi VVoVe: !! Hai completamente frainteso, figurati un po' se io vado a prendere in giro qualcuno dopo che gli ho chiesto un aiuto!
    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...

  6. #6
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    niente tranquillo...
    ho frainteso...scusa

    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")...

    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

    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.