Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ошибки С2146 и С4430

54K
22 января 2011 года
Inacondition
43 / / 17.01.2011
Не компилируется в msvs 2005,

указывает на строку 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

Помогите, пожалуйста. Хочется хоть что-то попробовать с графикой а я только и мучаюсь с этими ошибками...
278
22 января 2011 года
Alexander92
1.1K / / 04.08.2008
Вообще, похоже на ошибку, как когда на 64-разрядный процессор ставится 32-разрядная система (или наоборот). Попробуйте перед включением заголовочных файлов вручную прописать
 
Код:
#ifndef POINTER_64
#define POINTER_64 __ptr64
#endif
10
22 января 2011 года
Freeman
3.2K / / 06.03.2004
Похоже, включение виндовых заголовочников надо заключить в extern "C" { }. Файл main.cpp подразумевает приложение C++, о чём недвусмысленно намекает компилятор.
278
22 января 2011 года
Alexander92
1.1K / / 04.08.2008
Freeman, честно говоря, сколько пишу Win32-приложения на C++, никогда такой проблемы не было. И потом, мне кажется, там бы посыпалось ошибок гораздо больше, если бы дело было в этом.
54K
22 января 2011 года
Inacondition
43 / / 17.01.2011
Цитата: Alexander92
Вообще, похоже на ошибку, как когда на 64-разрядный процессор ставится 32-разрядная система (или наоборот).



Спасибо, помогло, этих ошибок нет. Появилась моя любимая:

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-разрядном процессоре?

И еще я не совсем понимаю как код

 
Код:
#ifndef POINTER_64
#define POINTER_64 __ptr64
#endif


перед включением заголовочных файлов решает проблему, если в winnt.h:

typedef void * POINTER_64 PVOID64;

где используется этот указатель и почему void * POINTER_64 не подходит а __ptr64 подходит?

Мне, как начинающему, о чень хорошо было бы правильно в этом разобраться. Очень буду благодарен за разъяснение...

Если у вас мало времени или я сильно глупые вопросы задаю то помогите, пожалуйста, с 2019 просто.
278
22 января 2011 года
Alexander92
1.1K / / 04.08.2008
В winnt.h прописано:
 
Код:
typedef void * POINTER_64 PVOID64;

Эта строка определяет новый тип PVOID64. При этом подразумевается, что тип POINTER_64 уже определен (в BaseTsd.h):
Код:
#if !defined(_MAC) && (defined(_M_MRX000) || defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_VER >= 1100) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#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:

 
Код:
#pragma comment(lib, "D3D9.lib")


Чтобы у вас впредь не возникало подобных проблем - общее решение следующее: находите описание той функции, которая вызвала ошибку (в вашем случае - Direct3DCreate9()) в MSDN'е (для вашего случая - http://msdn.microsoft.com/en-us/library/bb219685(v=vs.85).aspx). После этого смотрите, в самом низу есть секция "Header" и может быть секция "Library". Если секция "Library" есть - то подключаете к своей программе тот .lib-файл, который там указан:
 
Код:
#pragma comment(lib, "library_name")


Удачи!
54K
23 января 2011 года
Inacondition
43 / / 17.01.2011
Спасибо большое за все обязательно прочитаю все, что вы рекомендуете, но к сожалению приходится продолжить тему...

После всех исправлений компиляция прошла без ошибок но на этапе выполнения произошел сбой:

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-объектом?
278
23 января 2011 года
Alexander92
1.1K / / 04.08.2008
К сожалению, такую ошибку удаленно диагностировать достаточно сложно. Могу сказать лишь одно: проблема вот здесь:
Цитата:

GameMain() Line 187 + 0x17 bytes C++


Ну и, наконец, компилятор достаточно внятно сам пишет вам диагностику:

Цитата:

expression cannot be evaluated


Посмотрите внимательно на свою 187-ю строку и подумайте, что такого жуткого вы в ней написали. :) Думаю, что вы где-то неправильно использовали указатель. Наконец, попробуйте режим отладки.

