damian19dk Temat założony przez niniejszego użytkownika |
Kompilacja w Code::Blocks » 2013-07-20 13:48:48 Witam, to mój pierwszy post w życiu, ale będę się streszczał. Napisałem grę na konsolę "Kółko i krzyżyk", jednak wystąpiły problemy z kompilacją. Gra posiada moduły main.cpp i GAME.cpp oraz nagłówek GAME.h. GAME.h #ifndef GAME_H_INCLUDED #define GAME_H_INCLUDED
enum GAMESTATE { GS_NONSTARTED, GS_MOVE, GS_WON, GS_DRAW }; enum SIGN { SGN_CIRCLE = 'O', SGN_CROSS = 'X' }; enum FIELD { FLD_EMPTY, FLD_CIRCLE = SGN_CIRCLE, FLD_CROSS = SGN_CROSS };
bool StartGry();
bool Ruch( unsigned );
bool RysujPlansze();
#endif
GAME.cpp #include <iostream> #include <ctime> #include "GAME.h"
using namespace std;
FIELD g_Plansza[ 3 ][ 3 ] = { { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY }, { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY }, { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY } };
GAMESTATE g_StanGry = GS_NONSTARTED;
SIGN g_AktualnyGracz;
bool StartGry() { if( g_StanGry != GS_NONSTARTED ) return false; srand( time( NULL ) ); g_AktualnyGracz =( rand() % 2 == 0 ? SGN_CIRCLE : SGN_CROSS ); g_StanGry = GS_MOVE; return true; }
bool Ruch( unsigned uNumerPola ) { if( g_StanGry != GS_MOVE ) return false; if( !( uNumerPola >= 1 && uNumerPola <= 9 ) ) return false; unsigned uY =( uNumerPola - 1 ) / 3; unsigned uX =( uNumerPola - 1 ) % 3; if( g_Plansza[ uY ][ uX ] == FLD_EMPTY ) { g_Plansza[ uY ][ uX ] = static_cast < FIELD >( g_AktualnyGracz ); } else return false; const int LINIE[][ 3 ][ 2 ] = { { { 0, 0 }, { 0, 1 }, { 0, 2 } }, { { 1, 0 }, { 1, 1 }, { 1, 2 } }, { { 2, 0 }, { 2, 1 }, { 2, 2 } }, { { 0, 0 }, { 1, 0 }, { 2, 0 } }, { { 0, 1 }, { 1, 1 }, { 2, 1 } }, { { 0, 2 }, { 1, 2 }, { 2, 2 } }, { { 0, 0 }, { 1, 1 }, { 2, 2 } }, { { 2, 0 }, { 1, 1 }, { 0, 2 } } }; FIELD Pole, ZgodnePole; const int uLiczbaZgodnychPol; for( int i = 0; i < 8; ++i ) { Pole = ZgodnePole = FLD_EMPTY; uLiczbaZgodnychPol = 0; for( int j = 0; j < 3; ++j ) { Pole = g_Plansza[ LINIE[ i ][ j ][ 0 ][ LINIE[ i ][ j ][ 1 ] ] ]; if( Pole != ZgodnePole ) { ZgodnePole = Pole; uLiczbaZgodnychPol = 1; } else ++uLiczbaZgodnychPol; } if( uLiczbaZgodnychPol == 3 && ZgodnePole != FLD_EMPTY ) { g_StanGry = GS_WON; return true; } } int uLiczbaZapelnionychPol = 0; for( int i = 0; i < 3; ++i ) for( int j = 0; j < 3; ++j ) if( g_Plansza[ i ][ j ] != FLD_EMPTY ) ++uLiczbaZapelnionychPol; if( uLiczbaZapelnionychPol == 3 * 3 ) { g_StanGry = GS_DRAW; return true; } g_AktualnyGracz == SGN_CIRCLE ? SGN_CROSS: SGN_CIRCLE; return true; } bool RysujPlansze() { if( g_StanGry == GS_NONSTARTED ) return false; system( "cls" ); cout << " KOLKO I KRZYZYK " << endl; cout << "---------------------" << endl; cout << endl; cout << " -----" << endl; for( int i = 0; i < 3; ++i ) { cout << " |"; for( int j = 0; j < 3; ++j ) { if( g_Plansza[ i ][ j ] == FLD_EMPTY ) cout << i * 3 + j + 1; else cout << static_cast < char >( g_Plansza[ i ][ j ] ); } cout << "|" << endl; } cout << " -----" << endl; cout << endl; switch( g_StanGry ) case GS_MOVE : cout << "Podaj numer pola, w ktorym" << endl; cout << "chcesz postawic "; cout <<( g_AktualnyGracz == SGN_CIRCLE ? "kolko": "krzyzyk" ) << ": "; break; case GS_WON: cout << "Wygral gracz stawiajacy "; cout <<( g_AktualnyGracz == SGN_CIRCLE ? "kolka": "krzyzyki" ) << "!"; break; case GS_DRAW: cout << "REMIS!"; break; return true; }
main.cpp #include <iostream> #include <conio.h> #include "GAME.h"
using namespace std;
int main() { StartGry(); for(;; ) { RysujPlansze(); if( g_StanGry == GS_MOVE ) { unsigned uNumerPola; cin >> uNumerPola; Ruch( uNumerPola ); } else if( g_StanGry == GS_WON || g_StanGry == GS_DRAW ) break; } getch(); return 0; }
Przepraszam, że zamieszczam cały kod, ale naprawdę nie wiem już, gdzie jest błąd. Wywala błąd, że w pliku main.cpp zmienna "g_StanGry" jest poza zasięgiem. Po użyciu externa na tą zmienną wywala parę błędów "undefined reference" odnośnie funkcji i g_StanGry.Jakby co, pracuję na Code::Blocks. |
|
pekfos |
» 2013-07-20 14:07:31 Musisz zadeklarować tą zmienną w pliku nagłówkowym i wszystkie pliki .cpp używające tej zmiennej muszą być w projekcie. |
|
Bimbol |
» 2013-07-20 14:30:34 Dodaj extern GAMESTATE g_StanGry do game.h Podczas tworzenia nowych plików musisz zaznaczyć Debug oraz Release. Inaczej będzie błąd undefined reference. |
|
damian19dk Temat założony przez niniejszego użytkownika |
» 2013-07-20 14:33:18 Zadeklarowałem zmienną w pliku nagłówkowym i problem zniknął, ale o dziwo pojawiły się błędy dotyczące 3 funkcji , wszystkie "undefined reference".
Przy okazji myślę, że ta zmienna będzie mieć inną wartość na różnych modułów, ponieważ będzie w pliku nagłówkowym.
//EDIT Próbowałem w pliku nagłówkowym zadeklarowac zmienną przy pomocy externa, ale problem nie znika, a pry okazji pojawiają się wspomniane błędy dotycące funkcji... |
|
pekfos |
» 2013-07-20 14:40:11 Masz te pliki w projekcie? Przy okazji myślę, że ta zmienna będzie mieć inną wartość na różnych modułów, ponieważ będzie w pliku nagłówkowym. |
Zmienna będzie jedna dla całego programu. |
|
Bimbol |
» 2013-07-20 14:41:24 Podczas tworzenia nowych plików musisz zaznaczyć Debug oraz Release. Inaczej będzie błąd undefined reference. |
Najlepiej stwórz nowy projekt i przekopiuj kod. Jak wspomniałem wyżej, zapewne nie zaznaczyłeś opcji podczas tworzenia plików game.cpp oraz game.h, Debug oraz Release. |
|
damian19dk Temat założony przez niniejszego użytkownika |
» 2013-07-20 14:42:18 Spróbuję utworzyć nowy projekt i wszystko wkleić... //EDIT Efekty nie są najlepsze...
-------------- Build: Debug in MY GAME (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -Wall -fexceptions -g -c "D:\Projekty\C++\MY GAME\GAME.cpp" -o obj\Debug\GAME.o D:\Projekty\C++\MY GAME\GAME.cpp: In function 'bool StartGry()': D:\Projekty\C++\MY GAME\GAME.cpp:18:17: error: 'srand' was not declared in this scope D:\Projekty\C++\MY GAME\GAME.cpp:19:25: error: 'rand' was not declared in this scope D:\Projekty\C++\MY GAME\GAME.cpp: In function 'bool Ruch(unsigned int)': D:\Projekty\C++\MY GAME\GAME.cpp:50:15: error: uninitialized const 'uLiczbaZgodnychPol' [-fpermissive] D:\Projekty\C++\MY GAME\GAME.cpp:54:30: error: assignment of read-only variable 'uLiczbaZgodnychPol' D:\Projekty\C++\MY GAME\GAME.cpp:57:59: error: invalid types 'const int[const int]' for array subscript D:\Projekty\C++\MY GAME\GAME.cpp:61:38: error: assignment of read-only variable 'uLiczbaZgodnychPol' D:\Projekty\C++\MY GAME\GAME.cpp:64:19: error: increment of read-only variable 'uLiczbaZgodnychPol' D:\Projekty\C++\MY GAME\GAME.cpp:82:63: warning: second operand of conditional expression has no effect [-Wunused-value] D:\Projekty\C++\MY GAME\GAME.cpp:82:63: warning: third operand of conditional expression has no effect [-Wunused-value] D:\Projekty\C++\MY GAME\GAME.cpp: In function 'bool RysujPlansze()': D:\Projekty\C++\MY GAME\GAME.cpp:88:13: error: 'system' was not declared in this scope D:\Projekty\C++\MY GAME\GAME.cpp:108:7: warning: enumeration value 'GS_NONSTARTED' not handled in switch [-Wswitch] D:\Projekty\C++\MY GAME\GAME.cpp:108:7: warning: enumeration value 'GS_WON' not handled in switch [-Wswitch] D:\Projekty\C++\MY GAME\GAME.cpp:108:7: warning: enumeration value 'GS_DRAW' not handled in switch [-Wswitch] D:\Projekty\C++\MY GAME\GAME.cpp:113:5: error: break statement not within loop or switch D:\Projekty\C++\MY GAME\GAME.cpp:114:1: error: case label '(GAMESTATE)2u' not within a switch statement D:\Projekty\C++\MY GAME\GAME.cpp:117:5: error: break statement not within loop or switch D:\Projekty\C++\MY GAME\GAME.cpp:118:1: error: case label '(GAMESTATE)3u' not within a switch statement D:\Projekty\C++\MY GAME\GAME.cpp:120:5: error: break statement not within loop or switch Process terminated with status 1 (0 minutes, 3 seconds) 13 errors, 5 warnings (0 minutes, 3 seconds)
Już sam nie wiem co to za problem... |
|
pekfos |
» 2013-07-20 14:50:57 Nie dołączyłeś <cstdlib> w GAME.cpp, uLiczbaZgodnychPol to stała, switch ma niepoprawną strukturę, itd.. |
|
« 1 » 2 |