Ошибка чтения матрицы при добавлении матрицы инициализации функции

#c #linked-list

#c #связанный список

Вопрос:

Моя функция переносит матрицу из многомерных массивов в связанный список, но когда я добавляю новую функцию для создания матрицы и показываю ошибку вместо первых строк

основная функция

 void construcMat(matrice_creuse *m, int t[N][M], size_t Nligne, size_t Ncol) {
    //m = creeMat(Nligne, Ncol);
    m->Ncolonnes = Ncol;
    m->Nlignes = Nligne;
    m->liste = malloc(Nligne * sizeof(liste_ligne));
    for (size_t i = 0; i < Nligne; i  ) {
        m->liste[i] = NULL;
        liste_ligne dernier = m->liste[i];
        for (size_t j = 0; j < Ncol; j  ) {
            if (t[i][j] != 0) { 
                element *e = creeEle(j, t[i][j]);
                if (dernier != NULL) {
                    dernier->suiv = e;
                    dernier = dernier->suiv;
                } else {
                    dernier = e; 
                    m->liste[i] = dernier;
                }
}}}}

  

новая функция:

 matrice_creuse* creeMat(size_t Nligne, size_t Ncol) {
    matrice_creuse *m = malloc(sizeof(matrice_creuse));
    if (m == NULL) {
        printf("error");
        return NULL;
    }
    m->Ncolonnes = Ncol;
    m->Nlignes = Nligne;
    m->liste = malloc(Nligne * sizeof(liste_ligne));
    if (m->liste == NULL) {
        printf("error");
        return NULL;
    }
    for (int i = 0; i < Nligne ;   i) {
        m->liste[i] = NULL;
    }
    return m;
}
  

Но при добавлении новой функции в construcMat , функция contrucMat не возвращает новую матрицу, которая имеет оценщики из матрицы t [N] [M], contrucMat возвращает параметр matrix m Null

Ответ №1:

функция contrucMat не возвращает новую матрицу, которая имеет оценщики из матрицы t[N][M], contrucMat возвращает параметр matrix m Null

если вы имеете в виду после

 matrice_creuse *m = NULL;
...
construcMat(m, ..);
  

m по-прежнему равно нулю. это нормально, когда вы устанавливаете m в construcMat, вы устанавливаете локальную переменную, поэтому в приведенном выше коде нет влияния на вызывающий объект

Одним из решений является не указывать m в параметре construcMat, потому что это бесполезно, а вернуть его :

 matrice_creuse *m = construcMat(..);
  

с

 matrice_creuse * construcMat(int t[N][M], size_t Nligne, size_t Ncol) {
    matrice_creuse * m = creeMat(Nligne, Ncol);
    ...
    return m;
}
  

В противном случае измените профиль, чтобы использовать переменную in-out :

 void construcMat(matrice_creuse ** m, int t[N][M], size_t Nligne, size_t Ncol) {
    *m = creeMat(Nligne, Ncol);
    (*m)->Ncolonnes = Ncol;
    (*m)->Nlignes = Nligne;
    (*m)->liste = malloc(Nligne * sizeof(liste_ligne));

    liste_ligne * lignes = (*m)->liste;

    for (size_t i = 0; i < Nligne; i  ) {
        lignes[i] = NULL;
        liste_ligne * dernier = lignes[i];
        for (size_t j = 0; j < Ncol; j  ) {
            if (t[i][j] != 0) { 
                element *e = creeEle(j, t[i][j]);
                if (dernier != NULL) {
                    dernier->suiv = e;
                    dernier = dernier->suiv;
                } else {
                    dernier = e; 
                    lignes[i] = dernier;
                }
}}}}
  

и вызов изменен на :

 matrice_creuse *m = NULL;
...
construcMat(amp;m, ..);
  

Предупреждение, вы пропустили «*» в строке liste_ligne dernier = m->liste[i]; , я исправил в приведенном выше коде

Комментарии:

1. как найти другое решение? следуйте моему учителю, конструкция функции должна иметь тип void

2. @TranQuocGiaCat все в порядке? вы понимаете?

3. в функции main я инициализирую параметр matrice_creuse m , как передать двойную точку из функции construcMat

4. @TranQuocGiaCat как я и сделал в своем ответе, с amp;m , а не просто m . Предупреждение Я вижу ошибку в вашем коде и отредактировал свой ответ