[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
ma questa volta no...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