Ciao a tutti! Questo è il mio codice. Non mi da errori di compilazione, ma quando lo mando in esecuzione stampa a video le righe corrette fino all'ultima (in cui compaiono numeri strani), per poi concludere con un : Aborted <core dumped>
Credo che l'errore sia nella funzione "void carica"... ma non riesco proprio a capire dove!! QUalcuno è così gentile da controllarla?? Grazie mille in anticipo...

codice:
#include <stdio.h>
#include <stdlib.h>
#define FILE1 "articoli.txt"
#define FILE2 "revisioni_out.txt"
#define DIM (80)
#define N (8)
#define C (3)
typedef struct{
	int cod;
	float m;
	int vg;
}ART;

FILE*open_file(char*name,char*mode);
ART*alloca(int r);
void carica(ART*g,int n,FILE*fp);
float media(int*v);
int controllo(int a,int b);
void ordina(ART*g,int n);
void swap(int *a,int *b);
void swap_f(float*a,float*b);

int main(int argc,char**argv){
	int n,i;
	char buf[DIM],*fin_name,*fout_name;
	ART * giudizi;
	//riceve parametri da linea di comando, altrimenti usa parametri predefiniti
	switch(argc){ 
		case 1:
		fin_name=FILE1;
		fout_name=FILE2;
		break;
		case 2:
		fin_name=argv[1];
		fout_name=FILE2;
		break;
		case 3:
		fin_name=argv[1];
		fout_name=argv[2];
		break;
		default:
		printf("ERRORE! Inserire al massimo due parametri: <file di input> <file di output> \n");
		exit(-1);
	}
	FILE*fin=open_file(fin_name,"r");
	fgets(buf,sizeof(buf),fin);
	sscanf(buf,"%d",&n);
	giudizi=alloca(n);
	carica(giudizi,n,fin);
	for(i=0;i<n;i++)
		// printf("%d %.3f %d\n\n",giudizi[i].cod,giudizi[i].m,giudizi[i].vg);

	ordina(giudizi,n);
	for(i=0;i<n;i++)
		//printf("%d %.3f %d\n",giudizi[i].cod,giudizi[i].m,giudizi[i].vg);
	return 0;
}

//inverte due numeri in virgola mobile
void swap_f(float*a,float*b){
	float tmp=*a;
	*a=*b;
	*b=tmp;
}
//inverte due interi
void swap(int*a,int*b){
	int tmp=*a;
	*a=*b;
	*b=tmp;
}
//ordina un vettore di strutture
void ordina(ART*g,int n){
	int i,j;
	for(i=0;i<n-1;i++){
		for(j=i+1;j<n;j++)
			if(g[i].m<g[j].m){
				swap(&g[i].cod,&g[j].cod);
				swap_f(&g[i].m,&g[j].m);
				swap(&g[i].vg,&g[j].vg);
			}
	}
	return;
}

//calcola media tra gli elementi del vettore
float media(int*v){
	int i;
	float somma=0;
	for(i=0;i<N;i++)
		somma+=v[i];
	return somma/N;
}

/*funzione che deve restituire 1 se entrambi gli interi sono positivi,
-1 se sono entrambi negativi e 0 in tutti gli altri casi */
int controllo(int a,int b){
	if(a>0 && b>0)
		return 1;
	if(a<0 && b<0)
		return -1;
	return 0;
}

/* funzione che elabora dati da file e li memorizza nel vettore di strutture */
void carica(ART*g,int n,FILE*fp){
	int i,id,vg1,vg2;
	int v[N];
	char buf[DIM];
	for(i=0;i<n;i++){
		fgets(buf,sizeof(buf),fp);
		sscanf(buf,"%d %d %d %d %d %d %d %d %d %d %d",&id,v,v+1,v+2,v+3,&vg1,v+4,v+5,v+6,v+7,&vg2);
		g[i].cod = id;
		g[i].m = media(v);
		g[i].vg = controllo(vg1,vg2);
	}
	return;
}


//alloca un vettore di strutture
ART*alloca(int r){
	ART * m;
	m=(ART*)malloc(r*sizeof(int));
	if(!m){
		fprintf(stderr,"ERRORE:memoria non allocata!!\n");
		exit(-1);
	}
	return m;
}

//verifica la giusta apertura del file
FILE*open_file(char*name,char*mode){
	FILE*fp=fopen(name,mode);
	if(!fp){
		fprintf(stderr,"Errore nell'apertura del file %s!\n",name);
		exit(-1);
	}
	return fp;
}