Problem mit DDSURFACEDESC2.lpSurface
-
Hallo, ich lese gerade ein Tutorial, das die Grundlagen von DIrectx erklärt ( auf Dx7 basierend).
Nun soll ein Surface mit Werten gefüllt werden :
//der Pointer BYTE *lpByteScreen; lpDPaint7->Lock(NULL,&DDPaintDesc2,DDLOCK_WAIT,NULL) //den Pointer an den Anfang des Surfaces setzen lpByteScreen = DDPaintDesc2.lpSurface; //hier wird das Surface mit werten gefüllt for (i=0;i<50;i++); { *lpByteScreen =255; lpByteScreen++; }Das Problem liegt auf der Hand :
lpByteScreen ist ein zeiger auf einen Char, während DDPaintDesc2.lpSurface vom Typ 'Void' ist.
Deshalb erhalte ich auch eine Fehlermeldung, dass 'unsigned char*' nicht zu 'void*' konvertiert werden könne.Dieser Code steht so in diesem Tutorial drin, will aber von meinem Compiler nicht kompiliert werden. Wie könnte ich das berichtigen ?
-
Indem du den Typ selbst "konvertierst" (casten).
Bye, TGGC (Keine Macht den Dummen)
-
Hi,
der Code sicher für einen C-Compiler gedacht.C++ ist da etwas rigider.
Da musst du explizit casten. (entweder mit reinterpret_cast oderlpByteScreen = (void*)DDPaintDesc2.lpSurface;
-
ich denke mal, du meinst
lpByteScreen = (byte*)DDPaintDesc2.lpSurface;damit funktioniert es nämlich.
VIelen Dank

-
sbrog schrieb:
ich denke mal, du meinst
lpByteScreen = (byte*)DDPaintDesc2.lpSurface;damit funktioniert es nämlich.
Nein, denn dann hast _du_ die Frage falsch gestellt.
Bye, TGGC (Keine Macht den Dummen)
-
bei
lpByteScreen = (byte*)DDPaintDesc2.lpSurface;wird doch DDPaintDesc2.lpSurface in (*byte) umgewandelt, und dann in lpByteScreen geschrieben, oder ?
-
sbrog schrieb:
bei
lpByteScreen = (byte*)DDPaintDesc2.lpSurface;wird doch DDPaintDesc2.lpSurface in (*byte) umgewandelt, und dann in lpByteScreen geschrieben, oder ?
Ja, aber "umwandeln" klingt leicht missverständlich - nach meiner Meinung, jedenfalls.
Eher: Der Pointer wird vom Compiler als 'BYTE*' angesehen.
-
Hallo, ich habe immer noch ein kleines Problem.
Ich selber kann keinen Fehler entdecken.
beilpByteScreen = reinterpret_cast<*byte>(DDPaintDesc2.lpSurface;wird lpByteScreen an den anfang von lpSurface gesetzt
In dieser Schleife wird dann der Wert, auf den lpByteScreen zeigt, auf 255 gesetzt, danach zeigt lpByteScreen auf das nächste Byte, liege ich da richtig ?
for (i=0;i<50;i++); { *lpByteScreen =255; lpByteScreen++; }Trotzdem kann ich nichts erkennen, wenn ich das Surface auf den Bildschirm blitte, obwohl durch die Bytemanipulation eine Weisse Linie entstehen müsste.
-
Welchen Farbmodus hast du? 32 Bit?
Unlockst du auch wieder die Surface vor dem Blit?
Blittest du ohne Größenveränderung oder mit Stretching?Wenn du im 32BPP bist, dann probier mal spaßenshalber ne 127 statt 255.