Skocz do zawartości

Błąd kompilacji


Gość Gelldur

Polecane posty

Witam mam problem gdy kompiluje kod wyskakuje mi coś takiego ale nie wiem o co chodzi

 

 

------ Rebuild All started: Project: Nico, Configuration: Debug Win32 ------

Deleting intermediate and output files for project 'Nico', configuration 'Debug|Win32'

Compiling...

game.cpp

mian.cpp

Generating Code...

Compiling manifest to resources...

Microsoft ® Windows ® Resource Compiler Version 6.0.5724.0

Copyright © Microsoft Corporation. All rights reserved.

Linking...

mian.obj : error LNK2005: "enum POLE (* g_Plansza)[3]" (?g_Plansza@@3PAY02W4POLE@@A) already defined in game.obj

mian.obj : error LNK2005: "enum STAN_GRY g_Stan_Gry" (?g_Stan_Gry@@3W4STAN_GRY@@A) already defined in game.obj

game.obj : error LNK2001: unresolved external symbol "enum ZNAK g_Aktualny_Gracz" (?g_Aktualny_Gracz@@3W4ZNAK@@A)

C:\Documents and Settings\Gelldur\Moje dokumenty\Visual Studio 2008\Projects\Nico\Debug\Gra wersja 2.exe : fatal error LNK1120: 1 unresolved externals

Build log was saved at "file://c:\Documents and Settings\Gelldur\Moje dokumenty\Visual Studio 2008\Projects\Nico\Gra wersja 2\Debug\BuildLog.htm"

Gra wersja 2 - 4 error(s), 0 warning(s)

========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

Link do komentarza
Udostępnij na innych stronach

Szczerze to robię tak definiuje coś w 1 pliku nazwa.cpp a wywołuje to w main.cpp i właśnie mam ten błąd ;/ oto kod może cuś nie tak

 

void main()

{

Start_Gry();

 

for (;;)

{

// ...

Rysowanie_Planszy();

 

 

 

if (g_Stan_Gry == S_RUCH)

{

unsigned u_Numer_Pola;

std::cin >> u_Numer_Pola;

Ruch (u_Numer_Pola);

}

else if (g_Stan_Gry == S_WYGRANA || g_Stan_Gry == S_REMIS)

break;

}

 

_getch();

 

 

}

Link do komentarza
Udostępnij na innych stronach

Oto plik.h nie widze tu błędu ;/

 

 

enum ZNAK { Z_KOLKO = 'O', Z_KRZYZYK = 'X' };

enum POLE { P_PUSTE, P_KOLKO = Z_KOLKO, P_KRZYZYK = Z_KRZYZYK };

enum STAN_GRY { S_NIEROZPOCZETA, S_RUCH, S_WYGRANA, S_REMIS };

 

 

//Prototypy

 

//Rozpoczecie gry

bool Start_Gry();

 

//wykonywanie ruchu

bool Ruch(unsigned);

 

//Rysowanie planszy

bool Rysowanie_Planszy();

 

 

 

POLE g_Plansza[3][3] = { { P_PUSTE, P_PUSTE, P_PUSTE },

{ P_PUSTE, P_PUSTE, P_PUSTE },

{ P_PUSTE, P_PUSTE, P_PUSTE } };

 

STAN_GRY g_Stan_Gry = S_NIEROZPOCZETA;

extern ZNAK g_Aktualny_Gracz;

Link do komentarza
Udostępnij na innych stronach

g_Aktualny_Gracz undeclared identifier

 

to mi wyskakuje

 

to extern wysyła z pliku nagłówkowego późne wiązanie do zmiennej jakoś tak to bez tego nie da sie inaczej tego zrobic pokaże może jak cały kod wygląda tych 3 plików

 

 
Plik nagłówkowy 



enum ZNAK { Z_KOLKO = 'O', Z_KRZYZYK = 'X' };
enum POLE { P_PUSTE, P_KOLKO = Z_KOLKO, P_KRZYZYK = Z_KRZYZYK };
enum STAN_GRY { S_NIEROZPOCZETA, S_RUCH, S_WYGRANA, S_REMIS };


