2016-11-30 5 views
0

i einen Fehler, wenn ich in der folgenden Art und Weise tun:Wie konnte ich diesen Fehler beheben: Ausdruck muss einen konstanten Wert haben. Umwelt ist VS 2013

Erstens ich eine Klasse in der Datei light.cpp wie folgt deklarieren:

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; 
}; 

Dann benutze ich Licht Klasse in main. cav:

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]; 
    } 

In der obigen Beleuchtung() Funktion, sie sagt, dass light_data konstanten Wert haben muss. Ich bin so verwirrt über diesen Fehler, könnte mir jemand helfen? Ich bin neu in C++, sorry für den unordentlichen Code.

Antwort

0
GLfloat light_specular[light_data->light_num][4]; 

Dies ist, was eine Variable Length Array genannt wird. Es bedeutet, wie es sich anhört. Eine oder mehrere der Dimensionen, in diesem Fall die erste, haben eine variable Größe. Sie sind nicht vom C++ - Standard zugelassen. Einige C++ - Implementierungen, insbesondere g ++, erlauben die VLA-Syntax, aber viele Implementierungen, insbesondere Visual Studio, nicht.

Wahrscheinlich die einfachste und beste Standard-gestützte Lösung ist so etwas wie

std::vector<std::array<4, GLFloat>> light_specular(light_data->light_num); 

und bekommen dynamische Größenanpassung und scoped Speicherverwaltung auf Ihrer Seite zu tun, während Daten contiguity Aufrechterhaltung und Cache Freundlichkeit führt.

Docs on std::vector

Docs on std::array

+0

Hallo, danke! Ich werde es versuchen. Übrigens, ich frage mich, ob ich dies in c kompilieren, anstatt C++ wird diesen Fehler zu entkommen? – ytutow

+2

@Eric Warum möchtest du das in "C" anfangen? Es ist nicht so schwer, 'std :: array' oder' std :: vector' zu verwenden. Ein VLA ist sowieso nur einen Schritt über Raw-Arrays - Sie haben die gleichen Probleme mit undefiniertem Verhalten, wenn Sie außerhalb der Grenzen gehen, VLAs Zerfall in Pointer, wenn sie als Argumente übergeben werden usw. – PaulMcKenzie

+0

@Eric C99 Standard wird es kompilieren, aber VLA wurde optional in C11, also ist Ihre Schätzung so gut wie meins, wenn ein bestimmter Compiler es jetzt erlaubt. VLAs sind ... komisch. Sie brechen eine Menge guter Sachen, kompilieren-konstante Zeit 'sizeof' für eine Sache, für ein kleines bisschen syntaktischen Zucker. Auch eine gute Möglichkeit, Ihren Stack zu töten.Du kannst wahrscheinlich sagen, dass ich kein großer VLA-Fan bin. Wenn Sie Ihre Arrays nehmen und sie in eine Funktion übergeben müssen, die 'GLFloat *' oder eine solche erwartet, kann 'std :: vector :: data()' zu Ihrer Rettung kommen. – user4581301

0

der Haken ist, dass auf C++, wenn Sie einen C-Stil-Array wie das schaffen, können Sie die Größe des Arrays müssen während der Kompilierung konstant und bekannt sein, . Da die Variable light_num ein Mitglied Ihrer Klasse light_data ist, ist ihr Wert während der Kompilierung nicht bekannt, sondern nur während der Ausführung (immer wenn dieser Code ausgeführt wird und eine Instanz light_data im Speicher vorhanden ist).

Bitte beachten Sie mir meine Antwort immer sehr allgemein versuchen, es einfach und zu halten, statt Tieftauchen, ich werde genau das gleiche Problem einige der anderen Stackoverflow Beiträge teilen wurden diskutiert:

Ohh, und willkommen in C++ :)

+0

Danke! @diogoslima – ytutow

Verwandte Themen