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

Czytanie tablic w funkcji

Ostatnio zmodyfikowano 2014-11-14 11:10
Autor Wiadomość
oen432
Temat założony przez niniejszego użytkownika
Czytanie tablic w funkcji
» 2014-11-12 15:57:31
Witam,

Mam przykładowy kod z użyciem struktur i tablic.

C/C++
#include <iostream>
#include <windows.h>

bool wyprawa = true;

struct postac
{
    std::string nazwa;
    std::string klasa;
    int poziom;
    int exp_min;
    int exp_max;
    int zycie_min;
    int zycie_max;
    int mana_min;
    int mana_max;
    int atak;
    int obrona;
    int sila;
    int zrecznosc;
    int inteligencja;
    int wytrzymalosc;
    int witalnosc;
};

struct potwor
{
    std::string nazwa;
    std::string opis;
    int zycie_min;
    int zycie_max;
    int atak;
    int obrona;
    int exp;
    int gold;
    int ilosc;
};

void postac_tab()
{
    postac player[ 3 ];
   
    player[ 0 ].klasa = "Test";
    player[ 0 ].poziom = 1;
    player[ 0 ].exp_min = 0 + exp;
    player[ 0 ].exp_max = 10;
    player[ 0 ].zycie_min = 100;
    player[ 0 ].zycie_max = 100;
    player[ 0 ].mana_min = 50;
    player[ 0 ].mana_max = 50;
}

void postac_info()
{
    //informacje o postaci
    std::cout << "Nazwa: " << player[ 0 ].nazwa << std::endl;
    std::cout << "Klasa: " << player[ 0 ].klasa << std::endl;
    std::cout << "Poziom: " << player[ 0 ].poziom << std::endl;
    std::cout << "Doswiadczenie: " << player[ 0 ].exp_min << "/" << player[ 0 ].exp_max << std::endl;
    std::cout << "Zdrowie: " << player[ 0 ].zycie_min << "/" << player[ 0 ].zycie_max << std::endl;
    std::cout << "Mana: " << player[ 0 ].mana_min << "/" << player[ 0 ].mana_max << std::endl << std::endl;
}

void postac_nowylvl()
{
    if( player[ 0 ].exp_min == player[ 0 ].exp_max )
    {
        int opcja;
        wyprawa = false;
        system( "cls" );
        std::cout << "Awansowales na nowy poziom" << std::endl;
        std::cin >> opcja;
        switch( opcja )
        {
        case 1:
            player[ 0 ].zycie_max += 10;
            player[ 0 ].zycie_min = player[ 0 ].zycie_max;
            wyprawa = true;
            break;
        }
        player[ 0 ].exp_max += player[ 0 ].exp_max * 2;
        player[ 0 ].exp_min = 0;
    }
}

void potwor_tab()
{
    potwor enemy[ 2 ];
   
    enemy[ 0 ].nazwa = "Szczur";
    enemy[ 0 ].opis = "Gryzon";
    enemy[ 0 ].zycie_min = 5;
    enemy[ 0 ].zycie_max = 5;
   
    enemy[ 1 ].nazwa = "Pies";
    enemy[ 1 ].opis = "Piesek";
    enemy[ 1 ].zycie_min = 10;
    enemy[ 1 ].zycie_max = 10;
}

void walka()
{
    int akcja;
   
    potwor * aktualny = & enemy[ 0 ];
    potwor * aktualny2 = & enemy[ 1 ];
   
    while( wyprawa )
    {
        while( aktualny->ilosc >= 0 )
        {
            system( "cls" );
            std::cout << "Nazwa: " << enemy[ 0 ].nazwa << std::endl;
            std::cout << "Opis: " << enemy[ 0 ].opis << std::endl;
            std::cout << "Zycie: " << enemy[ 0 ].zycie_min << "/" << enemy[ 0 ].zycie_max << std::endl;
            std::cout << "Ilosc: " << enemy[ 0 ].ilosc << std::endl;
            std::cin >> akcja;
           
            switch( akcja )
            {
            case 1:
                enemy[ 0 ].zycie_min -= 1;
                break;
            }
        }
       
        while( aktualny2->zycie_min >= 0 )
        {
            std::cout << "Nazwa: " << enemy[ 1 ].nazwa << std::endl;
            std::cout << "Opis: " << enemy[ 1 ].opis << std::endl;
            std::cout << "Zycie: " << enemy[ 1 ].zycie_min << "/" << enemy[ 1 ].zycie_max << std::endl;
            std::cout << "Ilosc: " << enemy[ 1 ].ilosc << std::endl;
            std::cin >> akcja;
           
            switch( akcja )
            {
            case 1:
                enemy[ 1 ].zycie_min -= 1;
                break;
            }
        }
       
    }
   
}

