Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kompilacja w Code::Blocks

Ostatnio zmodyfikowano 2013-07-20 15:44
Autor Wiadomość
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
C/C++
#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
C/C++
#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
C/C++
#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.
P-88397
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.
P-88399
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.
P-88404
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...
P-88405
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.
P-88408
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.
P-88409
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...
P-88410
pekfos
» 2013-07-20 14:50:57
Nie dołączyłeś <cstdlib> w GAME.cpp, uLiczbaZgodnychPol to stała, switch ma niepoprawną strukturę, itd..
P-88415
« 1 » 2
  Strona 1 z 2 Następna strona