View Full Version : [c] Access Violation
Gandalf_BD
22-06-2004, 19:54
Ciao...
sapreste dirmi come mai, quando eseguo passo passo questo pezzo di codice mi salta fuori un errore di Access Violation?
dov'è che sbaglio?
while(!feof(fPtr)){
fscanf(fPtr,"%s%s%s",data[i][0],data[i][1],data[i][2]);
i++;
in pratica, sto cercando di immagazzinare "pezzi di stringa" direttamente dal file ad na matrice dinamica (data), dichiarata in precedenza, ma sempre nella stessa funzione...
si blocca appena fa la prima fscanf...
il file esiste, lo apre correttamente...
mah... :(
grazie per l'aiuto
Gandalf
Gandalf_BD
22-06-2004, 19:54
dimenticavo... i è stato correttamente inizializzato a zero...
Gogeta ss4
22-06-2004, 20:03
il file è aperto in modalità r ??
Prova a postare tutto il codice(a meno che non sia lunghissimo)
Gandalf_BD
22-06-2004, 20:20
fPtr=fopen("multiplayer.txt","r");
if(fPtr==NULL)
printf("\nFile could not be opened\n");
else{
while(!feof(fPtr)){
m++; //nella matrice
fgets(temp,DIM,fPtr);
}
data=(char**)malloc(m*sizeof(char*));
if(data!=NULL)
for(i=0;i<m;i++)
data[i]=(char*)malloc(5*sizeof(char));
else
printf("\nNo memory available\n");
i=0;
rewind(fPtr);
while(!feof(fPtr)){
fscanf(fPtr,"%s%s%s",data[i][0],data[i][1],data[i][2]);
i++;
}
}
Questo è il codeice, dichiarazioni e return a parte...
data è dichiarata in questo modo--> char **data;
questo è quanto :)
Gandalf
Gandalf_BD
23-06-2004, 13:40
no... :( :( :cry:
Comunque sicuramente quello è sbagliato ;)
Gogeta ss4
23-06-2004, 14:45
nel debug ti da errore nella fscanf ??
Gandalf_BD
23-06-2004, 18:22
si, appena fa la prima fscanf...
x cionci: non penso che sia sbagliato, perchè io devo immagazzinare parole intere, non singoli caratteri... o sbaglio? :confused:
Gogeta ss4
23-06-2004, 18:57
ma dentro il file c'è qualcosa o è vuoto?
... sono un po' fuori allenamento ma nel %s non ci va il massimo numero di caratteri da leggere? se non inserito copia tutto fino al primo spazio ... :) comunque sono fuori dalla programmazione da tempo, quindi è una mezza sparata!!!
Gandalf_BD
23-06-2004, 19:19
x Gogetas: sisi... c'è qualcosa nel file :)
x RAISE: hai perfettamente ragione, infatti io devo immagazzinare tre parole, separate da spazi in tre celle differenti :)
Gandalf
Gogeta ss4
23-06-2004, 19:49
scusa una cosa, rewind(fPtr) cosa fa?
Magari ti da un access violation perchè il puntatore al file si trova alla fine, a meno che quella rewind non porta il puntatore all'inizio...
Gandalf_BD
23-06-2004, 20:14
esatto... rewind serve proprio a riportare il puntetore ad inizio file, dato che prima l'ho passato tutto fino in fondo...
Originariamente inviato da Gandalf_BD
x RAISE: hai perfettamente ragione, infatti io devo immagazzinare tre parole, separate da spazi in tre celle differenti :)
Gandalf
non dovresti inserire gli spazzi? %s %s %s?:confused:
Gandalf_BD
23-06-2004, 20:38
Noo... sono sicuro ;)
Originariamente inviato da Gandalf_BD
x cionci: non penso che sia sbagliato, perchè io devo immagazzinare parole intere, non singoli caratteri... o sbaglio? :confused:
allora hai sbagliato l'allocazione :boh:
data è un vettore di stringhe di 5 caratteri !!!
Se te scrivi data[i][0] fai riferimento al carattere 0 dell'i-esima stringa...
Se devi leggere tre parole separate da spazi è %s %s %s... Comunque ripeto...il problema è lì dove ti ho detto...
Diabolik.cub
28-06-2004, 22:11
Originariamente inviato da cionci
allora hai sbagliato l'allocazione :boh:
data è un vettore di stringhe di 5 caratteri !!!
Se te scrivi data[i][0] fai riferimento al carattere 0 dell'i-esima stringa...
esatto il problema è proprio lì. Se proprio vuoi farlo così allora devi "salire di una dimensione" (se così si può dire..) e dichiararlo come char ***data. In poche parole:
data=(char ***)calloc(m, sizeof(char **)); //crea una matrice dinamica
if(data!=NULL)
for(i=0;i<m;i++) {
data[i]=(char **)calloc(5, sizeof(char *));
for (x=0; x<5; x++)
data[i][x] = (char *) malloc(50); //50 è la lunghezza stringa
}
else
printf("\nNo memory available\n");
cmq è da pazzi una cosa del genere, sostituisci la fscan con una fgets e ti salvi la riga intera. Poi da quella stringa con una sscanf ti vai a prendere le parole che ti interessano.
Se devi leggere tre parole separate da spazi è %s %s %s...
va bene anche senza, anzi in teoria non si dovrebbero mettere :)
Originariamente inviato da Diabolik.cub
va bene anche senza, anzi in teoria non si dovrebbero mettere :)
Perchè ?
Diabolik.cub
29-06-2004, 21:15
Originariamente inviato da cionci
Perchè ?
esperienza personale: con alcuni compilatori datati se metti lo spazio in mezzo saltano un singolo spazio memorizzano nella stringa tutto quello che trovano dal carattere successio, se ci sono altri spazi o caratteri di tabulazione prendono quelli. Non mettendo lo spazio li saltano automaticamente fino al primo carattere di testo (cmq effettivamente con il compilatore che sto usando ora spazi o non spazi il comportamente è il medesimo :p ).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.