Ошибка чтения матрицы при добавлении функции инициализации матрицы - PullRequest
0 голосов
/ 23 апреля 2019

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

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

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, возвращает матрицу параметров m Нуль

1 Ответ

2 голосов
/ 23 апреля 2019

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

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

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

m по-прежнему равно NULL, это нормально, когда вы устанавливаете 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(&m, ..);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...