[SDL] Problem z warstwą "obraz"
Ostatnio zmodyfikowano 2011-08-27 18:04
Sytfol Temat założony przez niniejszego użytkownika |
[SDL] Problem z warstwą "obraz" » 2011-08-27 00:16:32 Witam, Ostatnio pisze w bibliotece SDL. Postanowiłem, że napiszę małą funkcję (nie patrzcie na to, że nie ma większego sensu, gdyż program dopiero jest w budowie) umieściłem nagłówek w programie i zdefiniowałem funkcję. Plik: main.cpp #include <iostream> #include <cstdio> #include <SDL/SDL.h> #include <SDL/SDL_ttf.h> #include <SDL/SDL_image.h> #include <string> #include "D:\X.cpp"
using namespace std;
SDL_Surface * ekran, * obraz, * message = NULL; TTF_Font * font = NULL; SDL_Color TextColor = { 255, 255, 255 }; SDL_Rect gdzie[ 1 ];
int main( int argc, char * args[] ) { SDL_Init( SDL_INIT_EVERYTHING ); ekran = SDL_SetVideoMode( 1024, 768, 32, SDL_SWSURFACE ); TTF_Init(); Fast( "oczy.jpg" ); SDL_Flip( ekran ); TTF_Quit(); SDL_Quit(); system( "pause" ); exit( 0 ); return 0; }
Plik: X.hpp #ifndef _X_hpp_ #define _X_hpp_
void Fast( string src );
#endif
Plik: X.cpp #include <iostream> #include <SDL/SDL.h> #include <SDL/SDL_ttf.h> #include <SDL/SDL_image.h>
using namespace std;
void Fast( string src ) { obraz = IMG_Load( src.c_str() ); }
Problem jest w tym, że za każdym razem gdy kompiiluję program, pojawia się błąd, że nie została zdeklarowana zmienna "obraz". Dokładniej: 'D:\X.cpp|11|error: 'obraz' was not declared in this scope|' Widocznie warstwa "obraz" w głównym programie jest jakoś źle zapisana w póxniejszych krokach... Jak ją zdeklarować w takim razie? |
|
kamillo121 |
» 2011-08-27 06:48:40 Dobry przykład jak nie powinno się pisać aplikacji, jak koniecznie musisz tak to zrobić to użyj extern ale lepiej zmień funkcję by ta przyjmowała jako kolejny argument wskaźnik na powierzchnię i po problemie :) |
|
Sytfol Temat założony przez niniejszego użytkownika |
» 2011-08-27 13:16:50 Wielkie dzięki, pomogło umieszczenie extern . Chciałbym jeszcze zapytać się, jak można poprawić ten program, skoro jest to "Dobry przykład jak nie powinno się pisać aplikacji". Czy chodzi o takie bezcelowe załączanie nagłówka do prostej funkcji? I jeszcze jedno: jak mam dokładniej rozumieć działanie extern ? |
|
kamillo121 |
» 2011-08-27 13:27:51 extern oznacza deklarację bytu, innymi słowy oznajmiasz, że gdzieś taki byt się pojawi. Jeżeli chodzi o tą funkcję to jest to bezsensowne i nie jest :) Wszystko zależy od tego czy to ma być zwykła szpanerska nakładka, czy funkcjonalne rozszerzenie. W twoim wypadku obecnie ma to postać(jak ja to nazywam) szpanu ale jak poznasz(bądź już poznałeś) dobrze SDL to zobaczysz, że do optymalizacji powierzchni trzeba użyć dodatkowych funkcji i zabiegów i jeżeli to wszystko umieścisz w takiej funkcji to będzie to miało jak najbardziej sens. Ponadto odradzałbym używania zmiennych globalnych w takiej postaci jak powierzchnie i inne ważne byty bo może to prowadzić do błędów i to co jest oczywistością to to, że program staje się (mało/nie)czytelny. Dodatkowo dołączasz do głównego "modułu" plik o rozszerzeniu cpp co niezbyt dobrze wygląda a jak sądzę doprowadziło cię do tego używanie zmiennych globalnych, skoro jest nagłówek, który oznajmia byt jakiejś funkcji to ten właśnie nagłówek dołączasz a nie plik z ciałem. Powracając jeszcze do tej funkcji: void Fast( string src ) { obraz = IMG_Load( src.c_str() ); }
Jak dla mnie jest tu generowany zbędny narzut powodowany tym(pomijając sens funkcji), że jako argument przyjmujesz string przez co potem musisz wywołać na takim obiekcie metodę, która zwróci Ci char * . Lepiej od razu jako argument przyjmować char * . |
|
Sytfol Temat założony przez niniejszego użytkownika |
» 2011-08-27 16:13:23 Dziękuję za pomoc. ;) |
|
kamillo121 |
» 2011-08-27 18:04:24 Jeżeli prosisz o pomoc i uzyskasz satysfakcjonującą odpowiedź to zamykaj temat (tym razem zrobię to za ciebie) :) |
|
« 1 » |