RISOLTO [C] Stampa valori da array

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Utente Attivo
Messaggi
193
Reazioni
15
Punteggio
43
Ciao, sono sempre qui con la programmazione.
Questo programma deve salvare dati in un array e stamparli. Perché quando stampo oltre ai numeri che metto nell'array mette anche altri numeri? Dov'é l'errore?
Grazie!


C:
#include <stdio.h>

int main()

{
    int voto, arrayVoti[15],i;

    printf("Inserisci i voti di cui si voglia conoscere il corrispettivo in lettere\nZero per arrestare il programma.\n");

    scanf("%d", &voto);

    while(voto!=0)
        {
            arrayVoti[i]=voto;
            i++;
            scanf("%d", &voto);
        }


    for(i=0;i<15;i++)
    {
        printf("%d", arrayVoti[i]);
    }

    return(0);

}
 
Perché quando stampo oltre ai numeri che metto nell'array mette anche altri numeri? Dov'é l'errore?
perché inizializzando un array di 15 elementi ci sono 15 numeri nell'array ?
poi, in base al compilatore, ci possono essere numeri casuali oppure degli 0, mentre man mano che inserisci voti popoli l'array;
quando fai la stampa finale stampi sempre 15 numeri anche se magari hai inserito 2 voti
Ci sono altri piccoli errori:
  • ricordati di inizializzare i a zero (i=0;) all'inizio, perché se non lo fai in teoria il compilatore potrebbe metterci un numero a caso;
  • nella condizione del while aggiungi && i<15 --> questo ti garantisce che non andrai fuori dal range dell'array. Ancora meglio sarebbe definire una costante N e arrayVoti[N], facendo diventare la condizione && i<N
  • nota che il valore di i finale è l'ultima posizione senza voto quindi il for della stampa finale deve essere limitato al valore di i raggiunto escluso l'ultimo, osso dovresti fare for(j=0; j<i; j++)
In questo modo stampi solo i voti realmente inseriti
 
Grazie infinite!!
--- i due messaggi sono stati uniti ---

Quindi in pratica dovevo semplicemente mettere j<i nel for invece che minore di N...
Sti maledetti array, arghh!!

Diciamo di si, ma come diceva BAT non è sufficiente.
L'errore grave è che non hai inizializzato la variabile i, che avrà sicuramente un valore casuale. Più precisamente non è un valore random, ma trattandosi di una variabile sullo stack, avrà un valore "sporco", che è il valore memorizzato in quella locazione negli accessi precedenti.
Detto con altre parole: l'indirizzo della variabile 'i' prima di essere utilizzato per contenere il valore di i, è utilizzato per altre operazioni e contiene quindi un altro valore.

Infatti se lanci il tuo programma, correggendo prima il for come diceva BAT, vedrai comunque un output sbagliato (esempio):
Codice:
Inserisci i voti di cui si voglia conoscere il corrispettivo in lettere
Zero per arrestare il programma.
67
68
90
0
-110420224635664841987620676890

Andando a inizializzare a 0:
Codice:
Inserisci i voti di cui si voglia conoscere il corrispettivo in lettere
Zero per arrestare il programma.
20
10
430
0
2010430

che sono i valori inseriti. ?

I numeri sbagliati ti escono perchè i ha quindi un valore diverso, qui da debugger vedo 21, che viene usato come indice per il primo elemento e che ad ogni ciclo viene incrementato.
Per questo stampando con il for vedi numeri casuali: vai a leggere posizioni dell'array alle quali non hai assegnato nulla (quindi leggi il dato che si trova, anche qui, sullo stack in quella posizione).

L'ho tirata un pò lunga come spiegazione, ho cercato di essere il più chiaro possibile evitando tecnicismi, in caso chiedi pure.
 
Diciamo di si, ma come diceva BAT non è sufficiente.
L'errore grave è che non hai inizializzato la variabile i, che avrà sicuramente un valore casuale. Più precisamente non è un valore random, ma trattandosi di una variabile sullo stack, avrà un valore "sporco", che è il valore memorizzato in quella locazione negli accessi precedenti.
Detto con altre parole: l'indirizzo della variabile 'i' prima di essere utilizzato per contenere il valore di i, è utilizzato per altre operazioni e contiene quindi un altro valore.

Infatti se lanci il tuo programma, correggendo prima il for come diceva BAT, vedrai comunque un output sbagliato (esempio):
Codice:
Inserisci i voti di cui si voglia conoscere il corrispettivo in lettere
Zero per arrestare il programma.
67
68
90
0
-110420224635664841987620676890

Andando a inizializzare a 0:
Codice:
Inserisci i voti di cui si voglia conoscere il corrispettivo in lettere
Zero per arrestare il programma.
20
10
430
0
2010430

che sono i valori inseriti. ?

I numeri sbagliati ti escono perchè i ha quindi un valore diverso, qui da debugger vedo 21, che viene usato come indice per il primo elemento e che ad ogni ciclo viene incrementato.
Per questo stampando con il for vedi numeri casuali: vai a leggere posizioni dell'array alle quali non hai assegnato nulla (quindi leggi il dato che si trova, anche qui, sullo stack in quella posizione).

L'ho tirata un pò lunga come spiegazione, ho cercato di essere il più chiaro possibile evitando tecnicismi, in caso chiedi pure.
Ho capito, sei stato chiaro, grazie!!
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top