SDL(Mehrere Functionen und cpp dateien)
-
Eigentlich ist es das selbe, da du den Prototyp ja vor deiner Funktion deklarierst. Allerdings solltest du schon alleine wegen der Sauberkeit auf Source ( CPP, CC, C ) und Header ( H ) zurückgreifen. Vorallem kannst du ein Headerfile mehrfach includen, während du mit dem Prototyp vor deinem Programm in mehreren Dateien ärger bekommen könntest, wegen "Object multiple defined" oder so.
-
Hi,
hmmm um ganz ehrlich zu sein hab ich noch nie wirklich
mit .h files gearbeitet, weis jetzt auch gar nicht genau
was ich darin alles machen kann, aber ich hab hier genügend literatur
und werd die Lücke stopfen.SnorreDev shrieb:
solltest du schon alleine wegen der Sauberkeit auf Source ( CPP, CC, C ) und Header ( H ) zurückgreifen.Hab ich wohl nicht richtig dazugeschrieben:(so ist es also in echt)
MAIN.cpp
#include <iostream.h> int printfunction(); int main(){ printfunction(); return 0; }
Printfunction.cpp
C/C++ Code: #include <iostream.h> int printfunction(){ cout << "Es geht also"; return 0; }
cu max
-
Hi.
Ist das nun das gleiche?Vielen dank im vorraus.
cu max
-
Hi,
da niemand antwortet, vermute ich jetzt einfach mal dass
meine Theorie ein völliger schwachsinn ist, welcher
nie das Licht des Bildschirms erblicken hätte sollen.
Trotzdem danke.Wäre nett, wenn mir jemand einen Link zu nem Tut oder soetwas
geben könnte.cu max
-
Hi,
hab gegooglet.
http://www.codeworx.org/cpp_tuts_1_5.php
für alle denen Multithreading noch ein Rätsel ist.cu max
-
ich glaubr das problem is, niemand weiß wo eigentlich dein problem liegt.
-
Hi,
ich weiß in Foren drücke ich mich
oft sehr umständlich aus.Mein Problem ist, das der erste code
nicht läuft(angeblich wegen Multithreading)
(Die Fehler sind rausgebügelt)Aber ich bekomme diese
Fehlermeldung:
**--------------------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)
**Obwohl dieser Code auch läuft
MAIN.cpp#include <iostream.h> int printfunction(); int main(){ printfunction(); return 0; }
Printfunction.cpp
#include <iostream.h> int printfunction(){ cout << "Es geht also"; return 0; }
Ich tue ja in beiden Dateien vom Prinzip her dasselbe,
ich rufe eine Function aus einer anderen C++ datei auf,
mit der ich auch davor Prototyping betrieben habe.
Aber es heißt ja, das währe C++ Grundwissen, nun aber
unter C++ läuft es ja.Also, nun langsam dämmert es mir warum es nicht geht
Ich habe den C++ code in einer DOS-Box ausgeführt, der einfacheheit
zur liebe, aber DOS benötigt kein Multithreading, während eine Win32-
Anwendung dies zwingend benötigt.cu max
-
Und wo liegt jetzt genau dein Problem?
Gruß M.
-
Hi,
erstmal um das zu klären:Dr.GreenThumb schrieb:
Das hat ja auch nix mit der SDL zu tun, dass sind C/C++ Grundlagen.17.06.03:HummeSikkins schrieb:
Standard-C++ kennt keine Threads, aber die SDL hat doch eine schöne HP:Ok, also Threading ist kein C++ Grundwissen.
Mein Verständnissfrage hat sich damit nun auch erledigt,
Threading braucht man halt in SDL.cu max
-
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.aspAlso 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!).:Dcu 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...