TheReclif Temat założony przez niniejszego użytkownika |
0xC0000005: Access violation reading location 0x00000000 » 2015-03-24 22:24:14 Witam! Eksperymentuję trochę z DirectX 11 i stworzyłem proste API(a raczej coś w jego rodzaju) do obsługi tej biblioteki. Po napisaniu prostej, testowej aplikacji(korzystając oczywiście z API, które nazwałem GlowAPI) wywala mi się komunikat w okienku dialogowym: R6010: abort() has been called. Postanawiam debugować aplikację i API, ale co mi wyskakuje przy tym kawałku kodu?: result = swapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ),( LPVOID * ) & backBufferPtr );
W tym miejscu wyskakuje najpierw błąd: Microsoft C++ exception: int at memory location 0x00FDF3F4
Pomijam to. Kolejnym czymś jest inny błąd, zduplikowany w nieskończoność(tzn. próba kontynuowania kończy się powtórką tego samego błędu): 0xC0000005: Access violation reading location 0x00000000
Czym jest to spowodowane? Szukając w Google znalazłem tylko przypadki jednostkowe, do których się nie zaliczam. Na koniec dodam, że API jest zbudowane po części tak, jak w tym kursie i w konkretnie tej lekcji: [url]http://rastertek.com/dx11tut03.html[/url]. Kiedy próbuję napisać coś, co DX obsłuży w plikach nagłówkowych, to zawsze jest coś nie tak. Czy coś się na mnie uwzięło? A może to klątwa? W każdym bądź razie proszę o pomoc. EDIT: Dodam, że korzystam z Visual Studio 2013 Community. |
|
Brunon3 |
» 2015-03-24 22:26:41 Mi to wygląda na odwoływanie się do pustego miejsca w pamięci (pustego wskaźnika).
Nic Ci z tej linijki kodu nie wywróżę. Pokaż resztę kodu.
Co rozumiesz przez API?
-BD. |
|
NopeDotAvi |
» 2015-03-24 22:29:19 masz wszystkie wskaźniki odpowiednio zainicjowane? |
|
TheReclif Temat założony przez niniejszego użytkownika |
» 2015-03-27 23:09:10 Z tego, co mi się zdaje, to backBufferPtr nie może być zainicjalizowany tak: DX_Texture2D * backBufferPtr = new DX_Texture2D;
ponieważ IntelliSense zgłasza mniej więcej coś takiego: 1 IntelliSense: object of abstract class type "ID3D11Texture2D" is not allowed: function "ID3D11Texture2D::GetDesc" is a pure virtual function pure virtual function "ID3D11Resource::GetType" has no overrider pure virtual function "ID3D11Resource::SetEvictionPriority" has no overrider pure virtual function "ID3D11Resource::GetEvictionPriority" has no overrider pure virtual function "ID3D11DeviceChild::GetDevice" has no overrider pure virtual function "ID3D11DeviceChild::GetPrivateData" has no overrider pure virtual function "ID3D11DeviceChild::SetPrivateData" has no overrider pure virtual function "ID3D11DeviceChild::SetPrivateDataInterface" has no overrider pure virtual function "IUnknown::QueryInterface(const IID &riid, void **ppvObject)" has no overrider pure virtual function "IUnknown::AddRef" has no overrider pure virtual function "IUnknown::Release" has no overrider c:\***\main.h 107
Co do miejsc, w których backBufferPtr jest modyfikowany(same kawałki kodu, w kolejności chronologicznej): typedef IDXGISwapChain * DX_SwapChain; DX_SwapChain swapChain;
HRESULT result; result = swapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ),( LPVOID * ) & backBufferPtr );
typedef ID3D11Device * DX_Device; DX_Device device;
result = device->CreateRenderTargetView( backBufferPtr, NULL, & rtv );
backBufferPtr->Release(); backBufferPtr = 0;
To wszystkie miejsca, w których jest modyfikowany backBufferPtr. A dlaczego nie daję innych wskaźników? Bo jak na razie debugger zgłasza "coś" w linijce, w której jedyna (dziwna) zmienna to backBufferPtr. A dalej nie przejdę, bo debugger uparcie twierdzi, że coś tu jest nie tak. Dodam(nie wiem, czy to ważne), że kiedy odpalam aplikację skompilowaną w trybie Debug, to wywala mi okienko o treści i tytule mniej więcej takim: http://postimg.org/image/fw29u7gz5/Gdybym miał dać więcej kodu, proszę pisać. |
|
NopeDotAvi |
» 2015-03-27 23:26:45 Błąd 0xC0000005: Access violation reading location 0x00000000 oznacza, że gdzieś tam masz niezainicjowany odpowiednio wskaźnik.
abort wyrzuca, bo gdzieś jest niezłapany wyjątek. |
|
TheReclif Temat założony przez niniejszego użytkownika |
» 2015-03-27 23:56:37 W sumie... To co piszesz, szczególnie na temat nie złapanych wyjątków (bo tych jest wiele, aby użytkownik API wiedział, z czym się mierzy), rzuca nowe światło na projektowanie programów opierających się na moim API(a raczej API do API, bo API do WinAPI i DirectX-a). Spróbuję każdy niezainicjalizowany wskaźnik jaki znajdę zainicjalizować i oczywiście skasować. Dodatkowo wezmę coś do reakcji na konkretne błędy. Tematu jeszcze nie zamykam, bo będę dopiero próbować rozwiązać ten problem. |
|
TheReclif Temat założony przez niniejszego użytkownika |
» 2015-03-28 00:19:43 OK. Złapałem pierwszy błąd w programie. Teraz myślę, że jakoś to będzie. Tematu prewencyjnie nie zamykam. |
|
TheReclif Temat założony przez niniejszego użytkownika |
» 2015-03-28 16:31:47 Prawie wszystkie błędy wyłapane i naprawione. A co do istoty problemu, to stanowił ją brak należytej obsługi wyjątków rzucanych przez samo API. Na szczęście jest tylko jeden błąd, który muszę jeszcze naprawić. Tematu jednak jeszcze nie zamykam. |
|
« 1 » 2 |