Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - chiarimento su array
Forum - C/C++ - chiarimento su array

Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 18:58
Martedì, 24/11/2009
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:
Codice sorgente - presumibilmente C/C++

  1. for (i=0;i<n;i++)
  2.         {                            
  3.            printf("\np[%d] = ",i);
  4.            scanf("%f",&p[i]);
  5.         }
  6. printf("\np[%d] = ",n);
  7. 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 il 24/11/2009 alle 18:59
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 19:43
Martedì, 24/11/2009
Ciao,

in C gli array sono indicizzati a partire da zero.
Questo significa che dichiarando
Codice sorgente - presumibilmente C/C++

  1. 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:
Codice sorgente - presumibilmente C/C++

  1. int arrayEsempio[4];
  2. int c1, c2, c3, c4;
  3. arrayEsempio[0] = c1; /* Primo coefficiente */
  4. arrayEsempio[1] = c2;
  5. arrayEsempio[2] = c3;
  6. arrayEsempio[3] = c4; /* Ultimo coefficiente, n-1 */



Quindi, in sostanza, con il seguente codice:
Codice sorgente - presumibilmente C/C++

  1. for (i=0; i<n; i++)
  2. {
  3.     printf("%d ", arrayEsempio[i]);
  4. }


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!

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 21:25
Martedì, 24/11/2009
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.

PM Quote