我该如何解决此错误:表达式必须具有恒定值.环境是2013年

How could I solve this error: expression must have a constant value. environment is VS 2013

本文关键字:2013年 环境 表达式 何解决 解决 错误      更新时间:2023-10-16

我在以下方式进行操作时会出现错误:

首先,我在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 :)