[C]:status_access_violation
Ciao a tutti! Ho scritto questo programma che deve scrivere nel file di uscita i dati del file in ingresso aggiornati tenendo conto dei voti degli esami nel file delle verbalizzazioni.
es. contenuto file di ingresso (matricola, totale esami, media)
I-29333 7 23.28
es. contenuto file verbalizzazioni (esame, data, voto, matricola)
Informatica 26/06/2009 28 I-29333
il programma deve scrivere un nuovo file con i dati del primo aggiornati per ogni numero di matricola.
Il mio programma viene compilato correttamente, purtroppo però quando lo faccio girare mi viene l'errore status_access_violation.
Deve esserci un problema con i puntatori o simili ma non riesco ad uscirne
...vi prego aiutatemi!!
ecco il codice:
Grazie!
es. contenuto file di ingresso (matricola, totale esami, media)
I-29333 7 23.28
es. contenuto file verbalizzazioni (esame, data, voto, matricola)
Informatica 26/06/2009 28 I-29333
il programma deve scrivere un nuovo file con i dati del primo aggiornati per ogni numero di matricola.
Il mio programma viene compilato correttamente, purtroppo però quando lo faccio girare mi viene l'errore status_access_violation.
Deve esserci un problema con i puntatori o simili ma non riesco ad uscirne


