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

Komunikacja zmiennej z pliku nagłówkowego z plikami .cpp

Ostatnio zmodyfikowano 2013-07-18 20:50
Autor Wiadomość
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
C/C++
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:
C/C++
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.

P-88070
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.
P-88071
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.
P-88075
unimator
» 2013-07-17 13:16:18
W tym innym pliku modułowym (którego nie podałeś), w miejscu deklaracji zmiennej daj:
C/C++
extern int xp;
P-88076
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:
C/C++
if( xp == 1 ) { system( "COLOR 07" ); }
itd.
P-88077
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
C/C++
#include <jakis_plik>
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:
C/C++
#ifndef NAZWA_PLIKU_H
#define NAZWA_PLIKU_H
//tresc pliku
#endif
dzięki czemu zapobiegniesz wielokrotnym umieszczaniu plików nagłówkowych. Ewentualnie jest jeszcze dyrektywa:
C/C++
#pragma (once)
która też do tego służy.
P-88079
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.
C/C++
int n; //DEFINICJA zmiennej - raz na program
extern int n; //DEKLARACJA zmiennej - gdzie tylko się chce
P-88081
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)
{
C/C++
int xp = 0;

int SetColorsP1( int xp )

//malo wazny kod


//tutaj koniec funkcji
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)
C/C++
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.
P-88133
« 1 » 2
  Strona 1 z 2 Następna strona