Показать сообщение отдельно
Старый 22.11.2006, 22:49   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2480 (88) +++++++++
Регистрация: 20.08.2005
Прототип функции на C выглядит так
X++:
WINGDIAPI void APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
, где GLclampf определен как typedef float GLclampf;
Тип double опредлен как восьмибайтовый, а float как четырехбайтовый.
Что бы сделать правильный вызов этой функции надо параметры передавать как DWord. При этом необходимо переводить вещественное число Axapta в четырехбайтовый тип float (single precision) (т.е. в int). Если интересно, как это делается надо искать здесь IEEE Standard 754 Floating Point Numbers.
А в Axapta можно выкрутиться так
X++:
DLLFunction glClearColor      = new DLLFunction(opengl32, "glClearColor");
COMVariant parm1 = new COMVariant();
COMVariant parm2 = new COMVariant();
COMVariant parm3 = new COMVariant();
COMVariant parm4 = new COMVariant();
;
glClearColor.returns(ExtTypes::void);
glClearColor.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord);
parm1.float(1.0);
parm2.float(0.0);
parm3.float(0.0);
parm4.float(1.0);
glClearColor.call(parm1.int(), parm2.int(), parm3.int(), parm4.int());
Обратите внимание, что для установки значения параметров необходимо вызывать именно метод float(). Если воспользоваться, например, double(), то возвращаемое значение будет неправильным
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: belugin (9), Dark Light (2).