Warsztat » Forum

[Programowanie] Wywołanie metody poprzez wskaźnik - dziwny błąd

Feb 10, 2008 | cmons |
39 wypowiedzi na 3 stronach:
1 2 3
cmons
Feb 10, 2008

Wywołanie metody poprzez wskaźnik - dziwny błąd

Mam problem, posiadam wskaźnik na obiekt i kiedy wywołam metodę wyskakuje dziwny błąd. Metoda ta nie robi nic innego jak przypisuje zmiennej wartość.

metoda:
Kod: 

void S_BMP::setBitmap( ALLEGRO_BITMAP *bmp )
{
   bitmap = bmp;
}


Wywołanie metody:
Kod: 

screen = new S_BMP;
screen->setBitmap( al_get_backbuffer() );


Błąd:


Tłumacząc ten błąd, również nie jestem wstanie zrozumieć dlaczego. Pokazywanie całego kodu nie ma sensu. Tak więc może ktoś wie czego rezultatem może być ten błąd?
Esidar
Feb 11, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Jakaś metoda ma zamazany stos. Najczęściej jakaś metoda ma na stosie tablicę i wychodzi po za jej zakres:

Kod: 

void Foo()
{
int cos[ 10 ];
    screen = new S_BMP;
    cos[ 11 ] = 0; // <- trefny kod
    screen->setBitmap( al_get_backbuffer() );
    ....
} <-- tutaj przy wyjsciu nastepuje błąd.. winowajca jest gdzie pomiędzy wejściem do funkcji a jej wyjściem

cmons
Feb 11, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Odkryłem źródło błędu ale nie wiem dlaczego powoduje to błąd.

Otóż są dwie klasy: S_GFX oraz S_BMP. Ta druga jest pochodną od tej pierwszej. I obie posiadały metody:

class S_GFX:
Kod: virtual S_GFX_TYPE getType()
{
   return S_GFX_NONE;
}


class S_BMP:
Kod: S_GFX_TYPE getType()
{
   return S_GFX_BMP;
}


Po usunięciu tych metod błąd się nie pojawia ale wciąż nie wiem dlaczego. I czy ma to jakiś związek z zamazanym stosem?
Esidar
Feb 11, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Jeszcze w teorii, problem mógł polegać na tym że wywołujesz metodę zadeklarowaną jako _stdcall a wywołujesz ją jako __cdecl... ale na ogół nie powinno ci się wtedy skompilować (są używane inne name decoration).

Najlepiej użyj debugera i idź krok po kroku.
Liosan
Feb 11, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Jeśli (załóżmy) dodałeś tą metodę getType() niedawno, i jest ona w pliku nagłówkowym... to clean + rebuild all. Zdarza mi się w 100% przypadków, że VC++ sobie z tym przypadkiem nie radzi.

// btw, czy nie powinno być virtual przy getType() w S_BMP?

Liosan
cmons
Feb 12, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Liosan chylę czoło. Teraz już zawsze będę pamiętał aby na nowo skompilować cały projekt jeśli mam jakiś problem a dopiero potem się głowić jeśli to nie pomoże. ( wystarczył sam rebuild )
Esidar
Feb 12, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

// btw, czy nie powinno być virtual przy getType() w S_BMP?

Jeżeli virtual jest w klasie bazowej to wyżej już nie trzeba pisać.
snakeomeister
Feb 13, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

^Wtedy to getType() w klasie pochodnej automatycznie też jest virtual?
Aithne
Feb 13, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

tak
Nargil
Feb 13, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

NIE! Virtual oznacza, że jeśli w klasie bazowej jest wywołanie danej metody, a jakaś klasa po niej dziedziczy to klasa dziedzicząca może sobie nadpisać tą wirtualną metodą. Natomiast jeśli trzecia klasa dziedziczyłaby sobie jeszcze po tej już dziedziczącej klasie to owe virtual nie przechodzi z klasy pierwszej. Należy je sobie w razie potrzeby dopisać do ów drugiej. Nie ma natomiast sensu dopisywać virtual do metod klasy, po której nic już nie będzie dziedziczyło.
ShadowDancer
Feb 14, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cóż, a jeśli w przyszłości jeszcze będziemy wyprowadzać? Możemy wpisać virtual, nie zajmie to nam dużo czasu, działania programu nie zmieni, ale będziemy pamiętać, że ta funkcja jest wirtualna.
Esidar
Feb 12, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:

NIE!

A sprawdziłeś ?
Xion
Feb 14, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Cytat:
Natomiast jeśli trzecia klasa dziedziczyłaby sobie jeszcze po tej już dziedziczącej klasie to owe virtual nie przechodzi z klasy pierwszej. Należy je sobie w razie potrzeby dopisać do ów drugiej.

Co to za herezje? Metoda raz zadeklarowana jako wirtualna będzie taka i w 67. klasie pochodnej. 'virtual' w wersji metody z klasy pochodnej jest całkowicie opcjonalne i nic nie zmienia (w szczególności jego brak nie działa jak 'sealed' z C# czy 'final' z Javy).
Aithne
Feb 19, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

A potem się zastanawiaj, które konkretnie metody w tej sześćdziesiątej siódmej klasie pochodnej są przesłonięte, które są nowo wprowadzonymi metodami wirtualnymi, a które nic z tych dwóch... Oczywiście musisz sprawdzić wszystkie sześćdziesiąt sześć klas bazowych. Ach, jak temu C++ brakuje choćby takiego głupiego override.
ShadowDancer
Feb 19, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

A widziałeś projekt, w którym po sobie dziedziczyło by więcej, niż np. 15 klas? Bo ja nie...
Kos
Feb 16, 2008

Odp: Wywołanie metody poprzez wskaźnik - dziwny błąd

Czemu mam każdorazowo pod chrome warna bezpieczeństwa gdy wchodzę na ten (i tylko ten) temat? :o
Strony:
1 2 3