2016-12-07 3 views
1

mon programme a cessé de fonctionner .... Je ne sais pas pourquoi le programme cesse de fonctionner si quelqu'un peut me aider, je serais très reconnaissantC Arrêt du programme en cours (m [0] -> rows = i;)

struct Matrix { 
    unsigned int rows, cols; 
    double * elems; 
}; 

et ici la fonction

Errorcode matrix_loadFromFile (Matrix * m, char * mFileName) { 
char c; 
unsigned int i; 
FILE *fp; 

fp = fopen(mFileName, "r"); 
if(fp == NULL) { 
    return ERR_FOPEN; 
}else { 
    i = matrix_getnumber(fp); 
    if(i == 0) { 
     return ERR_INVALID_ROWS; 
    }else { 
     m[0] -> rows = i; /**here the program stop working ...*/ 
    }; 
    i = matrix_getnumber(fp); 
    if(i == 0) { 
     return ERR_INVALID_COLS; 
    }else { 
     m[0] -> cols = i; 
    }; 

    for(i = 0; i < (matrix_rows(m[0]) * matrix_cols(m[0])); ++i) { 
     m[0] -> elems[i] = matrix_getnumber(fp); 
    }; 

    c = fgetc(fp); 
    if(c != EOF) { 
     return ERR_TRAILING_CHARS; 
    }; 

    fclose(fp); 
} 

return 0; 
} 

La livraison est demain, donc je n'ai pas beaucoup de temps :/

+0

'm [0] -> rangs = i;>' '- m-> rows = i;' – BLUEPIXY

+0

matrix.c: En fonction 'matrix_loadFromFile': matrix.c: 246: 6: erreur: demande de "rangées" dans quelque chose qui n'est pas une structure ou une union m -> rows = i; ^ – Taito

+0

si vous définissez 'typedef struct Matrix * Matrix;', '(* m) -> rows = i;': Afficher le code côté appelant. – BLUEPIXY

Répondre

0

Vous devez allouer elems d'abord, comme ceci:

for(i = 0; i < (matrix_rows(m[0]) * matrix_cols(m[0])); ++i) { 
    m[0] -> elems[i] = malloc(sizeof(double)); 
    m[0] -> elems[i] = matrix_getnumber(fp); 
}; 
+0

Vous allouez seulement de l'espace pour 1 double, mais ensuite vous en attribuez le i "élément. – Barmar

+0

Désolé, corrigé! – koper89

0

m[0] n'est pas un pointeur, vous ne pouvez donc pas utiliser m[0]->. Il ne ressemble pas m est un tableau du tout, c'est juste un pointeur sur un seul Matrix, donc vous devriez utiliser m-> pour accéder à ses membres.

Vous devez également allouer de l'espace pour m->elems avant de commencer à y stocker.

Errorcode matrix_loadFromFile (Matrix * m, char * mFileName) { 
    char c; 
    unsigned int i; 
    FILE *fp; 

    fp = fopen(mFileName, "r"); 
    if(fp == NULL) { 
     return ERR_FOPEN; 
    }else { 
     i = matrix_getnumber(fp); 
     if(i == 0) { 
      return ERR_INVALID_ROWS; 
     }else { 
      m->rows = i; /**here the program stop working ...*/ 
     }; 
     i = matrix_getnumber(fp); 
     if(i == 0) { 
      return ERR_INVALID_COLS; 
     }else { 
      m->cols = i; 
     }; 

     int elems_size = matrix_rows(*m) * matrix_cols(*m); 
     m->elems_size = malloc(elems * sizeof(double)); 

     for(i = 0; i < elems_size; i++) { 
      m->elems[i] = matrix_getnumber(fp); 
     }; 

     c = fgetc(fp); 
     if(c != EOF) { 
      return ERR_TRAILING_CHARS; 
     }; 

     fclose(fp); 
    } 

    return 0; 
}