CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Bład w grze [System Error code 87]

Bład w grze [System Error code 87]

dział ogólny

Bład w grze [System Error code 87]

Nowy postprzez szosti » wtorek, 19 marca 2013, 20:42

Witam, mam mały problem z moją pseudo grą (pisaną w C++ builder 6), chodzi o to że wyskakuje błąd czasem od razu po wygraniu (zadaniem gracza jest ułożenie równania) a czasem wystarczy zrobić kilka ruchów zaraz po załadowaniu nowej gry, wcześniej tak nie było i nie bardzo wiem co jest przyczyną tego błędu. Niestety programista to ze mnie na razie żaden i kod też nie jest powalający na początek dodam że jest to moja pierwsza 'gra'. Mega licze na jakieś wskazówki od was

Treść Błedu:
Obrazek


I miejsce na które wskazuje kompilator występuje:
Obrazek

Całą gre można pobrać stąd http://www.sendspace.pl/file/e1a18e3066 ... 7886/hipek
Avatar użytkownika
szosti
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): wtorek, 19 marca 2013, 20:09
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Microsoft Windows XP
Kompilator: Borland C++ builder 6
Gadu Gadu: 9993589
    Windows XPFirefox

Re: Bład w grze [System Error code 87]

Nowy postprzez Cyfrowy Baron » środa, 20 marca 2013, 09:22

Komunikat błędu w zasadzie nic mi nie mówi. Co się zaś tyczy drugiego zrzutu ekranu, to dotyczy on linii numer 204 i 216 i oznacza, że kod jest nieosiągalny, czyli masz tam coś z czego program nie może skorzystać, nie jest to błąd lecz ostrzeżenie, niemniej w pewnych sytuacjach prowadzi to do błędu.

Co mnie zastanawia to ta ścieżka dostępu: "C:\\Document and Settings\\Indianer\\Pulpit\\Hipek\\images\\"

Przypuszczam, że odnosi się ona do jakiegoś katalogu gry, co jeżeli jednak ścieżka nie będzie istniała, bo katalog z grą nie zostanie umieszczony na pulpicie?!
Program powinien sprawdzać czy ścieżka do pliku istnieje. Funkcja load mogłaby wyglądać tak:

KOD cpp:     UKRYJ  
void TForm1::load( String file )
{
  String body = "C:\\Document and Settings\\Indianer\\Pulpit\\Hipek\\images\\" +  file;

  if( !FileExists( body) )
  {
    ShowMessage("Bład! Plik: '" + body + "' nie istnieje!");
    return;
  }

  BMP = new Graphics::TBitmap;

  BMP->LoadFromFile( body );
}


Rodzi się jednak pytanie - po co podawać w programie jawną ścieżkę, która wcale nie musi istnieć?

Kolejna sprawa wewnątrz funkcji load tworzysz obiekt BMP, czyli przy każdym wywołaniu tej funkcji obiekt będzie tworzony na nowo, a stary będzie gubiony. Czy niszczysz gdzieś stary obiekt BMP przed wywołaniem nowego? Może powinieneś przemyśleć ten kod, może funkcja powinna wyglądać tak:

