我该如何解决此错误:表达式必须具有恒定值.环境是2013年
How could I solve this error: expression must have a constant value. environment is VS 2013
我在以下方式进行操作时会出现错误:
首先,我在file light.cpp中声明一个类:
class light {
public:
light(const char* light_file, const int n);
~light();
void LoadLight(string light_file);
//private:
int light_num;
float **p;
float **a;
float **d;
float **s;
float *amb;
};
然后我在main.cpp中使用灯类类:
light *light_data;
...
...
other code
...
...
void lighting()
{
// The following lines contain errors
GLfloat light_specular[light_data->light_num][4]; //**error line: from here I receive error about light_data, saying that expression must have a constant** value
GLfloat light_diffuse[light_data->light_num][4]; //error line
GLfloat light_ambient[light_data->light_num][4]; //error line
GLfloat light_position[light_data->light_num][4];// error line
for(int i = 0; i < light_data->light_num; i++) {
int j;
for(j = 0; j < 3; j++) {
light_specular[i][j] = light_data->s[i][j];
light_diffuse[i][j] = light_data->d[i][j];
light_ambient[i][j] = light_data->a[i][j];
light_position[i][j] = light_data->p[i][j];
}
light_specular[i][j] = 1.0f;
light_diffuse[i][j] = 1.0f;
light_ambient[i][j] = 1.0f;
light_position[i][j] = 1.0f;
}
GLfloat ambient[3];
for(int i = 0; i < 3; i++) {
ambient[i] = light_data->amb[i];
}
在上述灯光()函数中,它说light_data
必须具有恒定值。我对这个错误感到非常困惑,有人可以帮我吗?我是C 的新手,对不起。
GLfloat light_specular[light_data->light_num][4];
这就是所谓的变量长度阵列。这意味着它的含义。一个或多个尺寸,在这种情况下是第一个尺寸,是一个可变大小。C 标准不允许它们。某些C 实现,特别是G ,允许VLA语法,但许多实现,特别是Visual Studio,不。
可能是最简单,最好的标准支持解决方案是做
之类的事情std::vector<std::array<4, GLFloat>> light_specular(light_data->light_num);
,并在保持数据连续性和由此产生的高速缓存友好的同时,在您身边获得动态尺寸和范围的内存管理。
std::vector
上的文档
std::array
上的文档
catch是,在C 上,当您创建这样的C风格数组时,您需要在编译时间内恒定和已知数组的大小。由于 light_num 变量是您类的成员 light_data ,其值在编译过程中是不知道的,而仅在执行过程中(每当执行该代码和<<em> light_data 存在于内存中)。
请注意,我保持答案非常通用,以使其简单,而不是深探,而是分享其他一些stackoverflow帖子是相同的问题:
- C 数组 - 表达式必须具有常数值
- C 预期常数表达
- 数组初始化使用C 中的const变量
哦,欢迎来到C :)
相关文章:
- 枚举环境变量的惯用C++14/C++17方法
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- Opengl 3.1 GLSL 140 在 C++ 年输出白色在片段着色器中
- Opencv在2013年第5季度不起作用.应用程序总是在窗口中崩溃
- 如何修复此错误,该错误在2013年Visual Studio上构建VirtualPlannetBuilder源
- 我如何克服无声无法更改VC 2013中的路径环境变量
- 我该如何解决此错误:表达式必须具有恒定值.环境是2013年
- 如果使用 Visual C++ 编译器 2013 年 11 月 CTP,是否还需要使用它编译所有依赖项
- 在2013年Visual Studio中与Nuget库有关
- 如何使用Visual Studio 2013 CTP 2013年11月11日建立Boost 1.55
- 即使在 Visual C++ 编译器中,在模板中传递 "const char" 参数也有些麻烦 2013 年 11 月 CTP
- 与 2013 年相比:断点进入 CPPunittest 测试引发异常
- MS Visual Studios链接错误.2010年和2013年
- 如何在C++中输出日期如下2013年12月8日
- 错误的环境变量路径以Visual Studio 2013结尾
- 如何包含文件夹中的所有源文件?(C++,MS与2013年相比)
- 我如何将一年中的某一天(1-365)转换为其等效日期(即2013年1月5日)C++
- 错误无法打开文件'mfc80u.lib'在视觉工作室社区 2013年
- 使用Visual c++编译器2013年11月CTP With Origin c++ 11库