Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    7

    [C] Errore programma!

    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;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Altro?
    Allora questo è un tipico errore di esecuzione dato da distrazione nell'uso dei puntatori.
    Se hai capito che l'errore è nella funzione carica, controlla che al suo interno i puntatori siano tutti correttamente inizializzati (insomma hai fatto una chiamata a malloc andata a buon fine) e che siano usati in maniera corretta.
    Controlla anche che i parametri che passi alla funzione siano correttamente inizializzati
    Non puoi chiedere a noi di fare il debug al tuo programma.
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Concordo con valia, non perché non voglia fare il debug al posto tuo, ma perché non ti farebbe imparare nulla.

    E' importante saper correggere un programma, quanto e forse di più di saperlo scrivere.

    Opera passo passo, con il tuo debugger. Se non lo sai usare, inserisci delle printf o delle getchar in modo da identificare con precisione l'istruzione che causa il problema.

    Soffermati, come già detto, sui puntatori e sul loro valore perché è sicuramente un problema di puntatori.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    7
    Scusate,non pretendevo affatto faceste un debug del mio programma...ma solo controllare almeno quella funzione,nel caso ci sia un errore evidente dell'uso dei puntatori di cui io non mi sono accorta....e poi se qualcuno sapeva dov'era più o meno da cercare l'errore quando esce "aborted". perchè non mi era mai capitato. Grazie comunque..

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Originariamente inviato da Sere22
    Scusate,non pretendevo affatto faceste un debug del mio programma...ma solo controllare almeno quella funzione,nel caso ci sia un errore evidente dell'uso dei puntatori di cui io non mi sono accorta....
    L'unico modo per identificare il problema è fare il debug.

    e poi se qualcuno sapeva dov'era più o meno da cercare l'errore quando esce "aborted". perchè non mi era mai capitato.
    Già detto ... un problema di corruzione della memoria o di tentativo di accesso a memoria non allocata per qualche puntatore sbagliato.

    Grazie comunque..
    Prova ad identificare sicuramente almeno la linea in cui hai il crash ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    7
    Prova ad identificare sicuramente almeno la linea in cui hai il crash ...
    Ok grazie! non so fare il debug passo per passo...quindi provo a mettere qualche printf

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    7
    Se hai capito che l'errore è nella funzione carica, controlla che al suo interno i puntatori siano tutti correttamente inizializzati (insomma hai fatto una chiamata a malloc andata a buon fine) e che siano usati in maniera corretta.
    grazie ho trovato l'errore, era nella malloc!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Sere22
    grazie ho trovato l'errore, era nella malloc!!!
    come ti avevo detto inizialmente, controllare se correttamente inizializzato (chiamata a malloc con successo) e se usi le cose bene.

    Per il debug, se stai imparando e le printf costituiscono un primo passo. di solito subito metto printf per capire almeno in che punto è l'errore (prima di usare un vero debugger).

    Da questo sai che quel tipo di errore diviene dall'uso dei puntatori e sai correggerlo da te
    Ciao e buona giornata
    RTFM Read That F*** Manual!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    7
    Buona giornata anche a voi!!

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,464
    Originariamente inviato da Sere22
    grazie ho trovato l'errore, era nella malloc!!!
    Ovvero questa

    m=(ART*)malloc(r*sizeof(int));

    che doveva essere

    m=(ART*)malloc(r*sizeof(ART));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.