kostenloser Webspace werbefrei: lima-city


D3D - Syntaxfehler

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Ich bastel gerade mein erstes DirectX 9 Programm zusammen und möchte mit folgendem Codeauszug eine Projektionsmatrix erstellen:
    48     4D3DXMATRIXA16 ProjectionMatrix;
    49     D3DXMatrixPerspectiveFovLH(&ProjectionMatrix, PI / 4, 1.0f, 1.0f, 500.0f);
    50     g_pDirect3D_Device->SetTransform(D3DTS_PROJECTION, &ProjectionMatrix);


    Beim Kompilieren erhalte ich seltsamerweise aber den Fehler:
    main.cpp(49) : error C2059: Syntaxfehler: '='


    Woran liegt denn das? Ich habe doch gar kein '=' benutzt
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich vermute, dass D3DXMatrixPerspectiveFovLH ein Macro ist, welches in irgendwas mit einem = expandiert.
    Lass dir mal die Ausgabe von deinem Präprozessor ausgeben. Beim gcc ist dies die Option -E

    Und dann kann ich mir nicht verkneifen, zu erwähnen, dass DirectX Windows-spezifisch ist und du mit OpenGL besser beraten wärst.
  4. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Wenn ich (bei VC++) den Präprozessor in den Projekteigenschaften einschalte, erhalte ich einen weiteren Fehler:
    1>LINK : fatal error LNK1104: Datei ".\Debug\main.obj" kann nicht geöffnet werden.


    EDIT: Ich habe das Problem gerade gelöst:
    Ich habe die Variable PI falsch definiert. Das war das erste Mal, dass ich diese benutze, deshalb wirft er mir den Fehler erst hier aus und nicht bei der Definierung.

    Und zu GL: Ist das besser? Kennst du ein aktuelles Tutorial (am Besten auf Deutsch)?

    Beitrag zuletzt geändert: 25.4.2010 16:56:11 von toolz
  5. toolz schrieb:
    Wenn ich (bei VC++) den Präprozessor in den Projekteigenschaften einschalte, erhalte ich einen weiteren Fehler:
    1>LINK : fatal error LNK1104: Datei ".\Debug\main.obj" kann nicht geöffnet werden.

    Also der Linker sollte eigentlich erst nach dem Präprozessor und nach dem Compiler und nach dem Assembler ausgeführt werden. Also hast du da wohl nicht die richtige Option erwischt. Es sei denn, VC++ hat da selber ein Problem.


    EDIT: Ich habe das Problem gerade gelöst:
    Ich habe die Variable PI falsch definiert. Das war das erste Mal, dass ich diese benutze, deshalb wirft er mir den Fehler erst hier aus und nicht bei der Definierung.

    Man sollte nach möglichkeit kein
    #define Konstante

    benutzen, weil das eben zu solchen Fehlern führen kann. Für header-Guards ist #define OK, aber sonst sollte man es vermeiden.
    C++ hat da eine bessere Alternative: Das Keyword const. Das ist genauso effektiv, provoziert aber deutlich weniger Bugs.


    Und zu GL: Ist das besser? Kennst du ein aktuelles Tutorial (am Besten auf Deutsch)?

    Ob es besser ist, kann ich dir objektiv nicht sagen, da ich nicht unter Windows entwickle ;)
    Aber rein vom optischen her würde ich sagen, dass der OpenGL Code schöner ist.

    Ein deutsches Tutorial kenne ich leider nicht, aber dieses ist recht nett: http://www.lighthouse3d.com/opengl/glut/index.php?1
  6. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Und eine Frage habe ich noch hierzu:
    DirectX möchte gerne die Eckpunkte von den Objekten in einem Array übergeben bekommen. Dafür brauche ich deren Anzahl. Da ich die aber nicht von vornherein festlegen möchte, lasse ich sie (mit den Koordinaten der Eckpunkten) aus einer Datei auslesen. Das führt aber zu zwei Problemen.

    1. Ich muss ein globales Array und eine globale Variable in einer Funktion einführen. Wie geht das?
    2. Selbst wenn ich die Arraygröße mit einem const int angebe, in den ich zuvor die Anzahl gespeichert habe, kommt die Fehlermeldung, dass die Größe konstant sein muss. Was kann ich dagegen machen?

    Oder habe ich irgendwo übersehen, dass auch eine Liste mit den Koordinaten angenommen wird?
    Und macht OpenGL das auch in einem Array?

    Beitrag zuletzt geändert: 25.4.2010 20:46:35 von toolz
  7. toolz schrieb:
    1. Ich muss ein globales Array und eine globale Variable in einer Funktion einführen. Wie geht das?

    Wenn sie wirklich global sind, dann kann man sie doch von überall als Parameter übergeben?
    Was meinst du mit "global"?


    2. Selbst wenn ich die Arraygröße mit einem const int angebe, in den ich zuvor die Anzahl gespeichert habe, kommt die Fehlermeldung, dass die Größe konstant sein muss. Was kann ich dagegen machen?

    Ohne deinen Code kann man diese Frage nicht beantworten.


    Oder habe ich irgendwo übersehen, dass auch eine Liste mit den Koordinaten angenommen wird?

    Um welche Funktion handelt es sich genau?

    Und macht OpenGL das auch in einem Array?

    Mir ist nicht klar, was du meinst. OpenGL verwendet meistens die glBegin()-Funktion in Kombination mit mehreren Aufrufen von glVertex und einem glEnd(), um einfache 3D-Objetke zu erzeugen.
  8. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    OK, eins nach dem anderen, hier nochmal ein Schnipsel:

    #define ANZAHL 6
    
    struct ECKE {
    	float x, y, z;
    	DWORD farbe;
    } eckpunkt[ANZAHL];

    Das übergebe ich mittels "#pragma region Setup Vertices" an DirectX (so wie ich das verstanden habe). Ich erstelle hier das Gerüst für 2 Dreiecke (Oder 6 Eckpunkte, von denen ich später noch jeweils 3 als ein Dreiecke definier). Ich muss nurnoch die Punkte und Farbe dieser Dreiecke eingeben und bekomme sie anschließend angezeigt. Ich habe hier also das Array eckpunkt[] von der Größe ANZAHL.

    Jetzt möchte ich aber die Anzahl nicht von vornherein festlegen. Dafür lasse ich ANZAHL offen und definiere es als "#define ANZAHL n". Das wirft mir schonmal den Fehler aus, dass es nicht konstant sei (n ist übrigens eine zuvor ermittlete Zahl).

    Beitrag zuletzt geändert: 26.4.2010 17:27:41 von toolz
  9. toolz schrieb:
    OK, eins nach dem anderen, hier nochmal ein Schnipsel:

    #define ANZAHL 6

    Wie gesagt, #define sollte man vermeiden. Nimm besser eine const variable.


    Das übergebe ich mittels "#pragma region Setup Vertices" an DirectX (so wie ich das verstanden habe).

    #pragma ist auch etwas, das man mit vorsicht genießen muss, da es sehr compiler-spezifisch ist. Aber das nur am Rande.


    Das wirft mir schonmal den Fehler aus, dass es nicht konstant sei (n ist übrigens eine zuvor ermittlete Zahl).

    Und wie wird diese Zahl ermittelt?
    Versuch nochmal dir die Ausgabe des Präprozessors zu holen. Dann siehst du wahrscheinlich, was da falsch läuft.

    Beitrag zuletzt geändert: 26.4.2010 21:08:45 von bladehunter
  10. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Das dürfte nicht das Problem sein...

    //Global:
    char* zeile;
    
    //In der Funktion:
    datei.open("dat.txt", ios::in);
    datei >> zeile;
    int n = atoi(zeile);
    #define ANZAHL n
    Theoretisch könnte ich define sogar weglassen, aber auch nur mit der Variablen geht es nicht.

    Beitrag zuletzt geändert: 26.4.2010 20:59:44 von toolz
  11. Okay, du hast offensichtlich nicht verstanden, was der Präprozessor ist.

    Wenn dein Quelltext in ein Programm umgewandelt wird, werden mehrere Schritte benötigt: Preprocessing, Compilierung, Assemblierung und Linken.

    Der Präprozessor liest den Quelltext ein und überarbeitet ihn entsprechend der Anweisungen, die dort stehen. Sobald er fertig ist, gibt er den veränderten Quelltext an den Compiler weiter.

    Nach dem Linken steht dann ein fertiges Programm da. Jetzt musst du dir veranschaulichen, was zu welcher Zeit passiert.

    #define ANZAHL n

    Das soll während des Preprocessings aufgeführt werden.

    datei.open("dat.txt", ios::in);
    datei >> zeile;
    int n = atoi(zeile);

    Das n soll ermittelt werden, wenn das fertig compilierte Programm ausgeführt wird. Aber der Präprozessor ist schon lange mit der Arbeit fertig und kann daher nicht auf den Inhalt der Datei zugreifen.
  12. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    So soll das ja auch sein. Ich möchte nicht jedesmal, wenn die Anzeige neu berechnet wird, die Datei neu auslesen, da steht nichts neues drin. Also lese ich sie einmal aus und speichere den Inhalt in eine Variable n.
    Ob ich jetzt noch ein Makro dafür einrichte oder nicht ist erstmal egal (im Tutorial wurde das gemacht, deshalb lasse ich es erstmal stehen). Das Problem besteht darin, dass ich meinem Array den Wert n nicht als Größe zuteilen kann.

  13. Jetzt möchte ich aber die Anzahl nicht von vornherein festlegen. Dafür lasse ich ANZAHL offen und definiere es als "#define ANZAHL n". Das wirft mir schonmal den Fehler aus, dass es nicht konstant sei (n ist übrigens eine zuvor ermittlete Zahl).

    Nein! n wird theoretisch erst ermittelt, wenn das Programm läuft! Der Präprozessor kann aber weder C Code verstehen, noch hat er Zugriff auf den zukünftigen Dateiinhalt!
    Und auch der Compiler ist nur dafür zuständig den vom Preprozessor überarbeiteten Quelltext in Assemblersprache zu übersetzen! Der Compiler hat auch keine Ahnung, wie er zusätzliche Dateien öffnet!

    toolz schrieb:
    Ob ich jetzt noch ein Makro dafür einrichte oder nicht ist erstmal egal (im Tutorial wurde das gemacht, deshalb lasse ich es erstmal stehen).

    Welches Tutorial ist das?
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!