deklaracja zmiennej w pliku nagłówkowym

0

Witam
mam 3 pliki .. main.cpp game.hpp game.cpp
Chciałbym aby pewna zmienna (dokładniej tablica) była dostępna zarówno w pliku main.cpp jak i game.cpp.
Gdy dodaje deklaracje do pliku nagłówkowego (game.hpp) i próbuje zkompilować program wychodzi taki oto błąd

obj\Debug\game.o||In function Z3xxxv':| C:\Users\abc\Documents\Klocki przebudowane\game.cpp|7|multiple definition of mapa_pola'|
obj\Debug\main.o\program files (x86)\codeblocks\mingw\bin..\lib\gcc\mingw32\4.4.1........\include\allegro\inline\gfx.inl|96|first defined here|
== Build finished: 2 errors, 0 warnings ===

mapa_pola to jest właśnie moja tablica.
Używam codeblocks

jakby ktoś chciał całe pliki
http://chomikuj.pl/Mine-craft
folder główny

Jestem początkujący i kompletnie nie mam pojęcia o co biega

0

includowanie pliku nagłówkowego polega na tym że jego treść jest zwyczajnie "kopiowana" do pliku źródlowego. Skoro zadeklarowałeś tam zmienną to ta zmienna zostanie zadeklarowana w obu plikach źródlowych. Ale że to zmienna globalna to jest widzialna we wszystkich jednostkach translacji -> nie wolno ci deklarować dwóch zmiennych globalnych o tych samych nazwach. W efekcie otrzymujesz taki właśnie błąd.
Jak go rozwiazać?

  1. Opcja bardzo nieelegancka i niepolecana: tablicę stworzyc w jednym pliku źródłowym, w drugim pliku zadeklarować ją jako extern
  2. Nie używać zmiennych globalnych w ogóle! Tablicę możesz przekazywać przez referencję jako argument funkcji.
0

poza tym, jezeli tworzysz gre, to lepiej zmienne trzymac w pliku, przy zmianie wartosci przynajmniej unikasz kolejnej kompilacji

0

Shalom ma rację ze sposobem deklarowania zmiennych globalnych, ale nie zgadzam się z ich nie używaniem. Na pewno nie powinno się ich używać, jak się za często zmieniają. Wtedy widząc wywołanie funkcji z danymi parametrami w kodzie nie jesteś w stanie szybko ocenić, jaki będzie tego efekt. Utrudnia to czytanie i zrozumienie kodu, co zwiększa czas pisania i ilość bugów. Jest to częsty przypadek wśród początkujących programistów, pamiętam jeszcze swój pierwszy długi program, zrobiony jeszcze w TP w podstawówce. Miałem problem z deklaracją kolejnych zmiennych globalnych, bo literki w alfabecie mi się kończyły ;).

Dobrym zastosowaniem dla zmiennych globalnych jest są rzeczy, które się rzadko zmieniają. Przykładowymi rzeczami w prostej grze może być np. poziom trudności, rozdzielczość ekranu itp. Głównie chodzi o to, że możesz takie zmienne traktować jako stałe. Najlepiej, żeby były zmieniane tylko w określonych miejscach, np. wczytywane z pliku konfiguracyjnego oraz zmieniane w opcjach. Zdecydowanie nie mogą służyć do przekazywania danych z jednej funkcji do drugiej. Dodatkowo pamiętaj, żeby nie polegać na wartości w zmiennej globalnej przy definiowaniu innych zmiennych globalnych (lub static), bo wyjść Ci demony z nosa.

Dodatkowo akurat mapa jest złym kandydatem na zmienną globalną, ja bym to w jakiś obiekt ubrał i przekazywał do funkcji. Tylko niektóre fragmenty gry muszą mieć dostęp do mapy, więc po co zakładać, że wszystkie mogą je zmienić.

0

Dzięki za odpowiedzi ;) postanowiłem przekazać tablice przez referencje. Wydaje się to najprostsze .
A to gdyby ktoś wszedł w ten temat szukając odpowiedzi na pytanie:

int xxx(POLE (&tablica)[12][22])
{
    //
}

a do funkcji dostajemy się
xxx(mapa_pola);

1 użytkowników online, w tym zalogowanych: 0, gości: 1