Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SDL] Problem z warstwą "obraz"

Ostatnio zmodyfikowano 2011-08-27 18:04
Autor Wiadomość
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
C/C++
#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
C/C++
#ifndef _X_hpp_
#define _X_hpp_

void Fast( string src );

#endif

Plik: X.cpp
C/C++
#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?
P-40018
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 :)
P-40022
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
?
P-40050
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:
C/C++
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 *
.
P-40052
Sytfol
Temat założony przez niniejszego użytkownika
» 2011-08-27 16:13:23
Dziękuję za pomoc. ;)
P-40079
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) :)
P-40085
« 1 »
  Strona 1 z 1