Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对二维数组的引用_C++ - Fatal编程技术网

C++ 对二维数组的引用

C++ 对二维数组的引用,c++,C++,我想用OpenGL实现一个函数,用C++来显示一个圆柱体。我的职能签名如下: #define POINTS_NUM 15 #define DEMESION 3 void drawCylinder( int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][ DEMESION ] ); 我想使用对二维数组的引用来限制用户输入,但出现了一些奇怪的行为。当我实现上面声明的函数时,会发生链接器错误: 错误1错误LN

我想用OpenGL实现一个函数,用C++来显示一个圆柱体。我的职能签名如下:

#define POINTS_NUM  15
#define DEMESION    3
    
void drawCylinder( int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][ DEMESION ] );
我想使用对二维数组的引用来限制用户输入,但出现了一些奇怪的行为。当我实现上面声明的函数时,会发生链接器错误:

错误1错误LNK2005:“float(*vase)[3]”(?vase@@3PAY02MA)已在shapes.obj vase.obj VaseAndAnimation中定义

此处
vase
定义为:

GLfloat vase[ POINTS_NUM ][ DEMESION ];
起初,我认为最后一个维度有问题。所以我在第二次审判中忽略了它。我的函数的这次声明如下:

void drawCylinder( int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][] );
现在,调用时会出现编译时错误(
vase
定义未更改):

编译错误:

错误1错误C2087:“顶点”:缺少下标d:\visual studio 2008\projects\project1\computer graphics\VaseAnimation\shapes.h 25 VaseAnimation

错误2错误C2664:“drawCylinder”:无法将参数3从“GLfloat[14][3]”转换为“GLfloat(&)[14][1]”d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndAnimation\vase.cpp 64 VaseAndAnimation

错误3错误C2087:“顶点”:缺少下标d:\visual studio 2008\projects\project1\computer graphics\vaseandanimation\shapes.h 25 vaseandanimation

错误4错误C2087:“顶点”:缺少下标d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndAnimation\shapes.cpp 12 VaseAndAnimation

从这个错误中,我可以看到参数
顶点
实际上被视为二维数组的引用,但是为什么在我的第一个版本中
vase
被解析为
float(*vase)[3]

我的IDE是VisualStudio2008。我还没有试过GCC;这种行为依赖于编译器吗


希望有人能帮我摆脱这个陷阱。

你的第一次声明很好。似乎您在头文件中定义了
vase

问题似乎只是在头文件中定义了
vase
。您应该只在头文件中声明变量

这会导致一个问题,因为多个定义会产生多个相同的符号,这会混淆链接器(从而导致链接器错误)。当链接器尝试将对变量的引用与实际定义相匹配时,它不知道使用哪一个

收割台防护装置不能防止这种情况。页眉保护中使用的宏仅按翻译单元定义。每次编译器开始编译一个新的.cpp文件(忽略unity builds等),这就是一个新的翻译单元,本质上编译器是从头开始的,不知道以前定义的任何符号

要解决此问题,请仅在头文件中声明变量:

// extern specifies that the definition is elsewhere.
extern int myGlobalVariable;
然后在one源文件中定义该变量

int myGlobalVariable;

是的,你是对的。仔细检查我的代码后,我发现花瓶是在函数声明之前定义的。但是为什么我不能在头文件中定义数组呢?我不知道有什么限制。谢谢。您的标题包含在几个cpp文件中。这意味着将多次定义
vase
。您可以在头文件中声明它,然后在一个cpp文件中定义它。是的,我知道这种情况。但是,我定义了一个宏来避免重复。问题仍然存在。在这种情况下,宏不起作用。每个cpp文件将有一个
vase
int myGlobalVariable;