ХЕЛП!!!
Допустим у меня есть функция
void routine( ROUTINE_ID in_routine_id, ...)
{
BEGIN_ARG_SELECTION();
ARG( int, some_int );
ARG( float, some_float );
ARG( char, some_char );
cout<<"some_int: "<<some_int<< " some_float: "<<some_float<<" some_char:"<<some_char<<endl;
//Отсылаем полученные параметры некоторой функции...
some_func( some_int, some_float, some_char );
END_ARG_SELECTION();
}
Проблема возникает, когда я передаю ей float
(т.е. второй параметр)
//...
routine( SOME_ID, 999, 555.0f, 251 )
//...
..int выводится нормально, а вместо float и char — какая-то белиберда.
Но, если преобразовывать float в DWORD и обратно, то все работает:
inline float to_float( DWORD in_dword )
{return (*(float*)&in_dword);}
inline DWORD to_dword( float in_float )
{return (*(DWORD*)&in_float);}
//....
void routine( ROUTINE_ID in_routine_id, ...)
{
BEGIN_ARG_SELECTION();
ARG( int, some_int );
ARG( DWORD, some_float );
ARG( char, some_char );
cout<<"some_int: "<<some_int<< " some_float: "<<some_float<<to_float( some_float )<<" some_char:"<<some_char<<endl;
//Отсылаем полученные параметры некоторой функции...
some_func( some_int, to_float( some_float ), some_char );
END_ARG_SELECTION();
}
//....
routine( SOME_ID, 999, to_dword( 555.0f ), 251 );
Вопрос:ПОЧЕМУ???
On Mon, 05 Dec 2005 10:43:44 +0200, flexcreator <48752@users.rsdn.ru> wrote:
> ХЕЛП!!!
> .....
> Вопрос:ПОЧЕМУ???
при проталкивании в стек char проходит как 4-ре байта, а потом ти выбераеш один — и все смещаетса,
точно не уверен, но возможно що с float тоже самое — обрабатывают как double, но я неуверен.
поставь експеремент — первым протолкни char — и посмотри все ли остальные обработаютса нормально.
Posted via RSDN NNTP Server 1.9
Здравствуйте, jedi, Вы писали:
J>Здравствуйте, flexcreator, Вы писали:
F>>Допустим у меня есть функция
J>Может лучше использовать стандартные средства: va_starts/va_arg/va_end ?
J>Там уже все учтено, да и с перенолсимостью проблем не будет.
Макросы BEGIN_ARG_SELECTION()
END_ARG_SELECTION()
и ARG(,) как раз используют
va_list, va_start, va_end, va_arg.
Естетстна, вручную смещение я считать не собирался
Здравствуйте, achp, Вы писали:
A>Здравствуйте, flexcreator, Вы писали:
F>>Вопрос:ПОЧЕМУ???
A>При передаче фактических параметров, соответствующих многоточию в сигнатуре вызываемой функции производится так называемое продвижение типа. Целочисленные типы младше [unsigned] int (а именно: char, signed char, unsigned char, signed short и unsigned short) продвигаются к типу [unsigned] int. Тип float продвигается к double.
Спасибо.