//Prototypy

//Rozpoczecie gry
bool Start_Gry();

//wykonywanie ruchu
bool Ruch(unsigned);

//Rysowanie planszy
bool Rysowanie_Planszy();



POLE g_Plansza[3][3] = { { P_PUSTE, P_PUSTE, P_PUSTE },
                                               { P_PUSTE, P_PUSTE, P_PUSTE },
                                               { P_PUSTE, P_PUSTE, P_PUSTE } };

ZNAK g_Aktualny_Gracz;
STAN_GRY g_Stan_Gry = S_NIEROZPOCZETA;


extern STAN_GRY g_Stan_Gry;









Plik z właściwym kodem



#include <iostream>
#include <conio.h>
#include <ctime>
#include "game1.h"



bool Start_Gry()
{
if (g_Stan_Gry = S_NIEROZPOCZETA) return true;
else std::cout << " Jakiś ERRoR przy starcie gry" << std::endl;
_getch();


// Losowani gracza ktory bedzie 1 
srand (static_cast<unsigned>(time(NULL)));
g_Aktualny_Gracz = (rand() % 2 == 0 ? Z_KOLKO : Z_KRZYZYK);

// Ustawiamy stan gry na Ruch

g_Stan_Gry = S_RUCH;
return true;
}


bool Ruch( unsigned u_Numer_Pola )
{
if (g_Stan_Gry = S_RUCH) return true;
else std::cout << " Jakiś ERRoR przy Funkcji Ruch()" << std::endl;
_getch();

if (u_Numer_Pola >= 1 && u_Numer_Pola <= 9) return true;
else std::cout << " Jakiś ERRoR wpisaniu liczby pola gry" << std::endl;
_getch();


unsigned uY = (u_Numer_Pola - 1) / 3;
unsigned uX = (u_Numer_Pola - 1) % 3;

if (g_Plansza[uY][uX] == P_PUSTE)
g_Plansza[uY][uX] = static_cast<POLE>(g_Aktualny_Gracz);
else std::cout << " Jakiś ERRoR przy sprawdzaniu czy pole puste" << std::endl;
_getch();

int const LINIE[][3][2] = { { { 0,0 }, { 0,1 }, { 0,2 } }, // górna pozioma
{ { 1,0 }, { 1,1 }, { 1,2 } },// środ. pozioma
{ { 2,0 }, { 2,1 }, { 2,2 } },// dolna pozioma
{ { 0,0 }, { 1,0 }, { 2,0 } }, // lewa pionowa
{ { 0,1 }, { 1,1 }, { 2,1 } }, // środ. pionowa
{ { 0,2 }, { 1,2 }, { 2,2 } }, // prawa pionowa
{ { 0,0 }, { 1,1 }, { 2,2 } }, // p. backslashowa
{ { 2,0 }, { 1,1 }, { 0,2 } } }; // p. slashowa

POLE Pole, ZgodnePole;
unsigned uLiczbaZgodnychPol;
for (int i = 0; i < 8; ++i)
{
// i przebiega po kolejnych możliwych liniach (jest ich osiem)
// zerujemy zmienne pomocnicze
Pole = ZgodnePole = P_PUSTE; // obie zmienne == FLD_EMPTY
uLiczbaZgodnychPol = 0;
for (int j = 0; j < 3; ++j)
{
// j przebiega po trzech polach w każdej linii
// pobieramy rzeczone pole
// to zdecydowanie najbardziej pogmatwane wyrażenie 
Pole = g_Plansza[LINIE[i][j][0]][LINIE[i][j][1]];
// jeśli sprawdzane pole różne od tego, które ma się zgadzać...
if (Pole != ZgodnePole)
{
// to zmieniamy zgadzane pole na to aktualne
ZgodnePole = Pole;
uLiczbaZgodnychPol = 1;
}
else
// jeśli natomiast oba pola się zgadzają, no to
// inkrementujemy licznik takich zgodnych pól
++uLiczbaZgodnychPol;
}
// teraz sprawdzamy, czy udało nam się zgodzić linię
if (uLiczbaZgodnychPol == 3 && ZgodnePole != P_PUSTE)
{
// jeżeli tak, no to ustawiamy stan gry na wygraną
g_Stan_Gry = S_WYGRANA;
// przerywamy pętlę i funkcję
return true;
}


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;
}
}

