Bimbol Temat założony przez niniejszego użytkownika |
undefined reference to » 2013-07-08 01:09:18 Witam, z pomocą pewnego kursu napisałem kółko i krzyżyk. Jednakże nie kompiluje się. Błędy: http://imageshack.us/a/img580/1979/ejb.pngobj\Debug\main.o||In function `main':| C:\Users\Patryk Bieniek\Desktop\C++\PDF\OX\main.cpp|5|undefined reference to `StartGry()'| C:\Users\Patryk Bieniek\Desktop\C++\PDF\OX\main.cpp|8|undefined reference to `RysujPlansze()'| C:\Users\Patryk Bieniek\Desktop\C++\PDF\OX\main.cpp|9|undefined reference to `g_StanGry'| C:\Users\Patryk Bieniek\Desktop\C++\PDF\OX\main.cpp|13|undefined reference to `Ruch(unsigned int)'| C:\Users\Patryk Bieniek\Desktop\C++\PDF\OX\main.cpp|16|undefined reference to `g_StanGry'| C:\Users\Patryk Bieniek\Desktop\C++\PDF\OX\main.cpp|16|undefined reference to `g_StanGry'| ||=== Build finished: 6 errors, 0 warnings (0 minutes, 0 seconds) ===|
Kod game.h: #ifndef GAME_H_INCLUDED #define GAME_H_INCLUDED
#include <iostream> #include <conio.h> #include <cstdlib> #include <ctime>
enum SIGN { SGN_CIRCLE = 'O', SGN_CROSS = 'X' }; enum FIELD { FLD_EMPTY, FLD_CIRCLE = SGN_CIRCLE, FLD_CROSS = SGN_CROSS }; enum GAMESTATE { GS_NOTSTARTED, GS_MOVE, GS_WON, GS_DRAW };
bool StartGry();
bool Ruch( unsigned );
bool RysujPlansze();
extern GAMESTATE g_StanGry;
#endif
Kod main.cpp: #include "game.h"
int main() { StartGry(); while( true ) { RysujPlansze(); if( g_StanGry == GS_MOVE ) { unsigned uNumerPola; std::cin >> uNumerPola; Ruch( uNumerPola ); } else if( g_StanGry == GS_WON || g_StanGry == GS_DRAW ) break; } getch(); return 0; }
Kod game.cpp: #include "game.h"
FIELD g_aPlansza[ 3 ][ 3 ] = { { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY }, { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY }, { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY } };
GAMESTATE g_StanGry = GS_NOTSTARTED; SIGN g_AktualnyGracz;
bool StartGry() { if( g_StanGry != GS_NOTSTARTED ) return false; srand( static_cast < unsigned >( time( NULL ) ) ); g_AktualnyGracz =( rand() % 2 == 0 ? SGN_CIRCLE : SGN_CROSS ); g_StanGry = GS_MOVE; return true; }
const 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 } } };
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_aPlansza[ uY ][ uX ] == FLD_EMPTY ) g_aPlansza[ uY ][ uX ] = static_cast < FIELD >( g_AktualnyGracz ); else return false; FIELD Pole, ZgodnePole; unsigned uLiczbaZgodnychPol; for( int i = 0; i < 8; ++i ) { Pole = ZgodnePole = FLD_EMPTY; uLiczbaZgodnychPol = 0; for( int j = 0; j < 3; ++j ) { Pole = g_aPlansza[ 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; } } unsigned uLiczbaZapelnionychPol = 0; for( int i = 0; i < 3; ++i ) for( int j = 0; j < 3; ++j ) if( g_aPlansza[ i ][ j ] != FLD_EMPTY ) ++uLiczbaZapelnionychPol; if( uLiczbaZapelnionychPol == 3 * 3 ) { g_StanGry = GS_DRAW; return true; } g_AktualnyGracz =( g_AktualnyGracz == SGN_CIRCLE ? SGN_CROSS: SGN_CIRCLE ); return true; }
bool RysujPlansze() { if( g_StanGry == GS_NOTSTARTED ) return false system( "cls" ); std::cout << " KOLKO I KRZYZYK " << std::endl; std::cout << "---------------------" << std::endl; std::cout << std::endl; std::cout << " -----" << std::endl; for( int i = 0; i < 3; ++i ) { std::cout << " |"; for( int j = 0; j < 3; ++j ) { if( g_aPlansza[ i ][ j ] == FLD_EMPTY ) std::cout << i * 3 + j + 1; else std::cout << static_cast < char >( g_aPlansza[ i ][ j ] ); } std::cout << "|" << std::endl; } std::cout << " -----" << std::endl; std::cout << std::endl; switch( g_StanGry ) { case GS_MOVE: std::cout << "Podaj numer pola, w ktorym" << std::endl; std::cout << "chcesz postawic "; std::cout <<( g_AktualnyGracz == SGN_CIRCLE ? "kolko": "krzyzyk" ) << ": "; break; case GS_WON: std::cout << "Wygral gracz stawiajacy "; std::cout <<( g_AktualnyGracz == SGN_CIRCLE ? "kolka": "krzyzyki" ) << "!"; break; case GS_DRAW: std::cout << "Remis!"; break; } return true; }
Nie rozumiem dlaczego się czepia. W przypadku usunięcia z game.h, extern GAMESTATE g_StanGry; czepia się tylko tego, że g_StanGry nie istnieje. |