我正在处理一段代码,它从文件中读取数据并对其进行操作。我们的想法是以全局方式加载数据,然后对数据使用多个函数来执行计算。我遇到的问题是,在编译时我收到以下错误:
'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之前添加变量顶点; ,则会产生大量错误。
我该如何解决这个问题?
答案 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
关键字来为其提供外部链接。