Errore di segmentazione ma non riesco a trovare il motivo

di il
4 risposte

Errore di segmentazione ma non riesco a trovare il motivo

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

Devi accedere o registrarti per scrivere nel forum
4 risposte