unsigned uLiczbaZapelnionychPol = 0;
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
if (g_Plansza[i][j] != P_PUSTE)
++uLiczbaZapelnionychPol;

if (uLiczbaZapelnionychPol == 3*3)
{
g_Stan_Gry = S_REMIS;
return true;
}

g_Aktualny_Gracz = (g_Aktualny_Gracz == Z_KOLKO ?
Z_KRZYZYK : Z_KOLKO);

return true;
}


bool Rysowanie_Planszy()
{
if (g_Stan_Gry == S_NIEROZPOCZETA) 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)
{
// lewa część ramki
std::cout << " |";
// wiersz
for (int j = 0; j < 3; ++j)
{
if (g_Plansza[i][j] == P_PUSTE)
// numer pola
std::cout << i * 3 + j + 1;
else
// tutaj wyświetlamy kółko lub krzyżyk... ale jak? 
std::cout << static_cast<char>(g_Plansza[i][j]);
}
// prawa część ramki
std::cout << "|" << std::endl;
}
std::cout << " -----" << std::endl;
std::cout << std::endl;





switch (g_Stan_Gry)
{
case S_RUCH:
// prośba o następny ruch
std::cout << "Podaj numer pola, w ktorym" << std::endl;
std::cout << "chcesz postawic ";
std::cout << (g_Aktualny_Gracz == Z_KOLKO ?
"kolko" : "krzyzyk") << ": ";
break;
case S_WYGRANA:
// informacja o wygranej
std::cout << "Wygral gracz stawiajacy ";
std::cout << (g_Aktualny_Gracz == Z_KOLKO ?
"kolka" : "krzyzyki") << "!";
break;
case S_REMIS:
// informacja o remisie
std::cout << "Remis!";
break;
}
return true;
}










Plik z wywołaniem funkcji

#include <iostream>
#include <conio.h>
#include <ctime>
#include "game1.h"


void main()
{
Start_Gry();

for (;;)
{
// ...
Rysowanie_Planszy();



       if (g_Stan_Gry == S_RUCH)
{
unsigned u_Numer_Pola;
std::cin >> u_Numer_Pola;
Ruch (u_Numer_Pola);
}
       else if (g_Stan_Gry == S_WYGRANA || g_Stan_Gry == S_REMIS)
break;
}

_getch();


}

Link do komentarza
Udostępnij na innych stronach

Daj tego externa w pliku cpp.. nie w nagłówku. Extern służy do odwoływania się do jakiejś zmiennej globalnej zadeklarowanej w innym module (pliku .cpp) - przynajmniej w tym przypadku. Sprawdź czy masz w ogóle zadeklarowaną zmienna ZNAK g_Aktualny_Gracz; bo jeśli nie to externem próbujesz się odwołać do czegoś czego nie ma.

Lubię cytryny !

Link do komentarza
Udostępnij na innych stronach

mam zdeklarowana aha bo z tym extern muwiono mi że musi być w nagłówku zaraz spr i odpisze dzieki ;)

 

 

ZNAK odnosi się do pliku nagłówkowego

 

enum ZNAK { Z_KOLKO = 'O', Z_KRZYZYK = 'X' };

 

 

 

a tu aktualny gracz w pliku game.cpp

 

// Losowani gracza ktory bedzie 1 ;)

srand (static_cast<unsigned>(time(NULL)));

g_Aktualny_Gracz = (rand() % 2 == 0 ? Z_KOLKO : Z_KRZYZYK);\

 

 

teraz to już mi się wszystko pomieszało hehe :P

 

 

a Extern przeniosłem do plików .cpp i wtedy nie wie o istnieniu g_Aktualny_Gracz

