sdl-problem: SDL_Rect



  • yodas schrieb:

    sdl.cpp:41: error: request for member `x' in `srect', which is of non-class type `SDL_Rect*'

    Scheint doch ein Pointer zu sein, wenn das die fehlermeldung ist...



  • also auf der seite stehts so:

    srect.x = 0;
      srect.y = 0;
      srect.w = (image->w)/2;  // das halbe Bild
      srect.h = image->h;   // das gesamte Bild
    

    und srect wird so definiert:

    SDL_Rect srect;
    

    wenn srect ein pointer wäre, müsste man das dann nicht so schreiben:

    SDL_Rect *srect;
    

    😕
    wenn ich das ganze jetzt abänder also:

    SDL_Rect *srect;
    [...]
    srect->x = 0;
      srect->y = 0;
      srect->w = (image->w)/2;  // das halbe Bild
      srect->h = image->h;   // das gesamte Bild
    

    halt so dass ich srect als pointer definiere kommt zwar keine compilerfehlermeldung mehr aber dafür wenn ich das programm starte die meldung:

    Fatal signal: Segmentation Fault (SDL Parachute Deployed)

    weiß jemand was diese fehlermeldung genau bedeutet? das programm startet nämlich ganz kurz schließt sich dann aber wieder und es kommt die fehlermeldung.

    @miller_m: wieso ist mein dateiname nicht so glücklich gewählt? weil die datei nur sdl.cpp und nichts genaueres wie sdl_test1.cpp oder so heißt?



  • also mir ist rätselhaft, warum in der Fehlermeldung SDl_Rect* steht, wenn es als SDL_Rect definiert ist (oder deklariert... wie auch immer 🙄 ). Die Fehlermeldung sagt, dass srect ein Pointer ist und deshalb keine Member haben kann.
    geloescht

    [edit:Unklarheiten in der Formulierung beseitigt]



  • deine anfangswerte passten... als ich es bei mir compiliert habe, dann hat er keinen fehler ausgespuckt.... vielleicht ist was anderes falsch? aber dann könnte ich mir die fehlermeldung nicht erklären....

    #include <SDL.h>
    #include <iostream>
    using namespace std;
    
    int main(int, char**)
    {
        SDL_Surface *screen, *flame;
    
        if(SDL_Init(SDL_INIT_VIDEO) < 0)
        {
            cout << "Konnte SDL nicht initialisieren!" << SDL_GetError();
            exit(1);
        }
        atexit(SDL_Quit);
        screen = SDL_SetVideoMode(640, 480, 16, SDL_DOUBLEBUF);
        if(screen == NULL)
        {
            cout << "Konnte den Videomode nicht setzen!" << SDL_GetError();
            exit(1);
        }
        flame = SDL_LoadBMP("Flammen.bmp");
        if(flame == NULL)
        {
            cout << "Konnte Flamme.bmp nicht laden!" << SDL_GetError();
            exit(1);
        }
    
        SDL_Rect srect;
        srect.x = 100;
        srect.y = 100;
        srect.w = (flame->w)/2;  // das halbe Bild
        srect.h = flame->h;   // das gesamte Bild
    
        SDL_BlitSurface(flame, 0, screen, &srect);
        SDL_FreeSurface(flame);
        SDL_Flip(screen);
    
        SDL_Delay(5000);
    }
    

    kannst ja das mal ausprobieren..... musst dann aber flame durch image erstzen...

    ansonsten kann ich dir folgende links noch geben für SDL:
    http://www.funkystuff.org/sdltut1.html //sind 4 kaptiel
    http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/index

    sonst noch die docs von der SDL lesen...



  • leech schrieb:

    deine anfangswerte passten... als ich es bei mir compiliert habe, dann hat er keinen fehler ausgespuckt.... vielleicht ist was anderes falsch? aber dann könnte ich mir die fehlermeldung nicht erklären....

    hab es auch ausprobiert mit g++ 3.3 lässt es sich fehlerfrei erstellen.
    ergo zeig uns dochmal deinen ganzen quellcode.



  • yodas schrieb:

    wenn ich das ganze jetzt abänder also:

    SDL_Rect *srect;
    [...]
    srect->x = 0;
      srect->y = 0;
      srect->w = (image->w)/2;  // das halbe Bild
      srect->h = image->h;   // das gesamte Bild
    

    halt so dass ich srect als pointer definiere kommt zwar keine compilerfehlermeldung mehr aber dafür wenn ich das programm starte die meldung:

    Fatal signal: Segmentation Fault (SDL Parachute Deployed)

    Is' ja auch logisch.

    Ein

    SDL_Rect srect;
    

    reserviert direkt Speicher für das struct / die Klasse.

    Ein

    SDL_Rect *srect;
    

    tut das nicht, sondern erzeugt nur einen Zeiger, der am Anfang sonstwohin zeigt.
    Wenn Du jetzt den ansprichst macht es bums.

    Tipp: Grundlagen C++ nochmal studieren! 👍



  • irgendwie funktionierts auf einmal. ich weiß nicht genau worans lag auf jeden fall hab ich versucht srect an einer anderen stelle zu definieren, was aber auch nichts gebracht hat.und dann hab ichs wieder an der ursprünhlichen stelle definiert und irgendwie funktionierts jetzt 🙂

    trotzdem nochmal der code vielleicht weiß ja einer was ich vorher falsh gemacht haben könnte:

    #include <iostream>
    using namespace std;
    #include "SDL.h"
    #include "SDL_image.h"
    
    int main()
    {
    	SDL_Surface *display;
    	SDL_Surface *image;
    
    	if (SDL_Init(SDL_INIT_VIDEO)<0)
    	{
    		cerr<<"SDL konnte nicht initialisiert werden!"<<endl<<SDL_GetError();
    		exit(1);
    	}
    	cout<<"SDL erfolgreich initialisiert!"<<endl;
    
    		atexit(SDL_Quit);
    
    	display = SDL_SetVideoMode(800, 600, 16, SDL_SWSURFACE);
    	if (display == NULL)
    	{
    		cerr<<"Fenster konnte nicht geöffnet werden!"<<endl;
    		exit(1); 
    	}
    	cout<<"Fenster konnte geöffnet werden!"<<endl;
    
    	image = IMG_Load("tux.jpg");
    	if (image == NULL)
    	{
    		cerr<<"Bild(tux.jpg) konnte nicht geladen werden!"<<endl;
    		exit(-1);
    	}
    	cout<<"Bild(tux.jpg) erfolgreich geladen!"<<endl;
    
    	SDL_Rect srect;
    	srect.x = 0;
    	srect.y = 0;
    	srect.w = (image->w)/2;
    	srect.h = image->h;
    
    	SDL_Rect drect;
    	drect.x=200;
    	drect.y=100;
    	drect.w=(image->w)/2;
    	drect.h=image->h;
    
    	SDL_BlitSurface(image, &srect, display, &drect);
    	SDL_UpdateRects(display,1,&drect);
    
    	SDL_Delay(3000);
    
    	SDL_FreeSurface(image);
    }
    

    danke für die vielen antworten 👍



  • Ein

    C/C++ Code:
    SDL_Rect srect;
    C/C++ Code:
    SDL_Rect srect;

    reserviert direkt Speicher für das struct / die Klasse.

    Ein

    C/C++ Code:
    SDL_Rect *srect;
    C/C++ Code:
    SDL_Rect *srect;

    tut das nicht, sondern erzeugt nur einen Zeiger, der am Anfang sonstwohin zeigt.
    Wenn Du jetzt den ansprichst macht es bums.

    stimmt. hätt ich auch selber drauf kommen können.

    Tipp: Grundlagen C++ nochmal studieren!

    Bin ich eh grad dabei 😉



  • Sorry wenns Besserwisserisch klingt, sowas ist mir selber auch schon passiert, aber: Immer ganz genau lesen, wie die Fehlermeldung lautet, dann sieht man auch leicht die Fehler. Schlecht ist nur, wenn ein Klammerfehler 20 Fehler nach sich zieht, weil der Compiler das nicht richtig erkennt (passiert mir immer)
    geloescht



  • ja. sowas ähnliches ist mir auch schon öfters mal passiert, bloß irgendwie liest man sich dann alles immer noch mal durch und denkt sich wo der fehler liegen könnte bloß auf die grundlegensten sachen(an denen es dann so gut wie immer liegt) komm ich dann meist nie 😞

    @leech: nochma danke für die links die scheinen echt gut zu sein 👍


Anmelden zum Antworten