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