我想使用函数从文本文档动态构建C中的矩阵。 使用calloc制作矩阵时遇到问题,可能在给matrice元素赋值时,我找不到任何东西。我可以处理一个载体。
此处的代码:
#include <stdio.h>
#include <stdlib.h>
void beolvas_ellista(int *, int *, int *, int *, int ***, char *);
int main()
{
int ir, suly, csom, el, i, **ellista;
//The following commented code works
/*FILE * f;
f=fopen("be.txt","r");
fscanf(f,"%d",&ir);
fscanf(f,"%d",&suly);
fscanf(f,"%d",&csom);
fscanf(f,"%d",&el);
ellista=(int **)calloc(2,sizeof(int *));
for(i=0;i<el;++i)
{
ellista[i]=(int *)calloc(el,sizeof(int));
}
i=0;
while(!feof(f))
{
fscanf(f,"%d",&ellista[0][i]);
fscanf(f,"%d",&ellista[1][i]);
++i;
}
for(i=0;i<el;++i)
printf("%d %d\n",ellista[0][i],ellista[1][i]);
fclose(f);*/
beolvas_ellista(&ir, &suly, &csom, &el, &ellista, "be.txt");
for(i=0;i<el;++i)
printf("%d %d\n",ellista[0][i],ellista[1][i]);
return 0;
}
void beolvas_ellista(int *ir, int *suly, int *csom, int *el, int ***ellista, char *allomany)
{
int i;
FILE * f;
f=fopen(allomany,"r");
fscanf(f,"%d",ir);
fscanf(f,"%d",suly);
fscanf(f,"%d",csom);
fscanf(f,"%d",el);
*ellista=(int **)calloc(2,sizeof(int *));
for(i=0;i<*el;++i)
{
*ellista[i]=(int *)calloc(*el,sizeof(int));
}
i=0;
while(!feof(f))
{
fscanf(f,"%d",ellista[0][i]);
fscanf(f,"%d",ellista[1][i]);
++i;
}
fclose(f);
}
这是文本文件:
be.txt
0 0
7 8
1 2
1 3
2 3
3 4
4 5
4 6
5 7
6 7
此处还有我用来收集信息的代码:
void beolvas(int*pn, int**pa, char*allomany)
{
int i;FILE*f;
f=fopen(allomany,"r");
fscanf(f,"%d",pn);
*pa=(int*)malloc((*pn)*sizeof(int));
for(i=0; i<*pn; i++)
fscanf(f,"%d",(*pa)+i);
fclose(f);
}
main()
{
int n, *a;
beolvas(&n, &a, "be.txt");
...
}
答案 0 :(得分:0)
您的输入文件不符合代码。你在你的输入文件中说* el = 8.在你的代码中你将它作为行计数,但实际上只在你的第一个calloc调用中花费2行到矩阵...
P.S。试试这个:
编辑:错误的分析我。你的实际问题是一个先前的问题。您需要使用括号设置以正确的方式取消引用 * ,如下所示:
void beolvas_ellista(int *ir, int *suly, int *csom, int *el, int ***ellista, char *allomany)
{
int i;
FILE * f;
f=fopen(allomany,"r");
fscanf(f,"%d",ir);
fscanf(f,"%d",suly);
fscanf(f,"%d",csom);
fscanf(f,"%d",el);
*ellista=(int **)calloc(2,sizeof(int *));
for(i=0;i<*el;++i)
{
(*ellista)[i]=(int *)calloc(*el,sizeof(int));
}
i=0;
while(!feof(f))
{
fscanf(f,"%d",&((*ellista)[0][i]));
fscanf(f,"%d",&((*ellista)[1][i]));
++i;
}
fclose(f);
}
答案 1 :(得分:0)
以下项目符号列出了您的功能中的错误项目。
您错误地使用feof()
作为while
循环的中断条件。 See this question了解更多信息。
您忽略了fscanf()
的返回结果,因此无法保证参数解析成功与否。 See the documentation of fscanf()
您的代码不适合文件内容的模型。根据您的代码,该文件应将ir
,suly
,csom
和el
设置为值0
,0
,{{分别为1}}和7
。然后,您为两个指针指向int分配空间,将结果保存在8
中,然后继续索引到ellista
最多*ellista
个项目,显然不是 el
。完成时你想要一个2xN矩阵或Nx2矩阵既不明确也不明显,而且所写的代码
文体,但很有帮助:您应该在功能的成功上设置出参数,而不是在初始入口或解析时。例如:根据函数的成功,您的2
by-address参数应设置为 last 操作,而不是第一个操作。声明一个本地ellista
临时变量,运行填充该变量的算法,并在成功时设置out参数。
所有这些都说,我认为你想要一个2xN矩阵,如果是这样,下面的代码就会这样做。注意这是不检查malloc和calloc调用的结果,我留给你。此函数将在成功时返回零(int** local;
),在失败时返回非零:
0