Rozbicie kodu na kilka plików

Witam, dotychczas pisalem wszystko w jednym pliku (nie liczac .h) i nie mialem zadnych problemow. Teraz postanowilem program rozbic na kilka czesci i nie moge rozgryzc, co robie zle. Pracuje w Dev C++. Wspomne tez, ze szukalem rozwiazan, lecz skutkow jako takich nie bylo.

Mam 3 pliki:

WndSystem.cpp (#include “WndSystem.h”)

MainFunc.cpp (#include “WndSystem.h”)

WndSystem.h

WndSystem.h

#ifndef MIS_DEFINE_INCLUDED

#define MIS_DEFINE_INCLUDED


#include 


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);


typedef struct

{

    HWND hWnd;

    HDC hDC;

    HGLRC hRC;

    HINSTANCE hInstance;

    const char *ClassName;

    char *title;

    bool FullScreenFg;

    int width;

    int height;

    short bits;

} Window;


bool key[256];

MSG Message;


bool CreateWindowGL(Window *window);


#endif

w pliku WndSystem.cpp mam funkcje CreateWindowGL(…), a w pliku MainFunc.cpp deklaracje klasy Window oraz wykorzystanie funkcji CreateWindowGL(…).

W pliku WndSystem.h pilnuje, zeby nie bylo multilinkowania (ifndef/define/endif), ale mimo to kompilator wywala mi bledy “multiple definition of…”. Kiedy przed tymi dwoma zmiennymi globalnymi dodam “extern” to poprzedni blad znika, ale wywala zas “undefined reference to…”. Wiem, ze zmienne globalne to zuo i ze nie powinienem linkowac jednego pliku header do dwoch plikow zrodlowych, lecz potrzebuje w obu zrodlach zmiennej key[256], zeby w jednym pliku zapelniac tablice, a w drugim ja wykorzystac. Wiem, ze mozna to latwiej napisac, ale ja chce tak :lol: Rozwiazanie tego problemu wiele mnie nauczy, takze dzieki za wszystkie rady. Prosze tez o pisanie po polsku, bo wiem, ze niektorzy lubia poszpanowac piszac tak, ze nikt, kto nie jest profesjonalista nie zrozumie :slight_smile:

  1. zmienne globalne powinny być zadeklarowane w pliku .h jako extern i normalnie w jednym pliku .cpp. http://4programmers.net/C/Extern

  2. Przesiądź się na coś nowszego niż Dev-C++. Polecam Code::Blocks.

  3. Czym zgrzeszyłeś, że pokutujesz pisząc w WinAPI tworzenie kontekstu do OpenGL? Nie prościej skorzystać z gotowych rozwiązań np. Allegro, GLFW czy chociaż GLUT?

Proszę poprawić pisownię w tytule tematu i w opisie problemu. W celu dokonania zaleconej korekty proszę skorzystać z przycisku Edytuj przy poście otwierającym temat.

Zignorowanie zalecenia będzie skutkowało usunięciem tematu do Kosza.

Agaton , udręką jest dla mnie pisać z polskimi znakami, lecz będę pamiętał na przyszłość. Ale nicku nie zmienię ^^

etam , dzięki za wskazówkę dotyczącą extern. Co do punktu drugiego to od zawsze programowałem w devie, ponieważ przypadł mi do gustu, lecz ostatnio właśnie, od kiedy zacząłem “kombinować” z kodem jego błedy zaczęły mnie drażnić (np. wyżej opisany problem. Obczaiłem, jak ominąć to multilinkowanie). Myślałem o visualu, lecz najpierw wypróbuję code::blocks.

Wcześniej pisałem w WinAPI, więc nie stanowi on dla mnie większego problemu. Druga sprawa przez biblioteki/silniki typu Allegro/glut/irrlicht(próbowałem) czuję się ograniczany :slight_smile: Pewnie będziesz mi próbował wcisnąć, że to nie ogranicza, ale to jest mój styl kodowania można powiedzieć :stuck_out_tongue:

A jeszcze kilka pytan mam… Czy przy większych projektach zalecane jest rozbijanie kodu, czy to zależy od programisty, jak mu wygodniej ? Kilka plików ułatwia pracę ? Dlaczego sie dzieli kod ? Interesują mnie te pytania i chętnie przeczytam, jakie macie zdanie na ten temat :slight_smile:

Pisząc w WinAPI ograniczasz się do Jedynej Słusznej Platformy. Używając dowolnej z w/w bibliotek, twój kod będzie przenośny na inne systemy.

Rozbijanie kodu ma co najmniej dwa uzasadnienia:

  1. Rozdzielenie logicznie niezależnych elementów aplikacji. Oddzielenie takich rzeczy jak np. silnik graficzny, obsługa sieci, czy wczytywanie plików konfiguracyjnych poprawia czytelność kodu.

  2. Skrócenie czasu rekompilacji programu. Mając program podzielony na pliki każdy z nich jest kompilowany osobno, a na końcu konsolidowane (linkowane) jest wszystko do pliku wykonywalnego. Jeżeli masz np. 10 plików .cpp, a modyfikujesz tylko jeden, to kompilator musi zrekompilować tylko ten jeden, a nie całą aplikację.

Może troche zmienię temat, ale powiedziałeś, że WinAPI mnie ogranicza tylko do windowsa, ale np kursy NeHe, ksiazki “OpenGL - Programowanie Gier” oraz “Ksiega Eksperta” mowia o WinAPI i jest napisane, jak się tworzy kontekst w WinAPI. Druga sprawa, to funkcje wgl - czy uzycie tych funkcji nie spowoduje, że aplikacja będzie tylko pod windowsa ?

Chodzi mi tutaj o tworzenie czcionek. W glucie nie ma takiej opcji (?). Wiem, ze glut ma jakies tam swoje czcioni, ale jest to beznadziejne. W WinAPI czcionki konturowe, ktore można nawet otexturować to jest szczyt marzeń :slight_smile:

WinAPI jak sama nazwa wskazuje to Windows API. Tylko dla Windowsa. Ale nie przejmuj się tym, jak etam zauważył, to JEST Jedyna Słuszna Platforma, ponieważ się uczysz, pracujesz na Windowsie i masz wystarczająco problemów. Po co sobie stwarzać kolejne? Zresztą… Linux ma i tak mały udział w rynku, więc wiele nie stracisz(choć nie przeczę, że dobrze jest i jego choć trochę znać) pisząc później w czystym WinAPI*.

* - WinAPI nie jest takie złe jak niektórzy twierdzą. Ma jedną(ale nie jedyną, choć do reszty trzeba się przemóc), kolosalną zaletę - MSDN, którego odpowiednika dla innych API ze świecą szukać.

Fiołek , ale czy pisząc w OpenGL + WinAPI mam takie same możliwości, jak gdybym pisał np w glucie ?? Czy w WinAPI jest dużo więcej możliwości ? Oczywiście chodzi mi tu o to, że pisząc w glucie chciałbym przenośny kod, a w WinAPI - grunt, że na Win działa. Np czcionki, jak juz wspomniałem. Czy w kodzie przenośnym na inne systemy da się wczytać czcionkę ? Czy zostają tylko czcionki bitmapowe ?

Nie wiem jakie możliwości ma GLUT, ale to tylko biblioteka pomocnicza dla OpenGL, nie wymagaj od niej zbyt wiele.

Obsługa czcionek AFAIK nie jest w WinAPI tylko w GDI/GDI+, które z powodzeniem można zastąpić zewnętrznymi bibliotekami(np. FreeType).