przypominam jak narazie taki błąd mi wyskakuje

 

------ Build started: Project: Gra wersja 2, Configuration: Debug Win32 ------

Compiling...

mian.cpp

Generating Code...

Compiling...

game.cpp

Generating Code...

Linking...

mian.obj : error LNK2005: "enum ZNAK g_Aktualny_Gracz" (?g_Aktualny_Gracz@@3W4ZNAK@@A) already defined in game.obj

mian.obj : error LNK2005: "enum POLE (* g_Plansza)[3]" (?g_Plansza@@3PAY02W4POLE@@A) already defined in game.obj

mian.obj : error LNK2005: "enum STAN_GRY g_Stan_Gry" (?g_Stan_Gry@@3W4STAN_GRY@@A) already defined in game.obj

Link do komentarza
Udostępnij na innych stronach

Dzięki za pomoc ale to nadal nie to wciąż te same błędy a zrobiłem jak kazałeś i na parę własnych sposobów to nadal nie to najgorzej bo po prostu nie rozumiem tych Errorów co mi napisał kompilator ( używam VS 2008)

 

Dobra najwyżej tego nigdy nie uruchomię ;P

 

Dzięki!

Link do komentarza
Udostępnij na innych stronach

Co się tak czepiłeś tego ZNAK przecież w Errorze nie wywala info tylko o znaku a cały kod programu masz napisany wyżej i gdzie "includuje" dwa razy ZNAK?

Pozatym wszystko zrobiłem dokładnie jak w poradniku kazali juz 5 raz czytam poradnik i mam identycznie nawet odpaliłem kod napisany już przez tego co pisał poradnik i ten sam error

Link do komentarza
Udostępnij na innych stronach

patrz:

W game includujesz game1.h, kompilator tworzy dla niego plik obj, potem w main includujesz game1.h i kompilator tworzy dla niego plik obj

Następnie linker łączy oba pliku obj i patrzy-zonk w dwóch plikach ma g_Aktualny_Gracz, (* g_Plansza)[3], g_stan_gry no i jest kupa.

Pokaż ten poradnik

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Powiem tak dziękuje CI za idealną odpowiedź lecz nie napisałeś czy NAZWA_TEGO_PLIKU_H ma być pomiędzy " " a więc sam je dopisalem ale i tak wyskoczył błąd taki :

 

Pisałem też na 2 sposoby ,że bez " " ale wtedy to wogole nie wiedział kompilator co zrobić z sobą :)

 

 

 

 

------ Build started: Project: Gra wersja 2, Configuration: Debug Win32 ------

Compiling...

game.cpp

c:\documents and settings\gelldur\moje dokumenty\visual studio 2008\projects\gra wersja 2\gra wersja 2\game1.h(1) : fatal error C1016: #if[n]def expected an identifier

mian.cpp

c:\documents and settings\gelldur\moje dokumenty\visual studio 2008\projects\gra wersja 2\gra wersja 2\game1.h(1) : fatal error C1016: #if[n]def expected an identifier

Generating Code...

Build log was saved at "file://c:\Documents and Settings\Gelldur\Moje dokumenty\Visual Studio 2008\Projects\Gra wersja 2\Gra wersja 2\Debug\BuildLog.htm"

Gra wersja 2 - 2 error(s), 0 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

 

 

#ifndef "game1.h"
#define "game1.h"
enum ZNAK { Z_KOLKO = 'O', Z_KRZYZYK = 'X' };
enum POLE { P_PUSTE, P_KOLKO = Z_KOLKO, P_KRZYZYK = Z_KRZYZYK };
enum STAN_GRY { S_NIEROZPOCZETA, S_RUCH, S_WYGRANA, S_REMIS };


//Prototypy

//Rozpoczecie gry
bool Start_Gry();

//wykonywanie ruchu
bool Ruch(unsigned);

//Rysowanie planszy
bool Rysowanie_Planszy();



