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

0xC0000005: Access violation reading location 0x00000000

Ostatnio zmodyfikowano 2015-03-28 16:40
Autor Wiadomość
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?:
C/C++
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.
P-129119
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.
P-129120
NopeDotAvi
» 2015-03-24 22:29:19
masz wszystkie wskaźniki odpowiednio zainicjowane?
P-129121
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:
C/C++
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):
C/C++
typedef IDXGISwapChain * DX_SwapChain;
DX_SwapChain swapChain;
//Tu zmienna swapChain jest modyfikowana...
//...
HRESULT result;
result = swapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ),( LPVOID * ) & backBufferPtr );
C/C++
typedef ID3D11Device * DX_Device;
DX_Device device;
//Tu zmienna device jest modyfikowana...
//...
result = device->CreateRenderTargetView( backBufferPtr, NULL, & rtv );
C/C++
//Delete pointer to the back buffer
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ć.
P-129291
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.
P-129292
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.
P-129293
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.
P-129295
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.
P-129327
« 1 » 2
  Strona 1 z 2 Następna strona