Absolute Einstiegsfragen ... SDL, SDL_Surface, Zeiger oder wat?!



  • Hi freaks! :p

    Bin Neueinsteiger im Gebiet SDL, Wiedereinsteiger in C++, wobei ich nie was großes in C/C++ programmiert habe, also nie tief in die Materie eingetaucht bin, aber über Grundlagenwissen verfüge ich.

    Aber eben doch nur bis zu einem relativ geringen Grad, weshalb ich auch schon kaum dass ich angefangen habe meine ersten SDL Programme gemäß eines Tutorials zu schreiben & zu verstehen(!), auf die ersten Verständnisprobleme stoße...

    Die Fragen sind wirklich Erstklässlerfragen, deshalb hoffe ich auch schwer dass mir jemand helfen kann 😉 !

    Und zwar habe ich folgenden Code am Anfang meiner cpp-datei:

    #include <SDL/SDL.h>
    #include <string>
    
    ...
    
    SDL_Surface *message=NULL;
    SDL_Surface *background=NULL;
    SDL_Surface *screen=NULL;
    
    SDL_Surface *load_image(std::string filename)	{
    	SDL_Surface* loadedImage=NULL;
    	SDL_Surface* optimizedImage=NULL;
    ...
    

    FRAGE NUMMER EINS:
    Nun verstehe ich SDL_Surface message=NULL so: Lege einen Zeiger mit dem Namen "message" an, der vom Typ SDL_Surface ist, und lass diesen zunächst auf Null(also auf nix) Zeigen.
    Was bedeutet aber nun im Gegensatz dazu vier Zeilen weiter unten
    SDL_Surface loadedImage=NULL
    ???? Wo ist der unterschied zwischen "x *y" und "x* y", also wieso wird hier das * hinter das SDL_Surface gesetzt??? Was bedeutet das?

    FRAGE NUMMER ZWEI
    Was meint *SDL_Surface load_image(std::string filename){...} ?
    Wird hier ein Zeiger auf eine METHODE erstellt oder wie?

    Hoffe ich bin hier richtig mit diesen trivialen Problemchen...!!!

    Danke schonmal für die Hilfe von Euch!

    ps: habe versch. websites, sowie Bücher über C/C++, natürlich benutze ich außerdem die SDL-Dokumentation, konnte aber aus nix richtig schlau werden was diese Fragen angeht...



  • Zu 1)
    Die beiden Schreibweisen für Zeiger sind äquivalent. Grundsätzlich darf man zwischen Operatoren soviele Abstände machen, wie man will. Nur zu wenig ist nicht gut. Du hast z.B. folgende Möglichkeiten:

    ptr* var;
    ptr *var;
    ptr * var;
    ptr*var;
    ptr                          *      var;
    

    Ich finde die erste am übersichtlichsten, da man sie klar von der Dereferenzierung unterscheiden kann und gleich den Typen der Variable ( ptr* ) sieht.

    Zu 2)
    Da wird eine Funktion ("Methode" sagt man eher im Zusammenhang mit Klassen) definiert. Vielleicht solltest du dich noch ein wenig dazu einlesen, denn Funktionen sind wohl etwas vom Grundlegendsten. 😉

    Gute Bücher zu C++ sind z.B. der C++ Primer oder Thinking in C++ 1&2 (gibt es auch gratis als Online-PDF). Oder du kannst auch ein Tutorial wie das hier verwenden.



  • Nexus schrieb:

    Du hast z.B. folgende Möglichkeiten:

    ptr* var;
    ptr *var;
    ...
    

    Ich finde die erste am übersichtlichsten, da man sie klar von der Dereferenzierung unterscheiden kann und gleich den Typen der Variable sieht.

    Die zweite Schreibweise ist konsistenter weil der "Zeiger" syntaktisch zum Variablennamen gehoert.
    So ist nicht erkennenbar, dass die Variablen unterschiedlichen Typs sind:

    char* a,b;
    

    Aber alles Geschmackssache.



  • ich finde die erste schreibweise konsistenter, denn * ist teil der typendeklaration.
    entsprechend schreib ich auch nicht

    int* a,*b;
    

    sondern

    int* a;
    int* b;
    

    ;

    sieht man auch daran, dass man man auch in der deklaration von parametern bei funktionen die namen weglassen kann, aber nicht den typen.

    class foo
    {
         foo(void*,int*,foo*);
    }
    

    int und int* ist was anderes



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Okay, super danke schonmal soweit für die Hilfe - nun weiss ich, dass es keinen Unterschied macht ob man x* y oder x *y verwendet (also funktionell keinen Unterschied 😉 )

    Zu 2)
    Da wird eine Funktion ("Methode" sagt man eher im Zusammenhang mit Klassen) definiert.

    So hab ich das ja auch Verstanden, dass eine Funktion definiert wird (weiss dass Methoden der Begriff aus der OO/Klassenthematik ist :)) nur versteh ich nicht, was der ***** hier soll?
    Man könnte die Funktion doch auch so einführen

    SDL_Surface load_image(std::string filename) {...}
    

    (also ohne den * vor dem Namen der Funktion)

    Was bedeutet das?



  • Das * gibt eben an, dass ein Zeiger zurückgegeben wird. Der Rückgabetyp ist in deinem Fall SDL_Surface* , also ein Zeiger auf eine SDL_Surface .

    hellihjb schrieb:

    Die zweite Schreibweise ist konsistenter weil der "Zeiger" syntaktisch zum Variablennamen gehoert.
    So ist nicht erkennenbar, dass die Variablen unterschiedlichen Typs sind:

    char* a,b;
    

    Dieses Argument kommt so ziemlich immer und ist auch entsprechend irrelevant, wenn man keine Mehrfachdeklarationen hat. Aber wie du sagst, Geschmackssache. 😉



  • Aaaahhh! Na logo! 😃
    Super, danke!


Anmelden zum Antworten