Errore di segmentazione ma non riesco a trovare il motivo

di Anonimizzato14574 il
4 risposte
Ho messo qualche print e l'errore di segmentazione dovrebbe trovarsi alla funzione:
void massimi(FILE *fd2,int *pMAX,char **pID)

il codice è lungo lo so comunque potete provare a vedere se c'è un errore in quella funzione per favore?
poi volevo chiedere un'altra cosa:
ho pensato che il problema ci fosse per il fatto che non ho allocato memoria al puntatore esito, ma provando ad allocare mi da errore, perchè? (ho messo la riga di codice 133 della malloc commentata). Avete qualche consiglio o suggerimento?
grazie in anticipo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
FILE *apri(char *input);
int converti(char *s);
char ***allocMat(int n);
void riempio(char ***atleti,FILE *fdIn,int n);
void stampa(char ***atleti);
void massimi(FILE *fd2,int *pMAX,char **pID);
int ric(char *str,char ***atleti,int n);

int main(int argc, char *argv[]){
	if (argc<2){
		fprintf(stderr,"errore passaggio parametri %s", argv[0]);
		return EXIT_FAILURE;
	}
	FILE *fdIn;
	char input[]="atleti.txt";
	fdIn=apri(input);
	char *s;
	char buffer[10];
	int n; // numero atleti
	s=fgets(buffer,10,fdIn);
	n=converti(s);
	printf("%d\n",n);
	char ***atleti;
	atleti=allocMat(n);
	riempio(atleti,fdIn,n);
	stampa(atleti);
	//Seconda parte
	FILE *fd2;
	fd2=apri(argv[1]);
	printf("1\n");
	int *pMAX;
	char **pID;
	
	printf("2\n");
	pMAX=(int*)malloc(sizeof(int)*3);
	pID=(char**)malloc(sizeof(char*)*3);
	int i,indice;
	
	for (i=0;i<3;i++){
		pID[i]=(char*)malloc(sizeof(char)*15);
	}
	printf("1\n");
	massimi(fd2,pMAX,pID);
	printf("1\n");
	
	for (i=0;i<3;i++){
		indice=ric((pID[i]),atleti,n);
		printf("indice: %d",indice);
		
	}
	
	return 0;
}

FILE *apri(char *input){
	FILE *fd;
	fd=fopen(input,"r");
	if (fd==NULL){
		fprintf(stderr,"errore apertura file %s", input);
		exit(EXIT_FAILURE);
	}
	return fd;
}

int converti(char *s){
	int n;
	char *p;
	errno=0;
	n=strtol(s,&p,0);
	if ((errno!=0) /*|| (*p|='\0') */){
		fprintf(stderr,"errore conversione %s\n",s);
		exit(EXIT_FAILURE);
	}
	return n;
}

char ***allocMat(int n){
	char ***matString;
	int i,j;
	matString=(char***)malloc(sizeof(char**)*n); // n righe
	for (i=0;i<n;i++){
		matString[i]=(char**)malloc(sizeof(char*)*4); //4 colonne
		for (j=0;j<4;j++){
			matString[i][j]=(char*)malloc(sizeof(char)*10); 	
			matString[i][j][0]='0';		
			
		}
	}
	return matString;	
}

void riempio(char ***atleti,FILE *fdIn,int n){
	char *riga,buf[100];
	int i;
	char *temp;
	for (i=0;i<n;i++){
		riga=fgets(buf,100,fdIn);
		temp=strtok(riga," ,");
		strcpy(atleti[i][0],temp);
		temp=strtok(NULL," ,");
		strcpy(atleti[i][1],temp);
		temp=strtok(NULL," ,");
		strcpy(atleti[i][2],temp);
		temp=strtok(NULL," ,");
		strcpy(atleti[i][3],temp);

	}
}


void stampa(char ***atleti){
	int i,j;
	for (i=0;i<3;i++){
		for (j=0;j<4;j++){
			printf("%4s ",atleti[i][j]);
		}
		printf("\n");
	}
}

void massimi(FILE *fd2,int *pMAX,char **pID){
	int i;	
	char *num;
	char *esito;
	//esito=(char*) malloc(sizeof(char)*6);
	char *jump;
	char  *riga;
	char buff[30];
	char *p;
	//esito=(char*) malloc(sizeof(char)*10);
	for (i=0; i<3;i++){
		*(pMAX+i)=0;
		
		strcmp((pID[i]),"0");
				
	}	
	
	
	char *temp;
	int salto;
	
	while(1){
		riga=fgets(buff,30,fd2);
		temp=strtok(riga," ,");
		strcpy(num,temp);
		
		temp=strtok(NULL," ,");
		printf("temp:%s\n",temp);
		strcpy(esito,temp);
		printf("4\n");
		if (esito[0]=='N'){
			printf("continue");
			continue;
		}
		temp=strtok(NULL," ,");
		strcpy(jump,temp);
		salto=converti(jump);
		if (salto>(*pMAX)){
			*(pMAX+2)=*(pMAX+1);
			*(pMAX+1)=*(pMAX);
			*(pMAX)=salto;

			strcmp((pID[2]),(pID[1]));
			strcmp((pID[1]),(pID[0]));
			strcmp((pID[0]),num);
		}
		else if (salto>(*(pMAX+1))){
			*(pMAX+2)=*(pMAX+1);
			*(pMAX+1)=salto;

			strcmp((pID[2]),(pID[1]));
			strcmp((pID[1]),(num));
		}
		else if (salto>(*(pMAX+2))){
			*(pMAX+2)=salto;

			strcmp((pID[2]),num);
		}

	}
}

int ric(char *str,char ***atleti,int n){
	int indice,i,ctrl;
	for (i=0;i<n;i++){
		ctrl=strcmp(atleti[i][0],str);
		if (ctrl==0){
			return i;
		}
	}
	return -1;
	
}

4 Risposte

  • Sai quale istruzione genera l'eccezione?
  • Dovrebbe essere questa:
    strcpy(esito,temp);
  • Per facilitare il compito di correzione, scrivi cosa dovrebbero fare queste funzioni

    è sempre conveniente anche SOPRATTUTTO nel campo del lavoro, quando si creano funzioni importanti, commentare all'inizio con
    /* Esempio di commento */
    anche quando funzionano benissimo, per aiutare chi le legge, e soprattutto potrebbero ritornarti utili nel futuro!
  • Ho risolto, non avevo allocato una variabile!
Devi accedere o registrarti per scrivere nel forum
4 risposte