Inizializzazione

di il
15 risposte

Inizializzazione

Buonasera, quando dichiaro un contatore, un array o un elemento numerico a inizio programma devo sempre e necessariamente inizializzarlo a 0??
E nel caso specifico di un array, se monodimensionale inizializzo come "vet[dim]={0}" , se invece devo inizializzare un array bidimensionale come faccio??

15 Risposte

  • Re: Inizializzazione

    Regola FONDAMENTALE: in C/C++

    INIZIALIZZA SEMPRE TUTTE le variabili ANCHE SE potrebbe non servire.

    I motivi sono diversi:

    1) SE inizializzi la variabile, SAI PER CERTO che cosa contiene
    2) SE inizializzi una variabile a cui non servirebbe l'inizializzazione, va bene lo stesso perche' ORA non serve, ma se un domani modifichi il codice, la variabile potrebbe essere usata PRIMA di essere assegnata. Non sai mai quando/dove/perche' modificherai il codice in futuro
    3) SE non la inizializzi, il codice potrebbe funzionare lo stesso ma funzionerebbe PER SBAGLIO.
    Ad esempio: sul TUO pc una variabile non inizializzata vale ZERO e i tuo codice funziona corettamente.
    Fai girare lo STESSO codice sul PC di un'altro, e l'applicazione schianta. Per trovare l'errore ci puoi mettere anche MESI.
    4) inizializzare una variabile e' un'operazione che viene eseguita in microsecondi o anche meno.
    Quindi dovresti inizializzare UN MILIARDO DI VARIABILI per perdere UN SECONDO.
    Assolutamente trascurabile per le applicazioni di esercizio.

    Problemi di performance in un'applicazione di QUALUNQUE tipo NON SONO MAI legate ad assegnamenti fatti a variabili a cui non servirebbe.
  • Re: Inizializzazione

    migliorabile ha scritto:


    Regola FONDAMENTALE: in C/C++

    INIZIALIZZA SEMPRE TUTTE le variabili ANCHE SE potrebbe non servire.

    I motivi sono diversi:

    1) SE inizializzi la variabile, SAI PER CERTO che cosa contiene
    2) SE inizializzi una variabile a cui non servirebbe l'inizializzazione, va bene lo stesso perche' ORA non serve, ma se un domani modifichi il codice, la variabile potrebbe essere usata PRIMA di essere assegnata. Non sai mai quando/dove/perche' modificherai il codice in futuro
    3) SE non la inizializzi, il codice potrebbe funzionare lo stesso ma funzionerebbe PER SBAGLIO.
    Ad esempio: sul TUO pc una variabile non inizializzata vale ZERO e i tuo codice funziona corettamente.
    Fai girare lo STESSO codice sul PC di un'altro, e l'applicazione schianta. Per trovare l'errore ci puoi mettere anche MESI.
    4) inizializzare una variabile e' un'operazione che viene eseguita in microsecondi o anche meno.
    Quindi dovresti inizializzare UN MILIARDO DI VARIABILI per perdere UN SECONDO.
    Assolutamente trascurabile per le applicazioni di esercizio.

    Problemi di performance in un'applicazione di QUALUNQUE tipo NON SONO MAI legate ad assegnamenti fatti a variabili a cui non servirebbe.
    Ok grazie mille spiegazione esaustiva.
    Per inizializzare array bidimensionale come faccio???
  • Re: Inizializzazione

    Nota; NON SERVE quotare tutto il post. E' gia' scritto. Quoti eventualmente solo la frase su cui vuoi fare un'osservazione specifica.

    Ci sono molti modi.
    Usa pure il piu' semplice: scansione dell'array bidimensionale (o ""matrice"") ed inizializzazione di ogni cella.
    Lo stesso vale per gli array monodimensionali.

    Scrivere

    (A)
    
    int v[100]={0};
    
    e' corretto, MA scrivere

    (B)
    
    int v[100];
    for (int i=0;i<100; ++i) v[i] = 0;
    
    va bene lo stesso perche' (piu' o meno) e' quello che fa il compilatore al posto tuo quando scrivi (A).
    (non e' esattamente cosi', MA la realta' non e' molto lontana )
  • Re: Inizializzazione

    Puoi usare direttamente anche un memset, tipicamente molto più veloce.
    E' un approccio più stile C che C++, ma praticamente sempre (diciamo meglio molto spesso) i due
    mondi sono "fusi".

    Come si fa per gli array bidimensionali?
    Con due cicli
    
    for (int riga=0;riga<qualcosa;riga++)
      for (int colonna=0;colonna<qualcosa;colonna++)
         matrice[riga][colonna]=0;
    
    Poi ci sono 7000 variazioni sul tema, ovvero se la matrice è memorizzata per righe o colonne avrai tempi diversi per la cache della CPU, puoi usare puntatori invece di indici, puoi usare memset (cosa più probabile), puoi
    usare strutture più complesse del C++ (dove tipicamente avrai i metodi .size()), insomma son tanti i modi.
    Cambia poco per dimensioni modeste, cioè diventa importante quando la matrice è grande e richiede un tempo cospicuo per essere inizializzata (raramente capita nel mondo reale)

    Comunque confermo pienamente il consiglio di inizializzare sempre e comunque.
    Per la verità ++i è un vezzo inutile in questo caso rispetto a i++
  • Re: Inizializzazione

    +m2+ ha scritto:


    Per la verità ++i è un vezzo inutile in questo caso rispetto a i++
    Magari sarà pure un vezzo, nel senso che a livello di efficienza non cambia praticamente quasi nulla (anche se formalmente può essere utile in quanto esplicita il nostro intento), ma sinceramente non capisco perché mettere in risalto questa questione...
  • Re: Inizializzazione

    migliorabile ha scritto:


    Bene grazie mille per la spiegazione.
  • Re: Inizializzazione

    +m2+ ha scritto:


    Puoi usare direttamente anche un memset, tipicamente molto più veloce.
    E' un approccio più stile C che C++, ma praticamente sempre (diciamo meglio molto spesso) i due
    mondi sono "fusi".

    Come si fa per gli array bidimensionali?
    Con due cicli
    
    for (int riga=0;riga<qualcosa;riga++)
      for (int colonna=0;colonna<qualcosa;colonna++)
         matrice[riga][colonna]=0;
    
    Al posto dei cicli scrivere solo:
    
    Matrice[riga][colonna]=0 
    
    Sarebbe un modo sbagliato di inizializzarla?
  • Re: Inizializzazione

    Infatti, ""memset"" e' un'altro modo per impostare un blocco di memoria contigua ad un valore predefinito (tipicamente 0).

    MA

    ""memset"" va usato con ""cognizione di causa""

    1) l'array multidimensionale DEVE essere composto da memoria contigua, NON da un array di array, ad esempio
    2) deve essere possibile ottenere la dimensione del blocco di memoria, mediante sizeof dell'intero array multidimensionale OPPURE del singolo elemento, moltiplicandolo per il numero di elementi
    3) va bene se si deve impostare TUTTO a 0, molto meno se si deve inizializzare l'array multidimensionale con valori DIVERSI da 0.

    In pratica, se si e' alle prime armi, il classico ciclo ""insegna di piu' ""
  • Re: Inizializzazione

    Crist001 ha scritto:



    Al posto dei cicli scrivere solo:
    
    Matrice[riga][colonna]=0 
    
    Sarebbe un modo sbagliato di inizializzarla?
    Forse va scritto:
    
    Int Matrice[riga][colonna]={0};
    
    Che tutto il resto della matrice sia inizializzata a zero è garantito dallo standard
    E non serve per array globali, anche questo garantito dallo standard
    Memset memcopy for e similia non servono
    Sono utili per inizializzazione non nulle, ma solo quello
  • Re: Inizializzazione

    Nippolo ha scritto:


    +m2+ ha scritto:


    Per la verità ++i è un vezzo inutile in questo caso rispetto a i++
    Magari sarà pure un vezzo, nel senso che a livello di efficienza non cambia praticamente quasi nulla (anche se formalmente può essere utile in quanto esplicita il nostro intento), ma sinceramente non capisco perché mettere in risalto questa questione...
    Non è che non cambia praticamente nulla, è che non cambia PROPRIO nulla (in questo caso).
    Perchè metterla il risalto? Qui si aprirebbe uno spiegone-flammone che parte dalle primissime versioni di C, ma non ho una gran voglia di farlo, tantomeno sugli iteratori e il rischio di copia.

    Chi sa, sa.
    Chi non sa... non sa e magari non capirebbe.
  • Re: Inizializzazione

    Riguardo all'uso degli aggregati starei attento, perchè è C++, non C
    Come ho già spiegato quasi sempre c'è un "mischione" dei due.
    Comunque lo spiegone
  • Re: Inizializzazione

    +m2+ ha scritto:


    Non è che non cambia praticamente nulla, è che non cambia PROPRIO nulla (in questo caso).
    Perchè metterla il risalto? Qui si aprirebbe uno spiegone-flammone che parte dalle primissime versioni di C, ma non ho una gran voglia di farlo, tantomeno sugli iteratori e il rischio di copia.

    Chi sa, sa.
    Chi non sa... non sa e magari non capirebbe.
    Che stile!
  • Re: Inizializzazione

    +m2+ ha scritto:


    Nippolo ha scritto:


    +m2+ ha scritto:


    Per la verità ++i è un vezzo inutile in questo caso rispetto a i++
    Chi sa, sa.
    Chi non sa... non sa e magari non capirebbe.
    Tutti questi commenti mi hanno confuso, quindi per inizializzare l’array bidimensionale utilizzo il ciclo for o basta porre l’array uguale a {0}
  • Re: Inizializzazione

    Crist001 ha scritto:


    Tutti questi commenti mi hanno confuso, quindi per inizializzare l’array bidimensionale utilizzo il ciclo for o basta porre l’array uguale a {0}
    Te la metto così
    
    int matrice[10][10]={27};
    	for (int riga=0;riga<10;riga++)
    		for (int colonna=0;colonna<10;colonna++)
    			printf("Riga %d Colonna %d Valore %d\n",riga,colonna,matrice[riga][colonna]);
    
Devi accedere o registrarti per scrivere nel forum
15 risposte