KOD cpp:     UKRYJ  
void TForm1::load( String file )
{
  String body = "C:\\Document and Settings\\Indianer\\Pulpit\\Hipek\\images\\" +  file;

  if( !FileExists( body) )
  {
    ShowMessage("Bład! Plik: '" + body + "' nie istnieje!");
    return;
  }

  if( BMP != NULL )
  {
     delete BMP;
     BMP = NULL;
  }

  BMP = new Graphics::TBitmap;

  BMP->LoadFromFile( body );
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
szosti
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Bład w grze [System Error code 87]

Nowy postprzez polymorphism » środa, 20 marca 2013, 11:54

Odnośnie unreachable code:
KOD cpp:     UKRYJ  
bool TForm1::block(int x, int y)
{
        ...
                if(g_word[x][y] == i)
                {
                        return false;
                        break;  //<----  unreachable code
                }
        ...
 


Popraw funkcję render. Teraz czytasz za każdym razem bitmapy dla każdego pola, co skutecznie spowalnia składanie obrazu. Dodatkowo nie zwalniasz ich. Stwórz sobie tablicę bitmap, załaduj do niej wszystkie potrzebne bitmapy, a wtedy funkcję render można by zredukować do postaci:
KOD cpp:     UKRYJ  
TBitmap* m_BMP[/* liczba bitmap */];
...

void TForm1::render(int positionX, int positionY)
{
        for (int x = 0; x < MAX_X; ++x)
        {
                for ( int y = 0; y < MAX_Y; ++y)
                {
                        Form1->Canvas->Draw(x * 40, y * 40, m_BMP[ g_word[x][y] ] );
                }
        }

        Form1->Hipek->Left=(positionX*40);
        Form1->Hipek->Top=(positionY*40);
        Form1->Hipek->Visible=true;
        Form1->Hipek->Refresh();
}

Funkcja jest o wiele prostsza, czytelniejsza i - co najważniejsze - szybsza. Oczywiście tablica g_word powinna być wypełniona poprawnymi indeksami tablicy m_BMP, ale to jest, jak to mawiał klasyk, oczywista oczywistość ;)

Następną rzeczą poprawiającą czytelność jest unikanie magicznych numerów. Teraz g_word zawiera jakieś niewiele mówiące liczby, przecież można tak:
KOD cpp:     UKRYJ  
enum
{
        idGrass = 0,
        idBox,
        idFlybox,
        idBarrier,
        idEqualSign,
        idTwo,
        idSqrt,
        idMulSign,
        idFlybox2,
        idFreeSpace,
        idMaxIDs
};

TBitmap* m_BMP[ idMaxIDs ];

m_BMP[ idGrass ]        = load_bmp("grass.bmp");
m_BMP[ idBox ]          = load_bmp("box.bmp");
...

m_BMP[ idFreeSpace ]    = load_bmp("freespace.bmp");
 

Wtedy analiza i utrzymanie kodu jest o wiele prostsze, bo wiadomo na czym operujemy:
KOD cpp:     UKRYJ  
if((g_word[x][y+1] == idFlybox2 || g_word[x][y+1] == idFlybox) && Form1->Hipek->Top != 360)
{
        g_word[x][y] = idFreeSpace;
        g_word[x][y-1] = idFreeSpace;
        g_Hcatch = true;
        g_Up = true;
        g_gameOver = true;
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
szosti
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Bład w grze [System Error code 87]

Nowy postprzez szosti » czwartek, 21 marca 2013, 20:52

Faktycznie brak niszczenia BMP prowadziło do wysypania się programu. Jeśli chodzi o renderowanie, zmieniłem i działa o wiele szybciej ale rodzi się jedno pytanie czy kończąc program musze usuwać tablice ??
A druga sprawa, tablice deklaruje w pliku nagłówkowy i nie wiem jak zrobić bym nie musiał podawać na sztywno jej rozmiaru, tylko tak aby zależała ona od wartości idMaxIDs ?

PS. Wielkie dzięki wam za pomoc i szybką odpowiedź ; ))
Avatar użytkownika
szosti
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): wtorek, 19 marca 2013, 20:09
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Microsoft Windows XP
Kompilator: Borland C++ builder 6
Gadu Gadu: 9993589
    Windows XPFirefox

Re: Bład w grze [System Error code 87]

Nowy postprzez polymorphism » czwartek, 21 marca 2013, 22:53

Generalnie zasada jest taka: wszystko, co zostało przydzielone na stercie, powinno zostać zwolnione w momencie, gdy nie jest już potrzebne, nawet przy wychodzeniu z programu.

Drugiego pytania nie rozumiem, przecież podałem jak to zrobić. idMaxIDs jest wartością stałą, więc możesz ją podać przy definicji tablicy.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 10 gości

cron