RISOLTO [C] Stampa valori da array

Stato
Discussione chiusa ad ulteriori risposte.

Vito-

Utente Attivo
184
14
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);

}
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,944
11,580
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Grazie infinite!!
Post unito automaticamente:


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.
 

Vito-

Utente Attivo
184
14
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!!
 
  • Mi piace
Reazioni: DispatchCode
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili