ошибки С2146 и С4430
указывает на строку 222 в winnt.h:
typedef void * POINTER_64 PVOID64;
d:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'
d:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(222) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(5940) : error C2146: syntax error : missing ';' before identifier 'Buffer'
d:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\program files\microsoft visual studio 8\vc\platformsdk\include\winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Помогите, пожалуйста. Хочется хоть что-то попробовать с графикой а я только и мучаюсь с этими ошибками...
#define POINTER_64 __ptr64
#endif
Спасибо, помогло, этих ошибок нет. Появилась моя любимая:
main.obj : error LNK2019: unresolved external symbol _Direct3DCreate9@4 referenced in function "int __cdecl GameInit(void)" (?GameInit@@YAHXZ)
D:\Projects\dx9test1.0\Debug\dx9test1.0.exe : fatal error LNK1120: 1 unresolved externals
С ней я тоже давно мучаюсь (как хорошо, что хоть какой-то инет, но появился и есть добрые люди, которые помогают).
С OpenGL эту проблему вы мне помогли решить так:
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "opengl32.lib')
думаю, что вы помните...
Вот беда, разобраться бы как правильно пользоваться этими директивами...
И почему у меня возникла первая ошибка если у меня стоит 32-разрядная система на 32-разрядном процессоре?
И еще я не совсем понимаю как код
#define POINTER_64 __ptr64
#endif
перед включением заголовочных файлов решает проблему, если в winnt.h:
typedef void * POINTER_64 PVOID64;
где используется этот указатель и почему void * POINTER_64 не подходит а __ptr64 подходит?
Мне, как начинающему, о чень хорошо было бы правильно в этом разобраться. Очень буду благодарен за разъяснение...
Если у вас мало времени или я сильно глупые вопросы задаю то помогите, пожалуйста, с 2019 просто.
Эта строка определяет новый тип PVOID64. При этом подразумевается, что тип POINTER_64 уже определен (в BaseTsd.h):
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#if defined(_WIN64)
#define POINTER_32 __ptr32
#else
#define POINTER_32
#endif
#else
#if defined(_MAC) && defined(_MAC_INT_64)
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#else
#if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
#else
#define POINTER_64
#endif
Вы видите, что этот тип определяется внутри условий препроцессора. При этом по каким-то причинам (скорее всего - из-за каких особенностей вашего процессора и вашей системы) он оказался не определенным. Именно поэтому "ручное" доопределение этого типа и решило вашу проблему.
По поводу
хорошо было бы правильно в этом разобраться
- почитайте, например, книгу Кернигана и Ритчи, "Язык программирования C". По поводу препроцессора - вот:
http://msdn.microsoft.com/en-us/library/3sxhs2ty(v=vs.80).aspx;
http://msdn.microsoft.com/en-us/library/wy090hkc(v=vs.80).aspx;
http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx;
http://msdn.microsoft.com/en-us/library/d9x1s805(v=vs.80).aspx.
Вряд ли эти ссылки нужно изучать целиком и знать наизусть, но по ним вы сможете найти абсолютно любую информацию по этому поводу, которая вас заинтересует.
Наконец, по поводу вашей ошибки, решение сходное с OpenGL:
Чтобы у вас впредь не возникало подобных проблем - общее решение следующее: находите описание той функции, которая вызвала ошибку (в вашем случае - Direct3DCreate9()) в MSDN'е (для вашего случая - http://msdn.microsoft.com/en-us/library/bb219685(v=vs.85).aspx). После этого смотрите, в самом низу есть секция "Header" и может быть секция "Library". Если секция "Library" есть - то подключаете к своей программе тот .lib-файл, который там указан:
Удачи!
После всех исправлений компиляция прошла без ошибок но на этапе выполнения произошел сбой:
Unhandled exception at 0x00411975 in dx9test1.0.exe: 0xC0000005: Access violation reading location 0x00000000.
При этом в окне "Autos": dev--IUnknown--__vfptr CXX0030:
Error: expression cannot be evaluated
в окне "Call Stack":
=>dx9test1.0.exe!GameMain() Line 187 + 0x17 bytes C++
dx9test1.0.exe!WinMain(HINSTANCE__ * hinstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdline=0x00151f0e, int nShowCmd=1) Line 107 C++
dx9test1.0.exe!__tmainCRTStartup() Line 578 + 0x35 bytes C
dx9test1.0.exe!WinMainCRTStartup() Line 403 C
kernel32.dll!7c817077()
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]
После принудительного завершения программы в окне "Output":
'dx9test1.0.exe': Loaded 'D:\Projects\dx9test1.0\debug\dx9test1.0.exe', Symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\user32.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\d3d9.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\d3d8thk.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\secur32.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\version.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\winmm.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcr80d.dll', Symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\imm32.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\Program Files\Kaspersky Lab\Kaspersky Internet Security 2010\mzvkbd.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\Program Files\Kaspersky Lab\Kaspersky Internet Security 2010\mzvkbd3.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\Program Files\Kaspersky Lab\Kaspersky Internet Security 2010\kloehk.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\uxtheme.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\MSCTF.dll', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\MSCTFIME.IME', No symbols loaded.
'dx9test1.0.exe': Loaded 'C:\WINDOWS\system32\ole32.dll', No symbols loaded.
First-chance exception at 0x00411975 in dx9test1.0.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x00411975 in dx9test1.0.exe: 0xC0000005: Access violation reading location 0x00000000.
The program '[1932] dx9test1.0.exe: Native' has exited with code 0 (0x0).
Это что, проблема с COM-объектом?
GameMain() Line 187 + 0x17 bytes C++
Ну и, наконец, компилятор достаточно внятно сам пишет вам диагностику:
expression cannot be evaluated
Посмотрите внимательно на свою 187-ю строку и подумайте, что такого жуткого вы в ней написали. :) Думаю, что вы где-то неправильно использовали указатель. Наконец, попробуйте режим отладки.
P.S. Начинать изучение C / C++ с написания игры под DirectX - плохая идея. Скорее всего, 99% кода в этом случае будет не вашего, а содранного откуда-то, пользы от такого программирования - ноль. Если хотите действительно глубоко разобраться - возьмите того же Кернигана и Ритчи и просто сделайте все упражнения оттуда.
Вы правы, код не мой.. было много ошибок и на самом окне, без кода directX, но с теми ошибками было проще справиться самому, там я разобрался.
а вот 187-а строка:
dev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255),1.0f,0);
dev имеет значение 0x00000000 - это нормально?
HINSTANCE hinstance_app;
HWND main_window_handle;
IDirect3D9* d3d = NULL;
IDirect3DDevice9* dev = NULL;
имеется 3 функции:
int GameInit()
int GameMain()
int GameShutdown()
в GameInit() dev успешно инициализируется, во время отладки вижу, что dev имеет корректное значение, но в GameMain() это значение меняется на NULL.
если я, конечно, правильно понял, что она так инициализируется:
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,main_window_handle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&pp, &dev);
Я могу подставить код функций вместо их самих или в каждую из функций добавить аргумент, но разве это выход? А если код станет объемным или прийдется очень много аргументов в итоге передавать?
Может у меня еще один пробел в знаниях касательно глобальных переменных или указателей или просто области видимости?..
Я могу подставить код функций вместо их самих или в каждую из функций добавить аргумент, но разве это выход?
Конечно, это не выход. Я, к сожалению, не работал глубоко с DirectX, но мне кажется, что ваша проблема не в нем. Выложите код целиком, посмотрим. И я еще раз настоятельно рекомендую вам отложить эту задачу до полного освоения средств языка.
выкладываю код еще раз..
D3DDEVTYPE_REF,
main_window_handle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&pp,
&dev);
switch(d3dRes) {
case D3D_OK:
MessageBox(NULL, L"OK", L"D3D", MB_OK);
break;
case D3DERR_DEVICELOST:
MessageBox(NULL, L"DEVICELOST", L"D3D", MB_OK);
break;
case D3DERR_INVALIDCALL:
MessageBox(NULL, L"INVALIDCALL", L"D3D", MB_OK);
break;
case D3DERR_NOTAVAILABLE:
MessageBox(NULL, L"NOTAVAILABLE", L"D3D", MB_OK);
break;
case D3DERR_OUTOFVIDEOMEMORY:
MessageBox(NULL, L"OUTOFVIDEOMEMORY", L"D3D", MB_OK);
break;
default:
MessageBox(NULL, L"Unknown error...", L"D3D", MB_OK);
}
Откуда берется ошибка - честно говоря, у меня сейчас просто нет времени ковыряться в DirectX. Почитайте вот здесь:
http://msdn.microsoft.com/en-us/library/bb174313(v=vs.85).aspx.
в d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,main_window_handle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&pp, &dev);
я D3DDEVTYPE_REF заменил на D3DDEVTYPE_HAL и заработало...
Вот только из за того же незнания английского языка я не совсем понял:
D3DDEVTYPE_HAL - Hardware rasterization. Shading is done with software, hardware, or mixed transform and lighting.
D3DDEVTYPE_REF - Direct3D features are implemented in software; however, the reference rasterizer does make use of special CPU instructions whenever it can.
Что, проблема опять из-за процессора?
Alexander92, большое спасибо за помощь и терпение, теперь сделаю как вы сказали, отложу и займусь чтением Кернигана и Ритчи:D
Аппаратная растеризация.Затенение осуществляется программным,аппаратным или смешанным преобразованием и освещением
Возможности Direct3D реализуются программой.Тем не менее,описанный растеризатор будет использовать специальные инструкции процессора всегда,когда есть возможность