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. #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() { 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() { 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? |
|
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.: void postac_tab( postac * tab, int rozmiar ) { }
void postac_info( const postac & player ) { }
void postac_nowylvl( postac & player ) { }
void walka( potwor & enemy1, potwor & enemy2 ) { }
|
|
oen432 Temat założony przez niniejszego użytkownika |
» 2014-11-12 17:48:04 Teraz to wygląda tak: #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 ]; 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 ) { 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)) ===|
|
|
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 ) |
|
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 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"? |
|
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ź |
|
Monika90 |
» 2014-11-12 20:21:36 Jak zadeklarować "player"? |
Tak samo jak potwory void walka( postac & player, potwor & enemy1, potwor & enemy2 ) { }
|
|
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ń. #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 ]; 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 ) { 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; } } } }
|
|
« 1 » 2 |