int main()
{
    //zmiany w konsoli
    system( "color 7f" );
   
    return 0;
}

Mój problem polega na tym, że w void postac_info kompilator nie może odczytać danych z void postac_tab. A gdy chcę wrzucić informacje o postaci (postac_info) do void walka to problem leży z błędnie odczytanymi danymi. Jak ma ten kod wyglądać abym mógł to podzielić na kilka funkcji żeby nie robić zbędnego powtarzanie kodu?
P-120430
Monika90
» 2014-11-12 17:35:39
Tablice postac player[3]; i potwor enemy[2]; zadeklaruj w main (i tylko w main).
A do funkcji przekazuj wskaźnik do pierwszego elementu tablicy i jej rozmiar, albo referencje do tych elementów tablicy które w funkcji są potrzebne. Np.:

C/C++
void postac_tab( postac * tab, int rozmiar )
{
}

void postac_info( const postac & player )
{
}

void postac_nowylvl( postac & player )
{
}

void walka( potwor & enemy1, potwor & enemy2 )
{
}
P-120435
oen432
Temat założony przez niniejszego użytkownika
» 2014-11-12 17:48:04
Teraz to wygląda tak:
C/C++
#include <iostream>
#include <windows.h>

bool wyprawa = true;

int NT_SetConsoleDisplayMode( HANDLE hOutputHandle, DWORD dwNewMode )
{
    typedef BOOL( WINAPI * SCDMProc_t )( HANDLE, DWORD, LPDWORD );
   
    SCDMProc_t SetConsoleDisplayMode;
    HMODULE hKernel32;
    BOOL bFreeLib = FALSE, ret;
    const char KERNEL32_NAME[] = "kernel32.dll";
    hKernel32 = GetModuleHandleA( KERNEL32_NAME );
   
    if( hKernel32 == NULL )
    {
        hKernel32 = LoadLibraryA( KERNEL32_NAME );
        if( hKernel32 == NULL )
             return FALSE;
       
        bFreeLib = true;
    }
   
    SetConsoleDisplayMode =
    ( SCDMProc_t ) GetProcAddress( hKernel32, "SetConsoleDisplayMode" );
   
    if( SetConsoleDisplayMode == NULL )
    {
        SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
        ret = FALSE;
    }
    else
    {
        DWORD dummy;
        ret = SetConsoleDisplayMode( hOutputHandle, dwNewMode, & dummy );
    }
    if( bFreeLib )
         FreeLibrary( hKernel32 );
   
    return ret;
}

struct postac
{
    std::string nazwa;
    std::string klasa;
    int poziom;
    int exp_min;
    int exp_max;
    int zycie_min;
    int zycie_max;
    int mana_min;
    int mana_max;
    int atak;
    int obrona;
    int sila;
    int zrecznosc;
    int inteligencja;
    int wytrzymalosc;
    int witalnosc;
};

struct potwor
{
    std::string nazwa;
    std::string opis;
    int zycie_min;
    int zycie_max;
    int atak;
    int obrona;
    int exp;
    int gold;
    int ilosc;
};

int main()
{
    postac player[ 3 ];
    potwor enemy[ 2 ];
   
    //zmiany w konsoli
    NT_SetConsoleDisplayMode( GetStdHandle( STD_OUTPUT_HANDLE ), 1 );
    system( "color 7f" );
    SetConsoleTitle( TEXT( "Guthix RPG by oeN." ) );
   
    return 0;
}

void postac_tab( postac * player, int rozmiar )
{
    player[ 0 ].klasa = "Test";
    player[ 0 ].poziom = 1;
    player[ 0 ].exp_min = 0;
    player[ 0 ].exp_max = 10;
    player[ 0 ].zycie_min = 100;
    player[ 0 ].zycie_max = 100;
    player[ 0 ].mana_min = 50;
    player[ 0 ].mana_max = 50;
}

