我在使用calloc处理矩阵时遇到了问题

时间:2013-10-28 18:39:39

标签: c function parameter-passing calloc

我想使用函数从文本文档动态构建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");
...
}

2 个答案:

答案 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()

  • 您的代码不适合文件内容的模型。根据您的代码,该文件应将irsulycsomel设置为值00,{{分别为1}}和7。然后,您为两个指针指向int分配空间,将结果保存在8中,然后继续索引到ellista最多*ellista个项目,显然不是 el。完成时你想要一个2xN矩阵或Nx2矩阵既不明确也不明显,而且所写的代码

  • 文体,但很有帮助:您应该在功能的成功上设置出参数,而不是在初始入口或解析时。例如:根据函数的成功,您的2 by-address参数应设置为 last 操作,而不是第一个操作。声明一个本地ellista临时变量,运行填充该变量的算法,并在成功时设置out参数。

所有这些都说,我认为你想要一个2xN矩阵,如果是这样,下面的代码就会这样做。注意这是检查malloc和calloc调用的结果,我留给你。此函数将在成功时返回零(int** local;),在失败时返回非零:

0