|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Sep 2014
Messaggi: 4
|
Array e dimensione MAX
Ciao a tutti,
sto imparando le basi del C, ho fatto questo piccolo programmino per imparare gli array. Codice:
#include<stdio.h> int main() { int intero[5], i; for (i=0; i<10; i++) { intero[i]=i; } for (i=0; i<10; i++) { printf("intero[i]: %d\n", intero[i]); } return 0; } |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
"Crocedelizia" del c/c++... lui te lo lascia fare ma il risultato è imprevedibile (probabile crash completo!).
Se vuoi che il compilatore si "accorga" dell'errore cambia linguaggio. |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Sep 2014
Messaggi: 4
|
Non voglio cambiare linguaggio (almeno per ora!
![]() |
![]() |
![]() |
![]() |
#4 | |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
Quote:
Te lo fa fare semplicemente perché non è previsto alcun controllo. Il fatto che il programma possa girare senza produrre alcun errore è del tutto casuale (e insidioso in fase di debug). |
|
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Sep 2014
Messaggi: 4
|
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
Significa che quando il tuo programma andrà in errore (e scrivendo oltre i limiti del dimensionamento dell'array primo o poi accadrà) sarà più ostico trovare l'origine di tale errore: l'insidia sta proprio nel fatto che eseguendo più volte il programma non sempre si ottiene l'errore (è un errore ottenibile a run-time).
Fai qualche test ad esempio dichiarando qualche altro array o scrivendo qualche elemento in più dei 5 aggiuntivi proposti nell'esempio... |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
Prova questo esempio...
Codice:
#include <stdio.h> int main() { int ar1[5], ar2[10], i; for(i = 0; i < 20; ++i) {ar1[i] = i;} for(i = 0; i < 10; ++i) {ar2[i] = i;} for(i = 0; i < 10; ++i) { printf("%d - %d\n",ar1[i], ar2[i]); } return 0; } |
![]() |
![]() |
![]() |
#8 |
Junior Member
Iscritto dal: Sep 2014
Messaggi: 4
|
Ottengo questo
Codice:
0 - 0 1 - 1 2 - 2 3 - 3 4 - 4 5 - 5 6 - 6 7 - 7 8 - 8 9 - 9 Errore di segmentazione |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
si è solo "stressato" maggiormente l'esempio (aggiunto un array, scritto qualche elemento in più...) e, improvvisamente, ciò che prima sembrava funzionare ora non funziona più.
In un esempio così semplice è molto semplice capire l'origine del problema ma, prova a pensare cosa accadrebbe in codice molto più corposo e frazionato. |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
Io ho compilato con GCC abilitando tutti i possibili warnings senza alcun avviso.
Non ho provato con VC. |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
... anche VC 2013 compila senza problemi
Codice:
Impostazioni compilatore C/C++ Livello avvisi : Abilita tutti gli avvisi (/Wall) Considera gli avvisi come errori : Si (/WX) |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Una curiosità: ultimamente vedo spesso l'incremento di i nei cicli utilizzando un preincremento invece di un postincremento... c'è un motivo o è solo cambiata la moda? Immagino la seconda ma sono curioso anche dell'origine di questa moda.
|
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
Non è un moda ma una questione di performance.
il pre-incremento (++i) equivale a: i = i +1il post-incremento (i++) equivale a: tmp = i; //(necessità di conservare il valore prima dell'incremento = valore ritornato) |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Interessante, grazie.
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Quanto scrivi e' vero soprattutto quando si devono manipolare oggetti, in quel caso occorre sicuramente ricorrere implicitamente ad una variabile temporanea
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
Può essere ma si tratta ugualmente di good-practice. I compilatori eseguono comunque una serie di ottimizzazioni più o meno "aggressive" ma una buona codifica iniziale aiuta sempre.
Premesso che la differenza in termini di tempo di esecuzione tra pre-incremento e post-incremento è praticamente trascurabile (almeno nel caso dell'esempio proposto), preferisco ricorrere ad una soluzione piuttosto che l'altra in base alla "logica" necessità. |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
Quote:
In altre parole il linguaggio non asserisce nulla di definitivo e specifico sull'argomento e il compilatore non è tenuto a fare o dire nulla; si suppone che tu in qualità di programmatore C semplicemente non dovresti mai fare nulla di simile . |
|
![]() |
![]() |
![]() |
#18 | |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
Quote:
|
|
![]() |
![]() |
![]() |
#19 | ||
Senior Member
Iscritto dal: Jan 2001
Città: Livorno
Messaggi: 1338
|
Quote:
Quote:
Ma quando lo esegui non sai cosa c'è al di là della quinta locazione di memoria, magari c'è qualcosa che in quel frangente non serve più, per cui anche sovrascrivendola non si hanno errori. Però non c'è garanzia. Diverso è se scrivi i[7]=2; allora il compilatore sa che l'array è al massimo di 5 ma tu stai scrivendo nella 7ma locazione |
||
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Dec 2003
Messaggi: 70
|
Non credo, prova questo
Codice:
int main() { int i[5]; i[7] = 500; printf("%d", i[7]); return 0; } Codice:
x86_64-w64-mingw32-gcc.exe -Wall -pedantic -Wextra -g -Winline -Wunreachable-code -pedantic-errors -pedantic -g -c A:\prova1\main.c -o obj\Debug\main.o x86_64-w64-mingw32-g++.exe -o bin\Debug\prova1.exe obj\Debug\main.o Output file is bin\Debug\prova1.exe with size 125.40 KB Process terminated with status 0 (0 minute(s), 0 second(s)) 0 error(s), 0 warning(s) (0 minute(s), 0 second(s)) credo di avere abilitato tutti i flag relativi ai possibili warning. Il compilatore semplicemente non esegue alcun controllo degli indici poiché, come già stato ben evidenziato, in C (ma anche in C++) ciò non è previsto. Ultima modifica di Silvia2003 : 06-09-2014 alle 07:43. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:26.