PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VC++ 2005: Error C2057 in d3d9types.h


Neomi
2006-07-02, 22:45:15
Wenn ich mit dem aktuellen DirectX 9.0c SDK (Juni 2006) eine D3D9-Applikation durch den Compiler jage, erhalte ich den Fehler "C2057: expected constant expression". Das ist der Code (vom SDK, nicht meiner), der den Fehler auslöst (die kursiven führen zum Fehler in der fettgedruckten Zeile):

typedef enum _D3DRESOURCETYPE {
D3DRTYPE_SURFACE = 1,
D3DRTYPE_VOLUME = 2,
D3DRTYPE_TEXTURE = 3,
D3DRTYPE_VOLUMETEXTURE = 4,
D3DRTYPE_CUBETEXTURE = 5,
D3DRTYPE_VERTEXBUFFER = 6,
D3DRTYPE_INDEXBUFFER = 7,

D3DRTYPE_FORCE_DWORD = 0x7fffffff
} D3DRESOURCETYPE;

#define D3DRTYPECOUNT (D3DRTYPE_INDEXBUFFER+1)

typedef struct _D3DDEVINFO_RESOURCEMANAGER
{
D3DRESOURCESTATS stats[D3DRTYPECOUNT];
} D3DDEVINFO_RESOURCEMANAGER, *LPD3DDEVINFO_RESOURCEMANAGER;

Alle Sourcendateien werden als C++ compiliert, nicht als C, daran kann es also nicht liegen. Ich kann zwar die Definition einfach zu einer Konstanten abändern (als ob die jetzige nicht konstant wäre...), aber das kann ja wohl kaum die Lösung sein. Gibt es irgendwelche speziellen Settings in VC++ 2005, die man da beachten muß? Im Netz habe ich auch nur den einen Workaround gefunden, den ich gerade genannt hatte, aber keine saubere Lösung.

Awesomo
2006-07-03, 00:28:47
verwendest du die vc++ express edition? dann benötigst noch die platform sdk

http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/


und hast die vc++ directories vollständig hinzugefügt für dx sdk (und platform sdk)?

tools->options->projects+solutions->vc++ directories

Executable files
Include files
Library files

vielleicht hilfts ja ^^

Neomi
2006-07-03, 02:04:08
Ich nutze 2005 Pro. Mit dem Platform SDK hat das nicht wirklich was zu tun, mit fehlenden Verzeichnissen auch nicht, das ist schon rein Compiler-intern. Ich habe es jetzt vorerst mal in der d3d9types.h geändert und als Workaround kommentiert.

Coda
2006-07-03, 14:23:35
Sehr strange das Ding. Ich finde auch keinen Fehler - auch nicht wenn ich mehrmals hinschaue :|

Kann man irgendwie anschauen was der Präprozessor ausspuckt in Visual C++?

TheGamer
2006-07-03, 15:57:08
Coda[/POST]']Sehr strange das Ding. Ich finde auch keinen Fehler - auch nicht wenn ich mehrmals hinschaue :|

Kann man irgendwie anschauen was der Präprozessor ausspuckt in Visual C++?

Kann eingetlich doch auch nicht sein oder? Ich meine egal weche Meinung man über MS hat, aber das SDK kommt von MS und müsste doch schon vielen leuten aufgefallen sein. Bei mir trat das noch nie auf und ich hab das SDK (auch June 06) jeden tag @work in use

Awesomo
2006-07-03, 16:47:00
bist nicht der erste mit diesem problem:

http://www.gamedev.net/community/forums/topic.asp?topic_id=350137&forum_id=10&gforum_id=0

Matrix316
2006-07-03, 20:14:08
Kann man zu Enum was hinzuaddieren? Enum ist doch quasi "Constant (-Integer)".

Neomi
2006-07-03, 21:51:05
Awesomo[/POST]']bist nicht der erste mit diesem problem:

http://www.gamedev.net/community/forums/topic.asp?topic_id=350137&forum_id=10&gforum_id=0

Nachdem ich meinen funktionierenden Workaround hatte, bin ich auf die Suche nach einer saubereren Lösung gegangen und bin auf genau diese Seite gestoßen. Aber mehr als der gleiche Workaround war da ja auch nicht.

Matrix316[/POST]']Kann man zu Enum was hinzuaddieren? Enum ist doch quasi "Constant (-Integer)".

Klar kann man da was zuaddieren, man benutzt den Enum ja nur als RValue und verändert ihn dadurch nicht.

Ich habe eben in einem kleines Testprojekt mal versucht, mit Minimalaufbau das Problem nachzustellen, aber es tritt nicht auf. Gleiche Projektsettings, gleiches Visual Studio, anderes Verhalten. Seltsame Sache das.

del_4901
2006-07-03, 21:53:37
hast du vllt. namespace-Konflikte Neomi?

Neomi
2006-07-03, 22:27:44
AlphaTier[/POST]']hast du vllt. namespace-Konflikte Neomi?

Nein, keine Konflikte, nichts in der Richtung. Aber es scheint an der Reihenfolge zu liegen, in der ich Headerdateien inkludiere. Jetzt habe ich die "d3d9.h" in den Hauptheader des Projektes gleich unter "windows.h" gepackt (drüber klappt genauso), und es gibt keine Probleme mehr.

Die Headerdateien dazwischen konnten eigentlich keine Fehler verursacht haben. Keine Namespace-Kollision, keine redefinierten Konstanten oder Typen, vor dem Fehler nicht eine einzige Warnung. Und ich habe die Warnungen sehr restriktiv eingestellt (Code ist trotzdem frei davon). Ich werde mal ein wenig weiter schauen, welche meiner Header es genau auslösen.

Neomi
2006-07-03, 23:16:20
Den Übeltäter habe ich gefunden, es ist ein Expression-Template aus meiner Vektormathematik-Bibliothek:

template <class NExp1, class NExp2>
inline const FloatX::FloatX_Exp2 <NExp1, NExp2, FloatX::FloatX_Add> operator + (const NExp1 & Exp1, const NExp2 & Exp2)
{
return (FloatX::FloatX_Exp2 <NExp1, NExp2, FloatX::FloatX_Add> (Exp1, Exp2));
}

Der Compiler kann zwar eine Enum-Ausprägung mit einem Integer addieren, nahm aber dank vorheriger Definition lieber dieses nicht konstante Expression-Template. Leider lassen sich Templates nicht wirklich effektiv einschränken, deshalb kommt es auf die Reihenfolge der Headereinbindung an.