我的函数将矩阵从多维数组转移到链接列表,但是当我添加一个新函数来创建矩阵并显示错误而不是第一行时
主要功能
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
为空
答案 0 :(得分:2)
函数contrucMat不返回具有矩阵t [N] [M]的赋值器的新矩阵,contrucMat返回参数矩阵m Null
如果你的意思是
matrice_creuse *m = NULL;
...
construcMat(m, ..);
m 仍然为NULL,这是正常的,当您在 construcMat 中设置 m 时,您设置了局部变量,因此对上面代码中的呼叫者
一种解决方案是不要在 construcMat 的参数中给出 m ,因为这没有用,但要返回它:
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];
行中错过了“ *”,我已在上面的代码中进行了纠正