POLE g_Plansza[3][3] = { { P_PUSTE, P_PUSTE, P_PUSTE },
                                               { P_PUSTE, P_PUSTE, P_PUSTE },
                                               { P_PUSTE, P_PUSTE, P_PUSTE } };
ZNAK g_Aktualny_Gracz;
STAN_GRY g_Stan_Gry = S_NIEROZPOCZETA;


extern STAN_GRY g_Stan_Gry;
#endif

Link do komentarza
Udostępnij na innych stronach

xevil mało dokładnie powiedział, zrób zamiast

#ifndef "game1.h"

#define "game1.h"

 

#ifndef _game1_h_

#define _game1_h_

bo to co ma być po ifndef to musi być jakieś spójne słowo(znaki alfanumerczyne _) bez cudzysłowych, jakiś unikalny identyfikator, a potem ma być po define to samo, przeczytaj o dyrektywach

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

No dobra schemat anpisałeś ale ja dopiero zaczynam c++ i nie widziałem czegos takiego jak nazwa_nazwa_costam ale już próbuje

 

A co do mądrych ksążek robie kursy różne na C++ ale w mojej ksążce ten kod co iałem powinien działać a nie działa nie wiem czemu.

 

 

 

Wpisałem tak i to ten sam ERROR

(i podkreślam różnie kombinowałem z tymi znakami ______ i spacjami nic nie dało

 

------ Build started: Project: Gra wersja 2, Configuration: Debug Win32 ------

Compiling...

game.cpp

mian.cpp

Generating Code...

Linking...

mian.obj : error LNK2005: "enum ZNAK g_Aktualny_Gracz" (?g_Aktualny_Gracz@@3W4ZNAK@@A) already defined in game.obj

mian.obj : error LNK2005: "enum POLE (* g_Plansza)[3]" (?g_Plansza@@3PAY02W4POLE@@A) already defined in game.obj

mian.obj : error LNK2005: "enum STAN_GRY g_Stan_Gry" (?g_Stan_Gry@@3W4STAN_GRY@@A) already defined in game.obj

C:\Documents and Settings\Gelldur\Moje dokumenty\Visual Studio 2008\Projects\Gra wersja 2\Debug\Gra wersja 2.exe : fatal error LNK1169: one or more multiply defined symbols found

Build log was saved at "file://c:\Documents and Settings\Gelldur\Moje dokumenty\Visual Studio 2008\Projects\Gra wersja 2\Gra wersja 2\Debug\BuildLog.htm"

Gra wersja 2 - 4 error(s), 0 warning(s)

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

 

 

 

 

 
#ifndef _game1_h_
#define _game1_h_
enum ZNAK { Z_KOLKO = 'O', Z_KRZYZYK = 'X' };
enum POLE { P_PUSTE, P_KOLKO = Z_KOLKO, P_KRZYZYK = Z_KRZYZYK };
enum STAN_GRY { S_NIEROZPOCZETA, S_RUCH, S_WYGRANA, S_REMIS };


//Prototypy

//Rozpoczecie gry
bool Start_Gry();

//wykonywanie ruchu
bool Ruch(unsigned);

//Rysowanie planszy
bool Rysowanie_Planszy();



POLE g_Plansza[3][3] = { { P_PUSTE, P_PUSTE, P_PUSTE },
                                               { P_PUSTE, P_PUSTE, P_PUSTE },
                                               { P_PUSTE, P_PUSTE, P_PUSTE } };
ZNAK g_Aktualny_Gracz;
STAN_GRY g_Stan_Gry = S_NIEROZPOCZETA;


extern STAN_GRY g_Stan_Gry;
#endif

Link do komentarza
Udostępnij na innych stronach

w pliku game1.h includuj to co w game1.cpp, w game1.cpp powinno być tylko includowanie game1.h, w ogóle o czemu g_Stan_Gry jest extern? bo je w pliku main.cpp? nie może być extern, extern sie używa gdy jakaś zmienna jest w innym pliku h, a nie cpp, przecież main icluduje game1.h więc będzie miał dostęp do tej zmiennej

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...