SDL(Mehrere Functionen und cpp dateien)



  • Hi,
    http://sdldoc.csn.ul.ie/thread.php
    da wird´s erklärt, leider einglisch. 😞

    cu max



  • Du hast wohl die SDL-Library nicht mitgelinkt.



  • Hi,
    sdlmain.lib+sdl.lib sind wie immer gelinkt, die
    findet er ja auch.

    Jetzt herrscht bei mir mal wieder absolute verwirrung 😕
    In wiefern benötige ich jetzt Threads in meinem Programm?

    Und nocheinmal, weil ich vielleicht doch zu blöd bin zu
    erklären was ich meine. Mit dem ersten code, war natürlich
    der Fehlerverbesserte von seite 1 gemeint.(Geb ihn euch nachher)

    cu max



  • Hi,
    hier nun der veränderte code der nur noch drei Fehler verursacht:
    (--------------------Konfiguration: code - Win32 Debug--------------------
    Linker-Vorgang läuft...
    code.obj : error LNK2001: Nichtaufgeloestes externes Symbol "struct SDL_Surface * screen" (?screen@@3PAUSDL_Surface@@A)
    Pyramidal-Engine.obj : error LNK2001: Nichtaufgeloestes externes Symbol "struct SDL_Surface * screen" (?screen@@3PAUSDL_Surface@@A)
    Debug/code.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    code.exe - 3 Fehler, 0 Warnung(en) )

    Der Code ist in folgende zwei .cpp dateien eingeteilt.
    Code.cpp

    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream.h>
    #include <SDL.h>
    #include "Pyramidal-Engine-Header.h"
    
    //Präprozessor befehle die leider nötig sind damit SDL läuft.
    #ifdef _WIN32
    #undef main
    #endif
    
    void SetDisplayMode();
    int ShowBMP(char *file, int x, int y, SDL_Surface *window);
    
    //Hauptschleife
    int main(){
    
        int running;
    
    	//Das SDL Subsystem SDL_INIT_VIDEO wird in einer if anweisung initialisiert.
    	//Der Befehl SDL_Init() muß in jedem SDL-Programm vor allen anderen SDL-Funktionen aufgerufen werden
    	//Der einzige Parameter gibt an, welche Teile von SDL verwendet werden. Für dieses Beispiel brauchen wir nur den Graphikteil 
    
    	if(SDL_Init(SDL_INIT_VIDEO)<0){
    		printf("SDL konnte nicht gelade nwerden\n");
    	}
    	else{
    		printf("SDL wurde geladen");}
    
    	//Aufruf der Funktion SetDisplayMode aus der Pyramidial-Engine
    	SetDisplayMode();
        //Aufruf der Funktion ShowBMP(Aus der Pyramidial-Engine)
    	ShowBMP("FireWarrior.bmp",10,10,window); 
    
    //Programmschleife
        running = 1;
        while(running==0) {
            SDL_Event event;
    
            while(SDL_PollEvent(&event)) {
                switch(event.type) {
                case SDL_KEYDOWN:
                    running = 0;
                    break;
                case SDL_QUIT:
                    running = 0;
                    break;
                }
            }
        }
    
    	//Das Gegenstück zu SDL_Init() ist SDL_Quit(). SDL_Quit() muß immer am Ende eines Programms 
    	//aufgerufen werden. Ansonsten kann es z.B. vorkommen, daß der Bildschirmmodus nicht richtig 
    	//zurückgesetzt wird. Es könnten auch Memoryleaks entstehen, da Speicher nicht ordnungsgemäß
    	//freigegeben wird.
    
    	//SDL wird  aus dem Speicher entfernt
    	atexit(SDL_Quit);
    
    	//und das laufende programm beendet
    	return 0;
    }
    

    Pyramidial-Engine.cpp

    //Pyramidial-Engine.cpp
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream.h>
    #include <SDL.h>
    #include "Pyramidal-Engine-Header.h"
    
    /* screen und running werden später verwendet */
    //Pyramidalengine(2D)Teil
    
    void SetDisplayMode(){
    	window=SDL_SetVideoMode(1024,768,32,SDL_FULLSCREEN);//SDL stellt die Auflösung des Bilschirmes auf
    	//1024,768,32 und wechselt in den FULLSCREEN Modus also ins Große Bild(Die konsole ist unsichtbar).
    	if(!window){//If anweisung fals der Bildschirmmodus nicht gesetzt werden kann.
    
    	printf("Konnte Bildschirmmodus nicht setzen\n");
    
    	exit(-1);
    
    	}
    }
    
    int ShowBMP(char *file, int x, int y, SDL_Surface *window) //statt window
    
    { 
    
    SDL_Surface *bitmap; 
    
    SDL_Rect dest;
    
    /* Eine Abfangen von möglichen Fehler */ 
    
    if((bitmap=SDL_LoadBMP(file))==NULL) 
    
    {  
    
    fprintf(stderr,"Error: %s\n",SDL_GetError()); 
    
    return -1; 
    
    } 
    
    dest.x=x; 
    
    dest.y=y; 
    
    dest.w=bitmap->w; 
    
    dest.h=bitmap->h; 
    
    SDL_BlitSurface(bitmap,NULL,window,&dest); 
    
    SDL_UpdateRects(window,1,&dest); 
    
    return 0; 
    
    }
    

    Und die Headerdatei Pyramidial-Engine-Header.h

    extern SDL_Surface *window;
    

    cu max



  • Hi,
    hab nun im WinAPI-Board was gefunden.(Leider WinAPI, aber es gibt auch
    ne SDL möglichkeit, blos net so gut erklärt)
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_crt__beginthread.2c_._beginthreadex.asp

    Also brauch ich nun Threads?

    cu max



  • Ich hab' keinerlei Ahnung, was Du noch überhaupt von uns willst... 🙄

    Hast Du immmer noch Probleme beim Linken!??!
    Oder verstehst Du nur "Threads" nicht!??

    Falls ersteres: Hast Du jetzt multithreaded eingestellt oder nicht?!?



  • //Doppen Thread(sorry)



  • Hi,
    also da nun wirkliche Verwirrung herrscht, was mir leid tut.
    Auf seite 1 stand die veränderte version des codes würde nicht
    gehen, da ich nicht mit Threads arbeite.Nun dachte ich zuerst
    auch das man Multithreading einstellen kann, doch dann schrieb
    Dr.GreenTumb(hoffe richtig geschrieben)das Multithreading
    C++ Grundwissen sei.(Also hab ich mich damit befasst und bin
    hier im Forrum auf einen Thread über (Multi?)Threading gekommen.
    Ich habe angenommen, das ich die Function SDL_CreateThreade
    dafür benutzen soll und ich habe angenommen dass
    man Threading benötigt um Functionen aus anderen .cpp dateien
    aufrufen zu können.(zumindestens unter SDL, den mit C++ ging es ja.)

    Dann habe ich ein Programm(versuchsmäßig) in C++ gecodet um zutesten
    ob man in C++ functionen aus anderen .cpp dateien aufrufen kann(ohne Threading)
    und bin zum Schluss gekommen dass dies Functioniert.

    Ich bitte nocheinmal um Nachsicht über meine blöde art mich in
    Foren zu artikulieren, es tut mir leid aber ich werde versuchen
    meine ausdrucksweise in Zukunft zu verändern.

    Seargent Nukem schrieb:
    Ich hab' keinerlei Ahnung, was Du noch überhaupt von uns willst...

    Ich will wissen was (Multi)Threading ist, wofür ich es verwenden muss,
    kann oder soll und wie ich es einstellen oder Programmieren kann.

    Vielen dank im vorraus

    cu max



  • Master_Max schrieb:

    dachte ich zuerst
    auch das man Multithreading einstellen kann, doch dann schrieb
    Dr.GreenTumb(hoffe richtig geschrieben)das Multithreading
    C++ Grundwissen sei.(Also hab ich mich damit befasst und bin
    hier im Forrum auf einen Thread über (Multi?)Threading gekommen.
    Ich habe angenommen, das ich die Function SDL_CreateThreade
    dafür benutzen soll und ich habe angenommen dass
    man Threading benötigt um Functionen aus anderen .cpp dateien
    aufrufen zu können.(zumindestens unter SDL, den mit C++ ging es ja.)

    Nein,

    1. falsch geschrieben
    2. bringst du da was durcheinander.

    Meine 'Grundwissen-Aussage' bezog sich auf die Einteilung auf mehrere Dateien, wollte damit nur sagen dass du für sowas in den SDL-Dokumentationen nicht viel finden wirst.

    Ausserdem brauchst du gar keine Threads. Es ist wohl so, dass die SDL automatisch einen Thread im Hintergrund erstellt. Als SDL-Anwender bekommt man davon eigentlich gar nichts mit und SDL_CreateThread oder sowas braucht man nicht um die SDL benutzen zu können.

    Einzige Problematik, offenbar muss man dem VC++ extra sagen wenn eine Anwendung mehrere Threads verwendet. Das ist dann nur ein Compilerproblem. Musst halt das entsprechende Häkchen setzen.



  • Hi,
    danke.
    Sorry, dass ich was durcheinander gebracht habe.
    Ich werd mich mal auf die suche nach dem magischen Häckchen begeben.

    PS: Sorry für die falsche Schreibweise, ich bin dann auch immer tagelang
    deprimiert und traue mich nicht mehr aus dem Haus(ich kenne das!).:D

    cu max



  • Okay.
    Also ein "Thread" ist - übersetzt - ein "Faden"...
    D.h. Dein Programm wird aus einem dicken Seil in mehrere "Fäden" aufgesplittet, die dann völlig unabhängig voneinander laufen. Bis diese Fäden dann halt gekillt werden oder wieder mit dem Hauptprogramm verflochten oder so.
    Wenn Du Netzwerk-Unterstützung haben willst z.B., mußt Du Threads benutzen.
    Du brauchst min. 2. Einer ist Dein Hauptprogramm, das berechnet die Grafik und schickt frische Daten über's Netz an andere Mitspieler, der andere Thread wartet auf Daten aus dem Netz und holt sie aus dem Empfangspuffer. Wenn Du nur einen Thread hättest, könnte - falls die Grafikrechnerei zu lange dauert - der Empfangspuffer überfüllt werden und dann wichtige Daten verlorengehen, z.B. ...

    Mit Threads kann man z.B. auch erreichen, daß "im Hintergrund" nachgeladen wird.

    Die Programme die Du laufen lässt sind im Prinzip (unter Windows) auch einzelne Threads, sie nennt man halt Prozesse. Während ICQ im Hintergrund Daten empfängt kannst Du "gleichzeitig" drucken und 'n Porno gucken (oder so) 😉

    Du selbst wirst - wie gesagt - bei SDL keine Threads benutzen müssen bzw. selber erstellen.
    SDL muß aber "multithreaded" mit den MFC (?) Klassen gelinkt werden.
    Wie gesagt kannst Du das irgendwo unter Compiler-/Linker-Options einstellen, daß ist leider bei VC++ 6 und .NET 7 und jedem anderen auch wieder anders, also mal kurz suchen...



  • Hi,
    vielen dank.
    Das Häckchen hab ich gefunden und hab nur noch
    einen Fehler, werd ich schon selber bügeln können.
    Tut mir leid das ich so viel Lärm um nichts gemacht habe.

    cu max

    PS:Sgt.Nukem schrieb:'n Porno gucken (oder so) 😉
    Würde ich doch nie tuen 😉 😮 😮 😮



  • Master_Max schrieb:

    PS:Sgt.Nukem schrieb:'n Porno gucken (oder so) 😉
    Würde ich doch nie tuen 😉 😮 😮 😮

    Will's hoffen...

    Ab ins Bett! 😉


Anmelden zum Antworten