Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: [ c] programma rubrica

  1. #1
    Utente di HTML.it L'avatar di C232
    Registrato dal
    Dec 2004
    Messaggi
    303

    [ c] programma rubrica

    stavo leggendo il programma rubrica e mi sono reso conto che la memoria che viene allocata non viene liberata come mai????
    C/C++

  2. #2
    Mi sto attrezzando, ma la telepatia non rientra ancora tra i miei poteri
    A quale rubrica ti riferisci?

  3. #3
    Utente di HTML.it L'avatar di C232
    Registrato dal
    Dec 2004
    Messaggi
    303

    ...

    quella nella sezione programmazione - c
    C/C++

  4. #4
    Immagino tu ti riferisca a questa, no?

    Vediamo... hai ragione la memoria non viene mai liberata, sia che si elimini un elemento dalla rubrica sia che si termini il programma. La cosa è molto strana... forse chi ha scritto il programma confidava nel fatto che il SO liberi da solo la memoria a fine programma :master:

    La memoria va sempre liberata, almeno per 2 motivi:
    1)Ho detto che il SO dovrebbe liberare la memoria; sfortunatamente non è sempre così. WindowsXp riesce a liberare la memoria usata ma altri SO potrebbero non riuscirci.
    2)Il programma in questione è piccolo e la cosa non si nota, ma se si continua ad allocare e non si libera mai varie "stranezze" o crash potrebbero accadere.

    La cosa cmq è curiosa... spero che qualcuno sappia dare qualche altra delucidazione.

  5. #5
    Utente di HTML.it L'avatar di C232
    Registrato dal
    Dec 2004
    Messaggi
    303

    ...

    un altro piccolo dubbio...
    con la funzione visualizzaContatto io scorro tutta la lista, come faccio a ritornare al punto di partenza?

    codice:
    void visualizzaContatto(struct elemento* p)
    149     { // visualizzaContatto() - OPEN
    150     
    151       if (p == NULL)
    152       { // IF - OPEN
    153     
    154         /*
    155          * Se non ci sono contatti lo stampo a video
    156          */
    157         system(pulisci); // PULISCE LO SCHERMO
    158         printf (" #######################\n");
    159         printf (" # RUBRICA EASY v1.0   #\n");
    160         printf (" #######################\n");
    161         printf (" # VISUALIZZA CONTATTO #\n");
    162         printf (" #######################\n\n");
    163         printf (" Nessun contatto presente\n");
    164         pausa();
    165     
    166       } else { // ELSE
    167     
    168         /*
    169          * Stampo il primo contatto presente
    170          */
    171         system(pulisci); // PULISCE LO SCHERMO
    172         printf (" #######################\n");
    173         printf (" # RUBRICA EASY v1.0   #\n");
    174         printf (" #######################\n");
    175         printf (" # VISUALIZZA CONTATTO #\n");
    176         printf (" #######################\n\n");
    177         printf (" NOME > %s\n", p->inf.nome);
    178         printf (" COGNOME > %s\n", p->inf.cognome);
    179         printf (" TELEFONO > %s\n", p->inf.telefono);
    180         printf (" EMAIL > %s\n", p->inf.email);
    181         printf (" SITOWEB > %s\n", p->inf.sitoweb);
    182         pausa();
    183     
    184       } // IF - CLOSE
    185     
    186       while (p != NULL)
    187       { // WHILE - OPEN
    188     
    189         /*
    190          * Stampo gli altri contatti
    191          */
    192         system(pulisci); // PULISCE LO SCHERMO
    193         printf (" #######################\n");
    194         printf (" # RUBRICA EASY v1.0   #\n");
    195         printf (" #######################\n");
    196         printf (" # VISUALIZZA CONTATTO #\n");
    197         printf (" #######################\n\n");
    198         printf (" NOME > %s\n", p->inf.nome);
    199         printf (" COGNOME > %s\n", p->inf.cognome);
    200         printf (" TELEFONO > %s\n", p->inf.telefono);
    201         printf (" EMAIL > %s\n", p->inf.email);
    202         printf (" SITOWEB > %s\n", p->inf.sitoweb);
    203         pausa();
    204         // Leggo l'elemento successivo
    205         p = p->pun;
    206     
    207       } // WHILE - CLOSE
    208     
    209       return;
    210     
    211     } // visualizzaContatto() - CLOSE
    cioé io stampo sempre il successivo, non va modificato?
    const struct elemento *pIniziale=p;

    e alla fine quando la funzione ritorna:

    p=pIniziale;
    C/C++

  6. #6
    Ma il programma funziona?

    Perchè dalla funzione che hai postato ho capito che la lista non è a doppio senso; non c'è modo di tornare indietro una volta che sei arrivato alla fine.

    Praticamente la funzione prende un puntatore e inizia a scorrere finchè la lista non è terminata; il problema è che per forza di cose la funzione ha reso la lista inutilizzabile, in quanto ha reindirizzato il puntatore allo struct verso NULL.

    La funzione dovrebbe salvare all'inizio l'indirizzo del primo elemente della lista e alla fine, quando si è arrivati al NULL, rifar puntare il puntatore passato come argomento a questo primo elemento.

    O direttamente usare il puntatore argomento solo per inizializzare un'altra variabile puntatore, locale alla funzione.

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    il programma funzione perchè gli argomenti sono passati per valore e al termine della funzione la testa della lista non è modificata.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  8. #8
    Vero, mi scuso.

    Invece il problema della memoria che non viene mai liberata c'è, no?

  9. #9
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da gandalf45
    Vero, mi scuso.

    Invece il problema della memoria che non viene mai liberata c'è, no?
    se non viene liberata è sicuramente un errore perche non bisogna assumere che venga liberata automaticamente.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  10. #10
    Utente di HTML.it L'avatar di C232
    Registrato dal
    Dec 2004
    Messaggi
    303

    ...

    aspetta alla funzione visualizzaContatto viene passato un puntatore della struttura lista e non il suo valore! Infatti si usa la sintassi -> per deferenziare.
    C/C++

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 © 2025 vBulletin Solutions, Inc. All rights reserved.