ecco il codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define NSTUDENTI 100 #define NVERBALIZZAZIONI 10000 struct medie { char matricola[8]; int totale_esami; float media_voti; }; struct esame { char materia[30]; char data; int voto; char matricola[8]; }; void aggiorna_media (char *nome_file_medie, char *nome_file_verbalizzazioni, char *nome_file_uscita); int lettura_fmedie (FILE *file_medie, struct medie media[]); int lettura_fverbalizzazioni (FILE *file_verbalizzazioni, struct esame verbalizzazioni[]); void scrittura_fuscita (struct medie copia_media[], struct esame verbalizzazioni[], int numero_studenti, int numero_verbalizzazioni, FILE *fuscita); void copia_struttura_media (FILE *fmedie, struct medie copia_media[]); int main (int argc, char *argv[]) { if (argc != 4) { printf ("Uso: aggiornamento_media_voti <file medie> <file verbalizzazioni> <file uscita>"); exit (EXIT_FAILURE); } aggiorna_media (argv[1], argv[2], argv[3]); return EXIT_SUCCESS; } void aggiorna_media (char *nome_file_medie, char *nome_file_verbalizzazioni, char *nome_file_uscita) { FILE *fmedia; FILE *fverbalizzazioni; FILE *fuscita; struct medie media[NSTUDENTI]; struct esame verbalizzazioni[NVERBALIZZAZIONI]; struct medie copia_media[NSTUDENTI]; int numero_studenti; int numero_verbalizzazioni; if ((fmedia = fopen (nome_file_medie, "r")) == NULL) { printf ("errore di apertura del file %s\n", nome_file_medie); exit (EXIT_FAILURE); } if ((fverbalizzazioni = fopen (nome_file_verbalizzazioni, "r")) == NULL) { printf ("errore di apertura del file %s\n", nome_file_verbalizzazioni); exit (EXIT_FAILURE); } if ((fuscita = fopen (nome_file_uscita, "w")) == NULL) { printf ("errore di apertura del file %s\n", nome_file_uscita); exit (EXIT_FAILURE); } numero_studenti = lettura_fmedie (fmedia, media); numero_verbalizzazioni = lettura_fverbalizzazioni (fverbalizzazioni, verbalizzazioni); copia_struttura_media (fmedia, copia_media); scrittura_fuscita (copia_media, verbalizzazioni, numero_studenti, numero_verbalizzazioni, fuscita); fclose (fmedia); fclose (fverbalizzazioni); fclose (fuscita); return; } int lettura_fmedie (FILE *file_medie, struct medie media[]) { int i; i = 0; while (fscanf (file_medie, "%s %d %f", media[i].matricola, &media[i].totale_esami, &media[i].media_voti) != EOF) { i++; } return i; } int lettura_fverbalizzazioni (FILE *file_verbalizzazioni, struct esame verbalizzazioni[]) { int j; j = 0; while (fscanf (file_verbalizzazioni, "%s %s %d %s", verbalizzazioni[j].materia, verbalizzazioni[j].data &verbalizzazioni[j].voto, verbalizzazioni[j].matricola)) { j++; } return j; } void scrittura_fuscita (struct medie copia_media[], struct esame verbalizzazioni[], int numero_studenti, int numero_verbalizzazioni, FILE *fuscita) { int i,j,m; i = 0; j = 0; m = 0; while (i < numero_verbalizzazioni) { while (j < numero_studenti) { if (strcmp (verbalizzazioni[j].matricola, copia_media[i].matricola) == 0) { copia_media[i].media_voti = (( copia_media[i].media_voti * copia_media[i].totale_esami) + verbalizzazioni[j].voto) / ((copia_media[i].totale_esami + 1)* 1.0); copia_media[i].totale_esami++; } } } i = 0; while (i < numero_studenti) { fprintf (fuscita, "%s %d %f\n", copia_media[i].matricola, copia_media[i].totale_esami, copia_media[i].media_voti); i++; } return; } void copia_struttura_media (FILE *fmedie, struct medie copia_media[]) { int i; while (fscanf (fmedie, "%s %d %f", copia_media[i].matricola, &copia_media[i].totale_esami, &copia_media[i].media_voti) != EOF) return; }
Grazie!
Risposte
Consiglio: quando compili qualcosa, attiva i warning.
Passa la flag -Wall al compiler e questo ti mostrerà alcuni problemi che prima ti taceva. Risolvendoli, capirai l'errore.
Intanto per completezza ti posto l'output di clang sorgente.c -Wall
Passa la flag -Wall al compiler e questo ti mostrerà alcuni problemi che prima ti taceva. Risolvendoli, capirai l'errore.
Intanto per completezza ti posto l'output di clang sorgente.c -Wall
asd.c:110:19: warning: format specifies type 'char *' but the argument has type 'int' [-Wformat] verbalizzazioni[j].data &verbalizzazioni[j].voto, verbalizzazioni[j].matricola)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ asd.c:110:69: warning: format specifies type 'int *' but the argument has type 'char *' [-Wformat] verbalizzazioni[j].data &verbalizzazioni[j].voto, verbalizzazioni[j].matricola)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ asd.c:109:52: warning: more '%' conversions than data arguments [-Wformat] while (fscanf (file_verbalizzazioni, "%s %s %d %s", verbalizzazioni[j].materia, ~^ asd.c:158:23: warning: variable 'i' is uninitialized when used here [-Wuninitialized] copia_media[i].matricola, &copia_media[i].totale_esami, &copia_media[i].media_voti) != EOF) ^ asd.c:155:9: note: initialize the variable 'i' to silence this warning int i; ^ = 0 4 warnings generated.
[quote=nessuno.nobody]Consiglio: quando compili qualcosa, attiva i warning.
Passa la flag -Wall al compiler e questo ti mostrerà alcuni problemi che prima ti taceva. Risolvendoli, capirai l'errore.
i warning sono attivati, almeno credo, infatti quando compilo i programmi spuntano sempre
ma questa volta no...
cosa vuol dire passa la flag-wall al compiler?
Passa la flag -Wall al compiler e questo ti mostrerà alcuni problemi che prima ti taceva. Risolvendoli, capirai l'errore.
i warning sono attivati, almeno credo, infatti quando compilo i programmi spuntano sempre

cosa vuol dire passa la flag-wall al compiler?
Significa attivare i warning.
Se, ad esempio, usi gcc per compilare, ti basta eseguire
Cosa stai usando per sviluppare? Un IDE? Comunque se sei agli inizi ti consiglio di fare queste operazioni a mano, lasciando perdere gli IDE, in modo da aver idea di cosa l'IDE faccia al posto tuo e prendere maggiore confdenza con gli strumenti base
Se, ad esempio, usi gcc per compilare, ti basta eseguire
gcc sorgente.c -Wall -o eseguibileper compilare il file "sorgente.c", mostrare tutti i warning "-Wall" e produrre il file eseguibile "eseguibile".
Cosa stai usando per sviluppare? Un IDE? Comunque se sei agli inizi ti consiglio di fare queste operazioni a mano, lasciando perdere gli IDE, in modo da aver idea di cosa l'IDE faccia al posto tuo e prendere maggiore confdenza con gli strumenti base