SDL(Mehrere Functionen und cpp dateien)
-
Hi,
ich hab leider im moment ein problem mit SDL.
Nach dem rat mir eine eigene Minni engine schreiben zu sollen,
hab ich mir mal den Code von Fehat Zibats 2tem Tutorial kopiert
(Weil mein eigener mit Globalen Variablen nicht funzen wollte.)
Doch der geht auch nicht.
(Also die main und der init sind meine)und sollten gehenFolgende fehlermeldungen bekomme ich angzeigt.
//Nur ausm Geist. also vielleicht fehlt eine:**
------------------Konfiguration: code - Win32 Debug--------------------
Kompilierung läuft...
code.cpp
C:\Programme\Microsoft Visual Studio\MyProjects\SDLselfmades\code.cpp(36) : error C2065: 'screen' : nichtdeklarierter Bezeichner
Pyramidal-Engine.cpp
C:\Programme\Microsoft Visual Studio\MyProjects\SDLselfmades\Pyramidal-Engine.cpp(32) : error C2065: 'SDL_Dest' : nichtdeklarierter Bezeichner
C:\Programme\Microsoft Visual Studio\MyProjects\SDLselfmades\Pyramidal-Engine.cpp(32) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'dest'
C:\Programme\Microsoft Visual Studio\MyProjects\SDLselfmades\Pyramidal-Engine.cpp(32) : error C2065: 'dest' : nichtdeklarierter Bezeichner
C:\Programme\Microsoft Visual Studio\MyProjects\SDLselfmades\Pyramidal-Engine.cpp(46) : error C2228: Der linke Teil von '.x' muss eine Klasse/Struktur/Union sein
C:\Programme\Microsoft Visual Studio\MyProjects\SDLselfmades\Pyramidal-Engine.cpp(48) : error C2228: Der linke Teil von '.y' muss eine Klasse/Struktur/Union sein
C:\Programme\Microsoft Visual Studio\MyProjects\SDLselfmades\Pyramidal-Engine.cpp(50) : error C2228: Der linke Teil von '.w' muss eine Klasse/Struktur/Union sein
C:\Programme\Microsoft Visual Studio\MyProjects\SDLselfmades\Pyramidal-Engine.cpp(52) : error C2228: Der linke Teil von '.h' muss eine Klasse/Struktur/Union sein
Fehler beim Ausführen von cl.exe.code.exe - 8 Fehler, 0 Warnung(en)
**
//Inhalt der Code Cpp: #include <stdlib.h> #include <stdio.h> #include <iostream.h> #include <SDL.h> //Präprozessor befehle die leider nötig sind damit SDL läuft. #ifdef _WIN32 #undef main #endif void SetDisplayMode(); int ShowBMP(); //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("foit logo 4.bmp",0,0,screen); //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:(Blöder Name ich weis, aber das steht im FremdwörterLexikon
und es heißt rießig, gigantisch...,
und das dass ding wie ne Pyramide mal aufgebaut sein soll,
also mit unterteileten Sub-Engines in Pyramiden form)//Pyramidial-Engine #include <stdlib.h> #include <stdio.h> #include <iostream.h> #include <SDL.h> SDL_Surface *screen; /* screen und running werden später verwendet */ //Pyramidalengine(2D)Teil void SetDisplayMode(){ screen=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(!screen){//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) { SDL_Surface *bitmap; SDL_Dest 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,screen,&dest); SDL_UpdateRects(screen,1,&dest); return 0; }
Ich würde mich sehr freuen wenn mir jemand helfen kann.
PS:Sorry, dass die Kommentare so alt sind und nur noch bedingt,
bis überhaupt nicht stimmen.
cu max
-
Müßte das destination Rect nicht vom Typ SDL_Rect sein? SDL_Dest gibt es so nicht, außer du machst ein Typedef auf SDL_Rect.
2. Hast du das SDL_Surface *screen in einen so in einen header gepackt?
extern SDL_Surface *screen;Sonst kann der Compiler doch nix wissen.
Außerdem mußt du dann das passende Headerfile includen.
-
Hi,
erteinmal vielen dank.
SDL_Dest stand so im Tutorialcode.
Von den Headern hab ich nichts gewusst, sorry.
Vielen dank für die Hilfe, werd´s gleicheinmal testen.cu max
-
Hi,
vielen dank @SnorreDev.Die 8Fehler sind verschwunden und
er fängt auch an zu Linken, doch dann kommt noch eine Fehlermeldung.
(Ich denke ich bin auf den Kopf gefallen, denn es scheint so das
nichts was ich tue funktioniert und mein dasein begründet)
**--------------------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)
**
Gut, ich weiß das ist nun sicher ein absuluter Anfängerkram,
denn es hat sicher etwas mit dem Include File au sich.Tut mir leid wenn ich euch nerve, vielleicht will mir trotzdem
jemand antworten, wenn dem so sei, vielen dank im vorraus.cu max
-
Linke die SDL Library mit, dann ist das Problem weg. Und bei VC mußt du das ganze als Multithreaded laufen lassen wegen der SDL.
-
Hi,
sdl.lib und sdlmain.lib sind wie immer gelinkt gewesen,
dass mit dem Multithreadet muss ich mal schauen wo ichs einstellen
kann.Vielen dank erstmal.
PS:Was bedeutet das Multithreadet?cu max
-
Das dein Programm mehrere "Threads" / Prozesse nebeneinander laufen lassen kann.
Ein Single Threaded Prog sieht so aus:
A -> B -> C
Ein Multithreaded kann so aussehen:
A -> B -> E \-> C -> D
Hoffe du verstehst was ich meine
-
Hi,
vielen dank.
Eigentlich verstehe ichs nicht.
Naja, aber was hat das damit zu tuen das dass Programm nicht läuft?
Ist das dafür notwendig?Kann mir dazu jemand vielleicht einen
Tutorial link geben?cu max
-
Ganz einfach - die SDL ist eine Multithreaded Library, also muß das Programm, wo die Library nutzt auch mit Multithreading umgehen können.
Tutorial zu SDL? Mhhh - hab ich mal wo gesehen, glaube sogar von einem der Boardmitglieder hier. Schau mal in die FAQ vielleicht gibts da welche.
-
Master_Max schrieb:
Eigentlich verstehe ichs nicht.
Das bedeutet daß Dein Prog mehrere Sachen gleichzeitig machen kann...
-
nicht gleichzeitig, sondern parallel
-
kind schrieb:
nicht gleichzeitig, sondern parallel
Was genau das gleiche ist...
-
Hi,
vielen dannk @all.
Gibt es ein Tutorial was das genau erklärt?@Snorre, Tutorials zu SDL hab ich ein paar gute,
aber da sich die Leute dort keine Engine schreiben,
wird auch nicht darauf eingegangen, sie machen alles
direkt im Programmcode.Vielen dank im vorraus.
cu max
-
Das hat ja auch nix mit der SDL zu tun, dass sind C/C++ Grundlagen.
-
Hi,
in C++ hab ich ja auch eine übung zu dem Thema schon davor
gecodet, die ging.In der erstellte ich zwei .cpp files
und includierte sie.
In der main rief ich eine funktion der anderen cpp file auf.
Das ging einwandfrei, also dachte ich das dass in der SDL
auch gehen sollte.Code:Main.cpp
#include <iostream.h> int printfunction(); int main(){ printfunction(); return 0; }
Code:Printfunction.cpp
#include <iostream.h> int printfunction(){ cout << "Es geht also"; return 0; }
Ich denke das ist verkürtzt das was ich in meinem Programm tue
(Bis darauf das ich keine .h files benutze, das sollte aber keine
rolle spielen)cu max
-
Hi,
ist das was ich da gemacht hab vom Prinzip her das selbe?
(Eigentlich ruf ich ja bei meinem anderen proc auch nur functionen
aus der anderen .cpp auf.)
Vielen dank im vorrauscu max
-
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