void postac_info( const postac & player )
{
    //informacje o postaci
    std::cout << "Nazwa: " << player[ 0 ].nazwa << std::endl;
    std::cout << "Klasa: " << player[ 0 ].klasa << std::endl;
    std::cout << "Poziom: " << player[ 0 ].poziom << std::endl;
    std::cout << "Doswiadczenie: " << player[ 0 ].exp_min << "/" << player[ 0 ].exp_max << std::endl;
    std::cout << "Zdrowie: " << player[ 0 ].zycie_min << "/" << player[ 0 ].zycie_max << std::endl;
    std::cout << "Mana: " << player[ 0 ].mana_min << "/" << player[ 0 ].mana_max << std::endl << std::endl;
}

void postac_nowylvl( postac & player )
{
    if( player[ 0 ].exp_min == player[ 0 ].exp_max )
    {
        int opcja;
        wyprawa = false;
        system( "cls" );
        std::cout << "Awansowales na nowy poziom" << std::endl;
        std::cin >> opcja;
        switch( opcja )
        {
        case 1:
            player[ 0 ].zycie_max += 10;
            player[ 0 ].zycie_min = player[ 0 ].zycie_max;
            wyprawa = true;
            break;
           
        case 2:
            wyprawa = true;
            break;
        }
        player[ 0 ].exp_max += player[ 0 ].zycie_max * 2;
        player[ 0 ].exp_min = 0;
    }
}

void walka( potwor & enemy1, potwor & enemy2 )
{
    int akcja;
   
    potwor * aktualny = & enemy[ 0 ];
    potwor * aktualny2 = & enemy[ 1 ];
   
    while( wyprawa )
    {
        while( aktualny->ilosc >= 0 )
        {
            system( "cls" );
            postac_tab();
            std::cout << "Nazwa: " << enemy[ 0 ].nazwa << std::endl;
            std::cout << "Opis: " << enemy[ 0 ].opis << std::endl;
            std::cout << "Zycie: " << enemy[ 0 ].zycie_min << "/" << enemy[ 0 ].zycie_max << std::endl;
            std::cout << "Ilosc: " << enemy[ 0 ].ilosc << std::endl;
            std::cin >> akcja;
           
            switch( akcja )
            {
            case 1:
                enemy[ 0 ].zycie_min -= 1;
                break;
            }
           
            if( enemy[ 0 ].zycie_min != 0 )
            {
                enemy[ 0 ].ilosc--;
                player[ 0 ].exp_min += 1;
            }
        }
       
        while( aktualny2->zycie_min >= 0 )
        {
            std::cout << "Nazwa: " << enemy[ 1 ].nazwa << std::endl;
            std::cout << "Opis: " << enemy[ 1 ].opis << std::endl;
            std::cout << "Zycie: " << enemy[ 1 ].zycie_min << "/" << enemy[ 1 ].zycie_max << std::endl;
            std::cout << "Ilosc: " << enemy[ 1 ].ilosc << std::endl;
            std::cin >> akcja;
           
            switch( akcja )
            {
            case 1:
                enemy[ 1 ].zycie_min -= 1;
                break;
            }
        }
       
    }
   
}


||=== Build: Debug in guthix (compiler: GNU GCC Compiler) ===|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp||In function 'int main()':|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|78|warning: unused variable 'player' [-Wunused-variable]|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|79|warning: unused variable 'enemy' [-Wunused-variable]|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp||In function 'void postac_info(const postac&)':|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|104|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|105|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|106|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|107|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|107|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|108|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|108|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|109|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|109|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp||In function 'void postac_nowylvl(postac&)':|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|114|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|114|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|124|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|125|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|125|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|133|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|133|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|134|error: no match for 'operator[]' in 'player[0]'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp||In function 'void walka(potwor&, potwor&)':|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|142|error: 'enemy' was not declared in this scope|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|150|error: too few arguments to function 'void postac_tab(postac*, int)'|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|89|note: declared here|
C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|167|error: 'player' was not declared in this scope|
||=== Build failed: 20 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|
P-120439
Monika90
» 2014-11-12 18:49:55
Musisz dostsować treść funkcji do jej prametrów. Np. w funkcji void postac_info( const postac & player ) zmienna player to juz nie jest tablica teraz to jest referencja do pojedyńczego obiektu, więc zamiast player[0] daj po prostu player. Podobnie w funkcjach void postac_nowylvl( postac & player ) i void walka( potwor & enemy1, potwor & enemy2 )
P-120444
oen432
Temat założony przez niniejszego użytkownika
» 2014-11-12 19:06:09
Od razu nauczyłem się czegoś nowego, dziękuje. Niestety pozostaje jeszcze jeden błąd przy kompilacji.