P.S. Начинать изучение C / C++ с написания игры под DirectX - плохая идея. Скорее всего, 99% кода в этом случае будет не вашего, а содранного откуда-то, пользы от такого программирования - ноль. Если хотите действительно глубоко разобраться - возьмите того же Кернигана и Ритчи и просто сделайте все упражнения оттуда.

54K
23 января 2011 года
Inacondition
43 / / 17.01.2011
Я все понимаю, уже взялся за эту книгу, буду делать все упражнения оттуда... только вот ужасно хочется хотябы запустить нормально эту программу.

Вы правы, код не мой.. было много ошибок и на самом окне, без кода directX, но с теми ошибками было проще справиться самому, там я разобрался.

а вот 187-а строка:

dev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255),1.0f,0);

dev имеет значение 0x00000000 - это нормально?
278
23 января 2011 года
Alexander92
1.1K / / 04.08.2008
Может быть, dev указывает на какую-то несуществующую / непроинициализированную область памяти, может быть, еще что-то. Разберитесь сначала в том коде, с которым вы работаете, может, сами на свой вопрос и ответите.
54K
23 января 2011 года
Inacondition
43 / / 17.01.2011
У меня объявлены глобальные переменные:

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);


Я могу подставить код функций вместо их самих или в каждую из функций добавить аргумент, но разве это выход? А если код станет объемным или прийдется очень много аргументов в итоге передавать?

Может у меня еще один пробел в знаниях касательно глобальных переменных или указателей или просто области видимости?..
278
23 января 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: Inacondition

Я могу подставить код функций вместо их самих или в каждую из функций добавить аргумент, но разве это выход?


Конечно, это не выход. Я, к сожалению, не работал глубоко с DirectX, но мне кажется, что ваша проблема не в нем. Выложите код целиком, посмотрим. И я еще раз настоятельно рекомендую вам отложить эту задачу до полного освоения средств языка.

54K
23 января 2011 года
Inacondition
43 / / 17.01.2011
Спасибо, отложу обязательно, вот домучаю до рабочего состояния и отложу...

выкладываю код еще раз..
278
24 января 2011 года
Alexander92
1.1K / / 04.08.2008
Собственно, что и требовалось доказать. :) Ситуация достаточно прозрачная: как я вам и говорил, у вас запорчен указатель. CreateDevice() возвращает ошибку, вследствие чего dev оказывается непроинициализированным, и последующее обращение к нему вызывает ошибку. Включите в ваш код следующие строки, и вы сами во всем убедитесь:
Код:
HRESULT d3dRes = d3d->CreateDevice(D3DADAPTER_DEFAULT,
                                  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.
54K
24 января 2011 года
Inacondition
43 / / 17.01.2011
Урааа! Получилось! С английским туговато, я только приблизительно понял, в чем может быть проблема, но благодаря этому получилось найти ее решение:

в 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
7
24 января 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Inacondition
D3DDEVTYPE_HAL - Hardware rasterization. Shading is done with software, hardware, or mixed transform and lighting

Аппаратная растеризация.Затенение осуществляется программным,аппаратным или смешанным преобразованием и освещением

Цитата: Inacondition
D3DDEVTYPE_REF - Direct3D features are implemented in software; however, the reference rasterizer does make use of special CPU instructions whenever it can

Возможности Direct3D реализуются программой.Тем не менее,описанный растеризатор будет использовать специальные инструкции процессора всегда,когда есть возможность

54K
26 января 2011 года
Inacondition
43 / / 17.01.2011
Спасибо, только мне понятней не стало, отчего программа не работала с D3DDEVTYPE_REF
278
26 января 2011 года
Alexander92
1.1K / / 04.08.2008
Видимо, потому, что этот параметр требовал от вас от от программиста реализации возможностей Direct3D. Вы же этого не делали, автоматически полагаясь на аппаратную реализацию. Подробнее не скажу, за подробностями обратитесь, опять же, к специалистам в области DirectX.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог