Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

31

01.08.2014, 09:44

Wie schon gesagt: Wert von Format: 0x00fc0488
Format ist eine Struktur und die Werte der Variablen stimmen alle.
Und an m_pBitmap kann es normal auch nicht liegen, da sich diese ordnungsgemäß rendern lässt.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

32

01.08.2014, 09:58

Na wenn die Werte die du der Funktion uebergibst alle richtig sind, dann ist dein PC kaputt oder du hast die SDL Bibliothek nicht korrekt installiert.

33

01.08.2014, 15:10

Ich bin mir ziemlich sicher, dass dein Fehler außerhalb des Codes liegt, den du gepostet hast.

Das kannst du selber nachprüfen, indem du nur den Inhalt der CreateWorld() Methode in einem neuen SDL Projekt startest (ohne Klassen).
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

34

02.08.2014, 10:47

So, tut mir leid, dass ich nicht geantwortet habe, aber ich habe mir den Finger gebrochen -.-
Ich habe den Fehler wahrscheinlich gefunden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        SDL_LockSurface (m_pBitmap);


        format =  m_pBitmap->format;
        Uint32 pixel;


        pixel = get_pixel32(m_pBitmap, 0, 0);

        SDL_GetRGB(pixel, format, &r, &g, &b);

        cout << "Rot: " << (int)(r) << " Grün: " << (int)(g) << " Blau: " << (int)(b) << endl;
        cout << "BytesPerPixel: " << (int) m_pBitmap->format->BytesPerPixel;
        cout << endl;

        SDL_UnlockSurface (m_pBitmap);


Die Funktion get_pixel32 liefert den Wert 4244438265 zurück. Wenn jedoch der erste Parameter der Funktion GetRGB größer als 121011 ist, stürzt das Programm ab.

35

02.08.2014, 12:27

Was gibt denn überhaupt "BytesPerPixel" aus?

Wenn dann noch m_pBitmap->format->palette != nullptr, dann kann relativ leicht prophezeien, dass der heap verletzt wird. Aus dem Source von SDL_GetRGB():

C-/C++-Quelltext

1
2
3
4
5
6
if ( fmt->palette == NULL ) { ... }
else {
    *r = fmt->palette->colors[pixel].r;
    *g = fmt->palette->colors[pixel].g;
    *b = fmt->palette->colors[pixel].b;
}


Du versucht dann evtl. mit einem 4 Byte unsigned int (Uint32) auf eine Palette zuzugreifen, deren Farben nur für einen Bereich bis 255 (8 bpp), bis 65535 (16 bpp) oder bis 16777215 (24 bpp) festgelegt ist. Demach greifst du also auf Speicherbereich zu, der nicht zu fmt->palette->colors[] gehört. Die folgende ist eine Zugriffsverletzung und ein "Absturz".

Sollte das tatsächlich die Diagnose sein, kannst und solltest du auf die Methode aus der SDL Dokumentation zurückgreifen, die alle Bpp Varianten richtig umwandelt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
    int bpp = surface->format->BytesPerPixel;
    /* Here p is the address to the pixel we want to retrieve */
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

    switch(bpp) {
    case 1:
        return *p;
        break;

    case 2:
        return *(Uint16 *)p;
        break;

    case 3:
        if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            return p[0] << 16 | p[1] << 8 | p[2];
        else
            return p[0] | p[1] << 8 | p[2] << 16;
        break;

    case 4:
        return *(Uint32 *)p;
        break;

    default:
        return 0;       /* shouldn't happen, but avoids warnings */
    }
}
Quelle: http://sdl.beuc.net/sdl.wiki/Pixel_Access
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

36

02.08.2014, 13:59

Funktioniert das überhaupt in Zeile 18 und 20? *p ist doch ein byte, und bei dem 8 und 16 bitshift konmt doch 0 raus. Das sollte vorher nach uint32 gecastet werden, oder lieg ich falsch?

37

02.08.2014, 15:20

Es wird erst bei der Zuweisung, bzw. der Rückgabe in den entsprechenden Typ implizit gecasted.

C-/C++-Quelltext

1
2
3
Uint8 v = 0xff;
Uint8 u = v << 8; // = (Uint8)(11111111 00000000) = 00000000 = 0
Uint16 w = v << 8; // = (Uint16)(11111111 00000000) = 11111111 00000000 = 65280
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

38

04.08.2014, 10:21

DANKE iSmokiieZz!!
Ich habe jetzt die getpixel Funktion von dir benutzt und es funktioniert!!
Ich weiß nicht wieso die Funktion get_pixel32 von Lazyfoo bei mir nicht funktioniert hat :/
Danke!! Gibts hier irgeendwo nen Danke-Button, oder eine andere Möglichkeit jemanden zu danken? :thumbsup:

Werbeanzeige