W
C/C++
void walka( potwor & enemy1, potwor & enemy2 )
{
    int akcja;
   
    potwor * aktualny = & enemy1;
    potwor * aktualny2 = & enemy2;
   
    while( wyprawa )
    {
        while( aktualny->ilosc >= 0 )
        {
            system( "cls" );
            std::cout << "Nazwa: " << enemy1.nazwa << std::endl;
            std::cout << "Opis: " << enemy1.opis << std::endl;
            std::cout << "Zycie: " << enemy1.zycie_min << "/" << enemy1.zycie_max << std::endl;
            std::cout << "Ilosc: " << enemy1.ilosc << std::endl;
            std::cin >> akcja;
           
            switch( akcja )
            {
            case 1:
                enemy1.zycie_min -= 1;
                break;
            }
           
            if( enemy1.zycie_min != 0 )
            {
                enemy1.ilosc--;
                player.exp_min += 1;
            }
        }
       
        while( aktualny2->zycie_min >= 0 )
        {
            std::cout << "Nazwa: " << enemy2.nazwa << std::endl;
            std::cout << "Opis: " << enemy2.opis << std::endl;
            std::cout << "Zycie: " << enemy2.zycie_min << "/" << enemy2.zycie_max << std::endl;
            std::cout << "Ilosc: " << enemy2.ilosc << std::endl;
            std::cin >> akcja;
           
            switch( akcja )
            {
            case 1:
                enemy2.zycie_min -= 1;
                break;
            }
        }
       
    }
   
}

C:\Documents and Settings\Oen\Pulpit\guthix\silnik.cpp|166|error: 'player' was not declared in this scope|

Jak zadeklarować "player"?
P-120447
wilkoo13
» 2014-11-12 19:59:24
Jestem początkujący ale może coś wniosę do sprawy. Jeżeli pojawia się błąd że coś nie zostało zadeklarowane to znaczy że pprst kompilator nie może znaleźć zmiennej. Albo jest ona poza zasięgiem funkcji albo nie istnieje. Może na liście argumentów funkcji dodaj player.
Srry jeśli zła odpowiedź
P-120456
Monika90
» 2014-11-12 20:21:36
Jak zadeklarować "player"?
Tak samo jak potwory
C/C++
void walka( postac & player, potwor & enemy1, potwor & enemy2 )
{
    //...
}
P-120462
oen432
Temat założony przez niniejszego użytkownika
» 2014-11-12 20:59:03
Teraz to zgłupiałem. Wszystko ładnie się kompiluje, ale... No właśnie od razu jest zatrzymanie programu. A najlepsze jest to że przed zmianą głupiego zycie_max na exp_max działało... Brak jakichkolwiek błędów czy ostrzeżeń.

C/C++
#include <iostream>
#include <windows.h>

bool wyprawa = true;

int NT_SetConsoleDisplayMode( HANDLE hOutputHandle, DWORD dwNewMode )
{
    typedef BOOL( WINAPI * SCDMProc_t )( HANDLE, DWORD, LPDWORD );
   
    SCDMProc_t SetConsoleDisplayMode;
    HMODULE hKernel32;
    BOOL bFreeLib = FALSE, ret;
    const char KERNEL32_NAME[] = "kernel32.dll";
    hKernel32 = GetModuleHandleA( KERNEL32_NAME );
   
    if( hKernel32 == NULL )
    {
        hKernel32 = LoadLibraryA( KERNEL32_NAME );
        if( hKernel32 == NULL )
             return FALSE;
       
        bFreeLib = true;
    }
   
    SetConsoleDisplayMode =
    ( SCDMProc_t ) GetProcAddress( hKernel32, "SetConsoleDisplayMode" );
   
    if( SetConsoleDisplayMode == NULL )
    {
        SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
        ret = FALSE;
    }
    else
    {
        DWORD dummy;
        ret = SetConsoleDisplayMode( hOutputHandle, dwNewMode, & dummy );
    }
    if( bFreeLib )
         FreeLibrary( hKernel32 );
   
    return ret;
}

