#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
. Предупреждение Я вижу ошибку в вашем коде и отредактировал свой ответ