View Full Version : Problema variabile in C
badboy-j
25-04-2010, 18:24
Salve, la mia domanda è semplice e per molti di voi sembrerà deficiente:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
srand(time(NULL));
int vet[1000];
int count[12]={0};
int i, x=0;
printf("%d\n", x);
for(i=0; i<1000; i++){
vet[i]= (1+rand()%6) + (1+rand()%6);
count[vet[i]]++;
}
printf("%d\n", x);
return 0;
}
perchè il valore della x cambia dopo il for? Se invece elimino la riga dove modifico il vettore count[] resta invariato. Per quale motivo?
Va che a me non si modifica niente., 0 era prima e 0 rimane dopo.. ;)
Minigw su wxp 32 bit.. ;)
badboy-j
25-04-2010, 19:05
perchè allora a me da sempre dei valori diversi??? Il primo è sempre 0 e l'altro cambia sempre, tipo 27, 32, 30... uso Ubuntu...
lupoxxx87
25-04-2010, 20:45
ma.... a che serve stampare 2 volte un valore inizializzato a 0 prima e dopo un ciclo ?
nemmeno a me modifica nulla...
gcc 4.2 su ubuntu e osx
wingman87
25-04-2010, 20:58
Prova ad inizializzare il vettore count in un altro modo, io quel metodo non l'avevo mai visto (l'avevo visto per inizializzare singolarmente i vari elementi del vettore, e contemporaneamente definirne la quantità, non per inizializzarli tutti).
Teo@Unix
25-04-2010, 21:03
ma il debug cosa dice? Debuggando trovi il problema, se c'è un problema...
CountDown_0
25-04-2010, 21:06
Attento, l'istruzione
(1+rand()%6)
genera un risultato da 1 a 6, perché rand()%6 è tra 0 e 5. Quindi se hai che
vet[i]= (1+rand()%6) + (1+rand()%6);
vet[i] può valere da 2 a 12. Quindi count[0] e count[1] non vengono mai toccati, ma è possibile che venga scritto qualcosa in count[12], che è fuori dai limiti dell'array, perché se ha dimensione 12 vuol dire che va da 0 a 11!
Se non dà un segmentation fault probabilmente è perché l'indirizzo di memoria successivo a rand[11] è usato dallo stesso programma, e probabilmente x va a finire proprio lì e viene sovrascritto in qualche modo. Ecco perché viene modificato. Quelli che non hanno problemi, invece, probabilmente è perché o non è mai uscito il numero 12 sommando i 2 termini casuali (improbabile, avviene con probabilità 1/36, su 1000 numeri dovrebbe capitare un sacco di volte), oppure perché in quell'indirizzo di memoria è stato messo qualcos'altro, e quindi l'errore c'è ma non si vede. Magari viene sovrascritta la i, e quindi il loro ciclo viene eseguito di fatto più o meno di 1000 volte.
badboy-j
26-04-2010, 09:29
vet[i] può valere da 2 a 12. Quindi count[0] e count[1] non vengono mai toccati, ma è possibile che venga scritto qualcosa in count[12], che è fuori dai limiti dell'array, perché se ha dimensione 12 vuol dire che va da 0 a 11!
Se non dà un segmentation fault probabilmente è perché l'indirizzo di memoria successivo a rand[11] è usato dallo stesso programma, e probabilmente x va a finire proprio lì e viene sovrascritto in qualche modo. Ecco perché viene modificato.
Sei un grande!!!!!! Era quello il problema, ma non me n'ero accorto... il valore di vet[12] (che in realtà non esisteva) è lo stesso che mi assegnava ad x. Però non dovrebbe avvertirmi che sta andando a sovrascrivere una porzione di memoria assegnata ad un'altra variabile? Grazie ancora! :D
CountDown_0
26-04-2010, 09:41
Purtroppo no, il C non ti avverte. O l'indirizzo errato è fuori dallo spazio di memoria del programma, e allora interviene il sistema operativo a bloccarti con un segmentation fault, oppure non ti dà nessun errore. Quando si dice che il C è molto potente ma lo scotto da pagare è che è facile sbagliare, si intende proprio questo.
Ciao!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.