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 oder

    lpByteScreen = (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.
    bei

    lpByteScreen = 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.


Anmelden zum Antworten