0

我正在编写一段代码,它从文件中读取数据并对其进行操作。这个想法是以全局方式加载数据,然后对数据使用几个函数来执行计算。我遇到的问题是编译时出现以下错误:

'vertices' 未声明(在此函数中首次使用)。

头文件包含以下内容:

typedef struct
{
    double x;
    double y;
    double z;
} variable;

我主要调用 malloc 和一个函数,它将使用这个名为“顶点”的“变量”数组:

int main (void)
{   
    variable *vertices = (variable*) malloc( 5000 * sizeof (variable) ) ; 
    load_file();
    free(vertices);
    return 0;
}

函数load_file():

    FILE *fp1 ;
    fp1 = fopen( 'file',"r");
    if (fp1==NULL)
    {
        printf("File couldn't be opened or read!");
        return 1;
    }   

    int j = 0;
    while(fscanf(fp1, "%lf %lf %lf ", &vertices[j].x, &vertices[j].y, &vertices[j].z ) == 3 )
    {
        j++;
    }
    fclose(fp1);

实际上,当我将 malloc 放入load_file时,它​​会编译并工作,但问题是我有各种其他函数将使用数据,如果我在 load_file 中释放它,我会失去一切。如果我在 main 上面重新定义 typedef,我会得到一个“以前的定义在这里”,如果我添加变量顶点;在 main 之前,有很多错误。

我将如何解决这样的问题?

4

2 回答 2

3

问题是您在 main 中声明了“顶点”,这使得它的范围对 main 是本地的,而 load_file() 看不到它。

更改 load_file() 的声明如下...

void load_file( variable* vertices )
{
    /// blah blah
}

然后在主要中,将您的顶点变量传递给它......

int main (void)
{   
    variable *vertices = malloc( 5000 * sizeof (variable) ) ; 
    load_file( vertices );
    free(vertices);
    return 0;
}

编辑:我建议不要只将顶点设为全局变量......这意味着任何东西都可以访问它和/或修改它......即使是无意的。将参数传入和传出需要它们的函数几乎总是更明智的做法,而不是仅仅让它们对世界全局可用......范围是你的朋友。

于 2013-03-21T19:52:49.027 回答
1

如果您希望vertices文件中的所有函数都可以访问 ,则将其声明移到main()函数之外(即,给它全局范围)并仅在函数内部对其进行初始化main()

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    double x;
    double y;
    double z;
} variable;

static variable *vertices = NULL;

int load_file() {
    FILE *fp1 ;
    fp1 = fopen( "file","r");
    if (fp1==NULL){
        printf("File couldn't be opened or read!");
        return 1;
    }

    int j = 0;
    while(fscanf(fp1, "%lf %lf %lf ", &vertices[j].x, &vertices[j].y, &vertices[j].z ) == 3 ){
        j++;
    }
    fclose(fp1);
    return 0;
}

int main (void){
    vertices = (variable*) malloc( 5000 * sizeof (variable) ) ;
    load_file();
    free(vertices);
    return 0;
}

如果您希望vertices指针可在程序中的所有文件中访问,则通过static从其声明中删除关键字来为其提供外部链接。

于 2013-03-21T19:50:28.563 回答