OpenGL/C++ Problem
-
Hallo,Forum.
Ich kann jetzt vernünftig C++.Dann hab ich mich noch mit der WINAPI vertraut gemacht.
Außerdem hab ich mich für OpenGL entschieden und beherrsche es auch schon einigermaßen.
Dann habe ich natürlich angefangen meine 3D-Engine zu programmieren:
Im Moment kann sie eigentlich nur OpenGl starten und beenden,den Bildschirm mit und ohne Farbe rendern,und Polygone,Linien,usw... zeichnen.Da ich später zu den Vertexpunkten,die erstellt werden zugreifen will,um diese zB. zu bewegen,wollte ich sie mit einem ID kennzeichnen.Hier der Quellcode:
//Variablen,etc..
int Vertexe; //Vertexe im gesamten Programm(Nicht Engine).
Vertexe = 0; //Muss entweder der Engine-Nutzer angeben,oder ich
// versuche eine Funktion dafür zu schreiben,die dies
//übernimmt.
long double Vertexliste[Vertexe][3]; //Feld zum speichern der Vertexe.//Andere,für jetzt unwichtige Funktionen
//Vertexe zeichnen
void srVertex(int ID,float x,float y,float z) //ID,X,Y,Z.
{
Vertexliste[ID][1] = x; //Eigentlich müssten mit dem angegebenem
Vertexliste[ID][2] = y; //ID die Vertexe in dem Feld
Vertexliste[ID][3] = z; //'Vertexliste' gespeichert werden.
//So würde 1 für x,2 für y und
// 3 für z stehen.
}Fehlermeldung:
error:variably modified 'Vertexliste' at file scopeBitte Anworten,was falsch ist.Danke schon mal im Vorraus.
-
Hallo,Forum.
Ich kann jetzt vernünftig C++.Dann hab ich mich noch mit der WINAPI vertraut gemacht.
Außerdem hab ich mich für OpenGL entschieden und beherrsche es auch schon einigermaßen.
Dann habe ich natürlich angefangen meine 3D-Engine zu programmieren:
Im Moment kann sie eigentlich nur OpenGl starten und beenden,den Bildschirm mit und ohne Farbe rendern,und Polygone,Linien,usw... zeichnen.Da ich später zu den Vertexpunkten,die erstellt werden zugreifen will,um diese zB. zu bewegen,wollte ich sie mit einem ID kennzeichnen.Hier der Quellcode
//Variablen,etc..
int Vertexe; //Vertexe im gesamten Programm(Nicht Engine).
Vertexe = 0; //Muss entweder der Engine-Nutzer angeben,oder ich
// versuche eine Funktion dafür zu schreiben,die dies
//übernimmt.
long double Vertexliste[Vertexe][3]; //Feld zum speichern der Vertexe.//Andere,für jetzt unwichtige Funktionen
//Vertexe zeichnen
void srVertex(int ID,float x,float y,float z) //ID,X,Y,Z.
{
Vertexliste[ID][1] = x; //Eigentlich müssten mit dem angegebenem
Vertexliste[ID][2] = y; //ID die Vertexe in dem Feld
Vertexliste[ID][3] = z; //'Vertexliste' gespeichert werden.
//So würde 1 für x,2 für y und
// 3 für z stehen.
}Fehlermeldung:
error:variably modified 'Vertexliste' at file scopeBitte Anworten,was falsch ist.Danke schon mal im voraus.
-
Bin jetzt kein Profi in C++, aber die Größe eines Arrays muss doch bereits beim Compilen bekannt sein? Ansonsten muss man doch dynamisch Speicher allokieren?
-
Hab doch oben angegeben wie groß er ist
-
Es muss aber eine Konstante sein. Wenn du nun als Beispiel 1 statt Vertexe angibst (achja, ein Array muss mindestens 1 groß sein) dann compiled es bei mir. Mit der Variable "Vertexe" jedoch nicht.
-
Was du suchst ist std::vector. Jetzt nicht im mathematischen Sinne, sondern als Container.
-
coder++ schrieb:
Hallo,Forum.
Ich kann jetzt vernünftig C++. Außerdem hab ich mich für OpenGL entschieden und beherrsche es auch schon einigermaßen.
Dann habe ich natürlich angefangen meine 3D-Engine zu programmieren:
Im Moment kann sie eigentlich nur OpenGl starten und beenden,den Bildschirm mit und ohne Farbe rendern,und Polygone,Linien,usw... zeichnen.Da ich später zu den Vertexpunkten,die erstellt werden zugreifen will,um diese zB. zu bewegen,wollte ich sie mit einem ID kennzeichnen.Statt die Vertizes zu bewegen, schau Dir die ModelView-Matrix und die Befehle glRotate und glTranslate an.
coder++ schrieb:
Hier der Quellcode:
//Variablen,etc..
int Vertexe; //Vertexe im gesamten Programm(Nicht Engine).
Vertexe = 0; //Muss entweder der Engine-Nutzer angeben,oder ich
// versuche eine Funktion dafür zu schreiben,die dies
//übernimmt.long double Vertexliste[Vertexe][3]; //Feld zum speichern der Vertexe.Fehlermeldung:
error:variably modified 'Vertexliste' at file scopeNimm einen Zeiger und initialisiere die Vertexliste in Deiner Initialisierungsfunktion mit
Vertexliste = new Point[Vertexe];Point solltest Du entsprechend als Klasse definieren und zwar mit floats oder doubles, falls Du für eigene Berechnungen höhere Präzision benötigst.
Warum float? OpenGL arbeitet vorrangig mit floats. Long doubles könnte zu Effekten führen.
Ansonsten würde ich Dir auch hier zu einer class Vertexlist raten, die das organisiert und kapselt.