Oppure

Loading
24/11/09 17:58
zaire90
Salve
avrei da chiarire una cosa sull'uso degli array. In un codice dove devo inserire i coefficenti di un polinomio di grado n, se facessi il ciclo for che va da i=0 a i<n, non li inserirei tutti ma arriverei fino ad n-1.

ES. n=4 e il polinomio che voglio inserire è 2+3x-x^2+3x^3-2x^4:
inserisco p[0]=2 p[1]=3 p[2]=-1 p[3]=3

quindi dovrò poi inserire anche l'ultimo coefficente cioè p[4]=-2 in questo modo:
for (i=0;i<n;i++)
        {                            
           printf("\np[%d] = ",i);
           scanf("%f",&p[i]);
        }
printf("\np[%d] = ",n);
scanf("%d",&p[n]);


Ma non potrei risolvere il problema semplicemente mettendo "i<=n" nel ciclo for, oppure in questo modo corrompo qualcosa o uso in modo illecito l'array:-?
Ultima modifica effettuata da zaire90 24/11/09 17:59
aaa
24/11/09 18:43
TheKaneB
Ciao,

in C gli array sono indicizzati a partire da zero.
Questo significa che dichiarando
int arrayEsempio[4];


avrai tutti e 4 i tuoi elementi, a partire da 0 fino a 3.

Nel tuo caso avrai i 4 coefficienti, ma il loro "ordine" sarà abbassato di 1 secondo la seguente, semplice, regola:
int arrayEsempio[4];
int c1, c2, c3, c4;
arrayEsempio[0] = c1; /* Primo coefficiente */
arrayEsempio[1] = c2;
arrayEsempio[2] = c3;
arrayEsempio[3] = c4; /* Ultimo coefficiente, n-1 */


Quindi, in sostanza, con il seguente codice:
for (i=0; i<n; i++)
{
    printf("%d ", arrayEsempio[i]);
}

otterrai esattamente i 4 coefficienti, da 0 a 3. Nulla viene perso in questi passaggi!

Se invece tu volessi mettere <= n, oppure volessi accedere direttamente a arrayEsempio[n], andresti a leggere/scrivere su una cella di memoria che non è stata allocata all'interno dell'array. Nel caso migliore andrai a modificare un valore appartenente ad un'altra variabile, nel caso peggiore potresti uscire fuori dal segmento di memoria associato al processo (Segmentation Fault), oppure potresti corrompere delle strutture vitali per l'applicazione (come la lista delle allocazioni di memoria, per esempio), generando quindi una situazione inconsistente; nel primo caso il programma è destinato a crashare, nel secondo potrebbe anche non crashare subito, ma sarebbe fonte di problemi o crash in punti casuali del codice.

Se hai problemi a comprendere questi meccanismi, prova prima a studiare un linguaggio memory safe (come il C# o il Java) e poi a tornare al C che, per quanto riguarda la gestione della memoria, è fin troppo flessibile e permissivo.

Ciao!
aaa
24/11/09 20:25
Matthew
Basta che allochi un elemento in piu' nell'array e poi puoi aggiungere un giro all'interno del ciclo. Pero' se allochi solo 4 elementi e poi scrivi 5 valori, come dice TheKaneB, avrai dei problemi. In qualsiasi modo scrivi nell'array.
aaa