变量声明

时间:2013-03-21 19:37:35

标签: c

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

  

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

头文件包含以下内容:

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

在主要的我调用malloc和一个函数,它将使用这个名为'vertices'的'变量'数组:

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之前添加变量顶点; ,则会产生大量错误。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

更改load_file()的声明,如下所示......

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

然后在main中,将顶点变量传递给它......

int main (void)
{   
    variable *vertices = malloc( 5000 * sizeof (variable) ) ; 
    load_file( vertices );
    free(vertices);
    return 0;
}
编辑:我建议不要让顶点成为全局变量......这意味着任何东西都可以访问它和/或修改它......甚至是无意中。将参数传入和传出需要它们的函数几乎总是更明智,而不是让它们全局可用于世界......范围是你的朋友。

答案 1 :(得分: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关键字来为其提供外部链接。