Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] perfezionamento free.

    Rieccomi...

    Ho il seguente problema: devo eliminare di volta in volta un elemento della lista inserito in precendenza, liberando la memeria con una free..

    Ho sviluppato il seguente codice:

    codice:
    void pop(M_player *ptop, F_player *B){
        dbPRINT(ptop,B);
    
        M_player *ptmp=ptop,*A=ptop,*ptFREE=ptop;
    
        int tmp;
        scanf("%d",&tmp);
    
        while (ptFREE->id!=tmp){
          ptmp=ptFREE;
          ptFREE=ptmp->next;
        }
        ptmp->next=ptFREE->next;
        free (ptFREE);
    
    dbPRINT(A,B);
    }
    Brevemente...le dbprint sono due funzioni che printano il contenuto della lista prima e dopo.
    Il codice implementato funziona, in quanto effettivamente elimina correttamente gli elementi che acquisisco da tastiera con la scanf.

    IL BUG si verifica quando si chiede di eliminare il primo elemento della lista...NON LO ELIMINA.

    IDEE??? please?

  2. #2
    se richiedi di eliminare il nodo 1 allora ptmp rimane uguale a ptop (o A). Non puoi quindi stampare il contenuto di A in quanto non esiste + visto che hai liberato lo spazio a cui puntava. Dovresti quindi far puntare ptop (o A) al nodo 2

  3. #3

  4. #4
    Originariamente inviato da Luciano79
    se richiedi di eliminare il nodo 1 allora ptmp rimane uguale a ptop (o A). Non puoi quindi stampare il contenuto di A in quanto non esiste + visto che hai liberato lo spazio a cui puntava. Dovresti quindi far puntare ptop (o A) al nodo 2
    Ciao...
    Ho pensato di prevedere un caso nel quale si deve eliminare l'elemento che sta in testa, ma cazzo non capisco perche non funziona, il problema è sempre lo stesso! La free non fa il suo lavoro in quanto l'elemento in testa che dovrebbe essere eliminato rimane li!!

    codice:
    void pop(M_player *ptop, F_player *B){
        dbPRINT(ptop,B);
    
        M_player *ptmp=ptop,*A=ptop,*ptFREE=ptop;
    
        int tmp;
        scanf("%d",&tmp);
    
    
        if(ptFREE->id==tmp){
            ptFREE=ptmp;
            ptmp=ptFREE->next;
            printf("----> CANCELLA ELEMENTO DI TESTA: %d, NUOVA TESTA: %d",ptFREE->id, ptmp->id);
        }else{
            while (ptFREE->id!=tmp){
                ptmp=ptFREE;
                ptFREE=ptmp->next;
            }
            ptmp->next=ptFREE->next;
         }
        free (ptFREE);
        
    dbPRINT(A,B);
    }
    MI manca la risoluzione di questo problema per la terminazione del programma d'esame..non ci più nulla

  5. #5
    aggiungi prima della printf
    A=ptmp;

  6. #6
    Originariamente inviato da Luciano79
    aggiungi prima della printf
    A=ptmp;
    Ma cosi non risolvo il problema..faccio la stampa dal secondo elemento inceve che dal primo???? qst codice devo implementarlo in una funzione ben piu complessa..

  7. #7
    + o -.
    Non fai vedere semplicemente il secondo, fai vedere quello che prima era secondo e che poi è diventato primo. La "free" non pulisce tutti i byte, semplicemente dealloca uno spazio allocato in precedenza, ma i dati rimangono ancora disponibili in quello spazio.
    Per esempio se cancelli un file non è che vai a pulire il disco byte per byte, semplicemente il filesystem rimuove tutti i puntatori al file, ma i dati rimangono fino a quando quella zona del disco non viene riutilizzata, quindi puoi anche riuscire a leggere i dati del file cancellato.

    Il concetto è lo stesso. Tu deallochi uno spazio (free), ma mantieni un puntatore a quello spazio (A). Fino a quando quello spazio non viene sovrascritto da altri dati puoi vederne il vecchio contenuto. Sei tu che devi preoccuparti di spostare il vecchio puntatore al nuovo indirizzo della lista (che corrisponde al secondo nodo).

    Ovviamente dovrai aggiornare anche ptop che mi sembra di capire sia la chiave che punta all'inizio della lista.

    Attenzione!!!
    Il problema lo hai anche per l'ultimo nodo, visto che alla funzione passi un puntatore di nome B che da come lo utilizzi sembra puntare all'ultimo della lista. Dovrai aggiornare anche lui nel caso in cui vai ad eliminare l'ultimo nodo.

  8. #8
    Originariamente inviato da Luciano79
    + o -.
    Non fai vedere semplicemente il secondo, fai vedere quello che prima era secondo e che poi è diventato primo. La "free" non pulisce tutti i byte, semplicemente dealloca uno spazio allocato in precedenza, ma i dati rimangono ancora disponibili in quello spazio.
    Per esempio se cancelli un file non è che vai a pulire il disco byte per byte, semplicemente il filesystem rimuove tutti i puntatori al file, ma i dati rimangono fino a quando quella zona del disco non viene riutilizzata, quindi puoi anche riuscire a leggere i dati del file cancellato.

    Il concetto è lo stesso. Tu deallochi uno spazio (free), ma mantieni un puntatore a quello spazio (A). Fino a quando quello spazio non viene sovrascritto da altri dati puoi vederne il vecchio contenuto. Sei tu che devi preoccuparti di spostare il vecchio puntatore al nuovo indirizzo della lista (che corrisponde al secondo nodo).

    Ovviamente dovrai aggiornare anche ptop che mi sembra di capire sia la chiave che punta all'inizio della lista.

    Attenzione!!!
    Il problema lo hai anche per l'ultimo nodo, visto che alla funzione passi un puntatore di nome B che da come lo utilizzi sembra puntare all'ultimo della lista. Dovrai aggiornare anche lui nel caso in cui vai ad eliminare l'ultimo nodo.

    Allora mi spiego meglio:

    Ho due liste...M_player e F_player. vengono create e riempite correttamente (Me ne accerto con le dbPRINT).
    Una terza funzione in base a determinate considerazioni, si occupa di stampare a video una coppia formata da un elemento della lista di M_player e F_player. Quando ho formato la coppia, i due li devo "eliminare dalla lista" altrimenti il resto del mio algoritmo li riaccoppia.

    Quindi pensato di relizzare l'ultimo pezzo della funzione nuova, accertato il funzionamento spostavo il codice nella funzione precendente...

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.