Implementazione estrazione elemento - liste

di il
2 risposte

Implementazione estrazione elemento - liste

Data la seguente porzione di codice (preso da un libro didattico sul C++ di Domenici/Frosini) che estrae l'elemento 'a' da una lista ma non capisco la ragione per cui la variabile automatica p venga inizializzata a zero.
Secondo me questo puntatore non dovrebbe essere inizializzato ma vorrei avere una vostra opinione, di seguito la mia giustificazione:

se la lista è vuota la funzione termina subito e non utilizza il puntatore p
se la lista non è vuota e non contiene l'elemento 'a' il ciclo iterativo 'for' almeno una volta assegna a 'p' il valore di 'q'
se la lista non è vuota e contiene l'elemento 'a' stesso discorso del punto precedente

p viene utilizzato soltanto nel caso l'elemento estratto non sia in testa e in quel caso il ciclo for ha già provveduto ad assegnargli un valore.


struct elem {
   int inf;
   elem* pun;
};

Bool estrazione(elem *p0, int a)
{
   elem* p=0;

   (for elem* q=p0; q && (q->inf!=a); q=q->pun)
      p=q;
   if (!q) return false; // siamo a fine lista e non abbiamo trovato alcun elemento
   if (q==p0)     // l'elemento cercato è in testa alla lista
      p0=q->pun;
   else 
      p->pun=q->pun;
   delete q;
   return true;
}

2 Risposte

  • Re: Implementazione estrazione elemento - liste

    IMHO non c'è giustificazione che tenga per fare a meno di preinizializzare le variabili a valori certi, anche se dopo vengono loro assegnati valori nel seguito della funzione. Si impiegano 0.3 secondi scarsi a farlo, possono evitare dolorosi crash e/o comportamenti indesiderati.
    Finché hai codice di ordine scolastico la cosa può essere ridicola, ma se un giorno inizierai a scrivere codice "critico", potresti rimpiangere di non aver inizializzato una misera variabile semisconosciuta xyz all'interno di una semi insignificante funzioncina.
    Insomma prendi buone abitudini.
  • Re: Implementazione estrazione elemento - liste

    È comunemente considerata buona norma di programmazione quella di inizializzare a zero, sempre, quei puntatori che non sono assegnati quando dichiarati.

    Prima di tutto perché ci si risparmia di valutare se quel puntatore verrà assegnato prima di essere adoperato, poi perché (ancora più importante) quel codice potrebbe essere modificato da chiunque in un secondo tempo. Malauguratamente, un programma in cui vi sia un puntatore non inizializzato che viene valutato, può fornire comportamenti stocastici, questo perché spesso la memoria sporca contiene tanti zeri, allora il programma funziona anche se non dovrebbe, ma un bel giorno incontra una locazione diversa da zero e va in crash! L'incubo di ogni programmatore perché a quel punto trovare quel banalissimo errore di distrazione costerà tanti dolori. Dunque: inizializzare sempre a zero i puntatori creati senza assegnazione diretta.
Devi accedere o registrarti per scrivere nel forum
2 risposte