struct postac
{
    std::string nazwa;
    std::string klasa;
    int poziom;
    int exp_min;
    int exp_max;
    int zycie_min;
    int zycie_max;
    int mana_min;
    int mana_max;
    int atak;
    int obrona;
    int sila;
    int zrecznosc;
    int inteligencja;
    int wytrzymalosc;
    int witalnosc;
};

struct potwor
{
    std::string nazwa;
    std::string opis;
    int zycie_min;
    int zycie_max;
    int atak;
    int obrona;
    int exp;
    int gold;
    int ilosc;
};

int main()
{
    postac player[ 1 ];
    potwor enemy[ 2 ];
   
    //zmiany w konsoli
    NT_SetConsoleDisplayMode( GetStdHandle( STD_OUTPUT_HANDLE ), 1 );
    system( "color 7f" );
    SetConsoleTitle( TEXT( "Guthix RPG by oeN." ) );
   
    return 0;
}

void postac_tab( postac * player, int rozmiar )
{
    player->klasa = "Test";
    player->poziom = 1;
    player->exp_min = 0;
    player->exp_max = 10;
    player->zycie_min = 100;
    player->zycie_max = 100;
    player->mana_min = 50;
    player->mana_max = 50;
}

void postac_info( const postac & player )
{
    //informacje o postaci
    std::cout << "Nazwa: " << player.nazwa << std::endl;
    std::cout << "Klasa: " << player.klasa << std::endl;
    std::cout << "Poziom: " << player.poziom << std::endl;
    std::cout << "Doswiadczenie: " << player.exp_min << "/" << player.exp_max << std::endl;
    std::cout << "Zdrowie: " << player.zycie_min << "/" << player.zycie_max << std::endl;
    std::cout << "Mana: " << player.mana_min << "/" << player.mana_max << std::endl << std::endl;
}

void postac_nowylvl( postac & player )
{
    if( player.exp_min == player.exp_max )
    {
        int opcja;
        wyprawa = false;
        system( "cls" );
        std::cout << "Awansowales na nowy poziom" << std::endl;
        std::cin >> opcja;
        switch( opcja )
        {
        case 1:
            player.zycie_max += 10;
            player.zycie_min = player.zycie_max;
            wyprawa = true;
            break;
           
        case 2:
            wyprawa = true;
            break;
        }
        player.exp_max += player.exp_max * 2;
        player.exp_min = 0;
    }
}

void walka( postac & player, potwor & enemy1, potwor & enemy2 )
{
    int akcja;
   
    potwor * aktualny = & enemy1;
    potwor * aktualny2 = & enemy2;
   
    while( wyprawa )
    {
        while( aktualny->ilosc >= 0 )
        {
            system( "cls" );
            std::cout << "Nazwa: " << enemy1.nazwa << std::endl;
            std::cout << "Opis: " << enemy1.opis << std::endl;
            std::cout << "Zycie: " << enemy1.zycie_min << "/" << enemy1.zycie_max << std::endl;
            std::cout << "Ilosc: " << enemy1.ilosc << std::endl;
            std::cin >> akcja;
           
            switch( akcja )
            {
            case 1:
                enemy1.zycie_min -= 1;
                break;
            }
           
            if( enemy1.zycie_min != 0 )
            {
                enemy1.ilosc--;
                player.exp_min += 1;
            }
        }
       
        while( aktualny2->zycie_min >= 0 )
        {
            std::cout << "Nazwa: " << enemy2.nazwa << std::endl;
            std::cout << "Opis: " << enemy2.opis << std::endl;
            std::cout << "Zycie: " << enemy2.zycie_min << "/" << enemy2.zycie_max << std::endl;
            std::cout << "Ilosc: " << enemy2.ilosc << std::endl;
            std::cin >> akcja;
           
            switch( akcja )
            {
            case 1:
                enemy2.zycie_min -= 1;
                break;
            }
        }
       
    }
}
P-120470
« 1 » 2
  Strona 1 z 2 Następna strona