Bajt Temat założony przez niniejszego użytkownika |
Komunikacja zmiennej z pliku nagłówkowego z plikami .cpp » 2013-07-17 12:16:22 Witam Mam problem: otóż mam 3 pliki: jeden nagłówkowy i 2 .cpp. W jednym z nich, jest funkcja, która ma zwracać kolor tła konsoli i przekazywać to do innej funkcji, która ma to wyświetlać. Problem w tym, że nie są one w tym samym pliku .cpp. Przesyłam kod funkcji która pobiera kolor tła: menu.cpp int xp = 0;
int SetColorsP1( int xp );
int SetColorsP1( int xp ) { system( "CLS" ); std::cout << "\t\t\t"; for( int i = 0; i < TAB; ++i ) { std::cout << "="; } std::cout << std::endl; HANDLE handle; handle = GetStdHandle( STD_OUTPUT_HANDLE ); SetConsoleTextAttribute( handle, 3 ); std::cout << "\t\t\t\t"; std::cout << "= Colors P1 =" << std::endl; SetConsoleTextAttribute( handle, 7 ); std::cout << "\t\t\t"; for( int i = 0; i < TAB; ++i ) { std::cout << "="; } std::cout << std::endl << std::endl; HANDLE handlex; handlex = GetStdHandle( STD_OUTPUT_HANDLE ); SetConsoleTextAttribute( handlex, 7 ); std::cout << "\t\t\t[1] Black" << std::endl; std::cout << "\t\t\t"; for( int i = 0; i < 10; ++i ) { SetConsoleTextAttribute( handlex, 7 ); std::cout << "-"; } std::cout << "\n"; SetConsoleTextAttribute( handlex, 1 ); std::cout << "\t\t\t[2] Blue" << std::endl; std::cout << "\t\t\t"; for( int i = 0; i < 10; ++i ) { SetConsoleTextAttribute( handlex, 7 ); std::cout << "-"; } std::cout << "\n"; SetConsoleTextAttribute( handlex, 2 ); std::cout << "\t\t\t[3] Green" << std::endl; std::cout << "\t\t\t"; for( int i = 0; i < 10; ++i ) { SetConsoleTextAttribute( handlex, 7 ); std::cout << "-"; } std::cout << "\n"; SetConsoleTextAttribute( handlex, 3 ); std::cout << "\t\t\t[4] Azure" << std::endl; std::cout << "\t\t\t"; for( int i = 0; i < 10; ++i ) { SetConsoleTextAttribute( handlex, 7 ); std::cout << "-"; } std::cout << "\n"; SetConsoleTextAttribute( handlex, 4 ); std::cout << "\t\t\t[5] Red" << std::endl; std::cout << "\t\t\t"; for( int i = 0; i < 10; ++i ) { SetConsoleTextAttribute( handlex, 7 ); std::cout << "-"; } std::cout << "\n"; SetConsoleTextAttribute( handlex, 5 ); std::cout << "\t\t\t[6] Purple" << std::endl; std::cout << "\t\t\t"; for( int i = 0; i < 10; ++i ) { SetConsoleTextAttribute( handlex, 7 ); std::cout << "-"; } std::cout << "\n"; SetConsoleTextAttribute( handlex, 6 ); std::cout << "\t\t\t[7] Yellow" << std::endl; std::cout << "\t\t\t"; for( int i = 0; i < 10; ++i ) { SetConsoleTextAttribute( handlex, 7 ); std::cout << "-"; } std::cout << "\n"; SetConsoleTextAttribute( handlex, 7 ); std::cout << "\t\t\t[8] White" << std::endl; std::cout << "\t\t\t"; for( int i = 0; i < 10; ++i ) { SetConsoleTextAttribute( handlex, 7 ); std::cout << "-"; } std::cout << "\n"; SetConsoleTextAttribute( handlex, 8 ); std::cout << "\t\t\t[9] Grey\t\t\t [10] Exit" << std::endl << std::endl; std::cout << "\t\t\t"; for( int i = 0; i < 10; ++i ) { SetConsoleTextAttribute( handlex, 7 ); std::cout << "-"; } SetConsoleTextAttribute( handlex, 7 ); std::cout << "\n\t\t\tEnter number color: "; std::cin >> xp; if( xp == 10 ) { DrawOptions(); } while( xp > 10 || std::cin.fail() == TRUE ) { std::cin.sync(); std::cin.clear(); system( "CLS" ); SetColorsP1( xp ); } return xp1; } Plik nagłówkowy: int xp = 0; int SetColorsP1( int xp );
Jest jeszcze plik .cpp w którym chciałem sprawdzać ile ta zmienna (xp) jest równa. Ale wywala mi błędy kompilacji. 1>------ Build started: Project: Paper Stone Scrissors Game, Configuration: Debug Win32 ------ 1> menu.cpp 1>main.obj : error LNK2005: "int xp" (?xp@@3HA) already defined in game.obj 1>menu.obj : error LNK2005: "int xp" (?xp@@3HA) already defined in game.obj 1>C:\Users\user\Documents\Programs C++\Paper Stone Scrissors Game\Paper Stone Scrissors Game\Debug\Paper Stone Scrissors Game.exe : fatal error LNK1169: one or more multiply defined symbols found ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Jestem pewny, że to jakiś głupi, podstawowy błąd, którego nie potrafię znaleźć. Może to dlatego że od 2 dni nie spałem. |
|
m4tx |
» 2013-07-17 12:36:19 Dlaczego deklarujesz 2 razy tę samą zmienną w pliku .h i w pliku .cpp? Tak nie można. |
|
Bajt Temat założony przez niniejszego użytkownika |
» 2013-07-17 13:05:08 Usunąłem zmienną z pliku .cpp ale dalej bez skutku. |
|
unimator |
» 2013-07-17 13:16:18 W tym innym pliku modułowym (którego nie podałeś), w miejscu deklaracji zmiennej daj: |
|
Bajt Temat założony przez niniejszego użytkownika |
» 2013-07-17 13:28:02 Dalej to nie pomogło. Ten plik którego nie podałem odpowiada za to, że pobiera z tej funkcji (SetColorP1), ten kolor. Kolor ten ma być zapisany w zmiennej 'xp' która jest w pliku nagłówkowym. Później ten plik którego nie podałem ma odczytać zmienną xp i robić coś takiego: if( xp == 1 ) { system( "COLOR 07" ); }
itd. |
|
unimator |
» 2013-07-17 13:44:06 Nie deklaruj zmiennych globalnych w plikach nagłówkowych. Dyrektywę #include możesz rozumieć jako "w te miejsce wklej całą zawartość pliku podanego w <> (lub "")", tak więc jeśli dasz w dwóch różnych plikach modułowych, to w obu tych plikach będziesz miał deklarację tej samej zmiennej. Zadeklaruj tą zmienną xp w jednym pliku modułowym, a w drugim daj po prostu extern int xp. Dodatkowo, cały plik nagłówkowy możesz umieścić w czymś takim: #ifndef NAZWA_PLIKU_H #define NAZWA_PLIKU_H
#endif
dzięki czemu zapobiegniesz wielokrotnym umieszczaniu plików nagłówkowych. Ewentualnie jest jeszcze dyrektywa: która też do tego służy. |
|
pekfos |
» 2013-07-17 14:08:30 Dlaczego deklarujesz 2 razy tę samą zmienną w pliku .h i w pliku .cpp? Tak nie można. |
miejscu deklaracji zmiennej daj: |
Nie deklaruj zmiennych globalnych w plikach nagłówkowych. |
Ale mącicie. |
|
Bajt Temat założony przez niniejszego użytkownika |
» 2013-07-17 21:42:04 Dobra, dzięki Wam pozbyłem się błędów kompilatora. Jednak teraz mam problem z samym programem. Chodzi o to, że funkcja SetColorP1 winna przekazywać kolor do zmiennej xp. Kiedy jednak chcę tą zmienną porównywać z kolejnymi liczbami w funkcji SetWeaponPlayer1 w innym pliku .cpp, to kolor się nie zmienia. Przesyłam kod funkcji po poprawie: menu.cpp (SetColorP1) { int xp = 0;
int SetColorsP1( int xp )
if( xp == 10 ) { DrawOptions(); } while( xp > 10 || std::cin.fail() == TRUE ) { std::cin.sync(); std::cin.clear(); system( "CLS" ); SetColorsP1( xp ); } system( "CLS" ); DrawOptions();
return xp; }
game.cpp (SetWeaponPlayer1) extern int xp;
void SetWeaponPlayer1() { if( xp == 1 ) { system( "COLOR 07" ); } if( xp == 2 ) { system( "COLOR 17" ); } if( xp == 3 ) { system( "COLOR 20" ); } if( xp == 4 ) { system( "COLOR 30" ); } if( xp == 5 ) { system( "COLOR 4f" ); } if( xp == 6 ) { system( "COLOR 50" ); } if( xp == 7 ) { system( "COLOR 60" ); } if( xp == 8 ) { system( "COLOR 70" ); } if( xp == 9 ) { system( "COLOR 80" ); } else { system( "COLOR 07" ); } system( "CLS" ); } Kolor tła zawsze jest równy 07, niezależnie czy wejdę prosto do gry, czy też ustawię jakiś inny. |
|
« 1 » 2 |