Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-04-2010, 18:24   #1
badboy-j
Member
 
Iscritto dal: Jan 2008
Messaggi: 107
Problema variabile in C

Salve, la mia domanda è semplice e per molti di voi sembrerà deficiente:


Quote:
#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?
badboy-j è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2010, 19:02   #2
Darecon
Senior Member
 
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
Va che a me non si modifica niente., 0 era prima e 0 rimane dopo..

Minigw su wxp 32 bit..
Darecon è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2010, 19:05   #3
badboy-j
Member
 
Iscritto dal: Jan 2008
Messaggi: 107
perchè allora a me da sempre dei valori diversi??? Il primo è sempre 0 e l'altro cambia sempre, tipo 27, 32, 30... uso Ubuntu...
badboy-j è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2010, 20:45   #4
lupoxxx87
Senior Member
 
Iscritto dal: Jul 2009
Città: Varès
Messaggi: 658
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
lupoxxx87 è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2010, 20:58   #5
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2789
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).
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2010, 21:03   #6
Teo@Unix
Senior Member
 
L'Avatar di Teo@Unix
 
Iscritto dal: Mar 2009
Messaggi: 753
ma il debug cosa dice? Debuggando trovi il problema, se c'è un problema...
Teo@Unix è offline   Rispondi citando il messaggio o parte di esso
Old 25-04-2010, 21:06   #7
CountDown_0
Senior Member
 
Iscritto dal: Dec 2004
Città: Milano
Messaggi: 331
Attento, l'istruzione
Quote:
(1+rand()%6)
genera un risultato da 1 a 6, perché rand()%6 è tra 0 e 5. Quindi se hai che
Quote:
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.
__________________
Elrond sul forum di TGM
CountDown_0 è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2010, 09:29   #8
badboy-j
Member
 
Iscritto dal: Jan 2008
Messaggi: 107
Quote:
Originariamente inviato da CountDown_0 Guarda i messaggi
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!
badboy-j è offline   Rispondi citando il messaggio o parte di esso
Old 26-04-2010, 09:41   #9
CountDown_0
Senior Member
 
Iscritto dal: Dec 2004
Città: Milano
Messaggi: 331
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!
__________________
Elrond sul forum di TGM
CountDown_0 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Voyager Technologies ha siglato un accor...
GoPro annuncia la linea MISSION 1 con tr...
Alcune varianti dei futuri Samsung Galax...
Il ridimensionamento di OnePlus in Europ...
Il cofondatore di Netflix ha lasciato l'...
ASUS porta in Italia il nuovo Zenbook Du...
Assassin's Creed: Black Flag Resynced, s...
Xbox Game Pass cambierà: tra le n...
I nuovi Surface Pro e Laptop sono vicini...
OnePlus ci riprova con la fascia bassa: ...
La Top 10 delle offerte Amazon del weeke...
XGIMI MoGo 2 Pro a 339€: Google TV con N...
Forum IT & Intelligence 2026: dall'A...
iPhone 16e per la prima volta a meno di ...
Stop Killing Games: Ross Scott convince ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:58.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v