[C]:status_access_violation

dem1509
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:

#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
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.

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.

dem1509
[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 :-D ma questa volta no...
cosa vuol dire passa la flag-wall al compiler?

nessuno.nobody
Significa attivare i warning.
Se, ad esempio, usi gcc per compilare, ti basta eseguire
gcc sorgente.c -Wall -o eseguibile
per 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

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.