Вещественные числа.
От: flexcreator  
Дата: 05.12.05 08:43
Оценка:
ХЕЛП!!!

Допустим у меня есть функция

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


Вопрос:ПОЧЕМУ???
Re: Вещественные числа.
От: andrij Украина  
Дата: 05.12.05 09:08
Оценка:
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
make it simple as possible, but not simpler
Re: Вещественные числа.
От: jedi Мухосранск  
Дата: 05.12.05 09:32
Оценка:
Здравствуйте, flexcreator, Вы писали:

F>Допустим у меня есть функция


Может лучше использовать стандартные средства: va_starts/va_arg/va_end ?
Там уже все учтено, да и с перенолсимостью проблем не будет.
Re: Вещественные числа.
От: achp  
Дата: 05.12.05 09:35
Оценка: 3 (2) +2
Здравствуйте, flexcreator, Вы писали:

F>Вопрос:ПОЧЕМУ???


При передаче фактических параметров, соответствующих многоточию в сигнатуре вызываемой функции производится так называемое продвижение типа. Целочисленные типы младше [unsigned] int (а именно: char, signed char, unsigned char, signed short и unsigned short) продвигаются к типу [unsigned] int. Тип float продвигается к double.
Re[2]: Вещественные числа.
От: Аноним  
Дата: 06.12.05 10:37
Оценка:
Здравствуйте, 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.

Естетстна, вручную смещение я считать не собирался
Re[2]: Вещественные числа.
От: Аноним  
Дата: 06.12.05 10:41
Оценка:
Здравствуйте, achp, Вы писали:

A>Здравствуйте, flexcreator, Вы писали:


F>>Вопрос:ПОЧЕМУ???


A>При передаче фактических параметров, соответствующих многоточию в сигнатуре вызываемой функции производится так называемое продвижение типа. Целочисленные типы младше [unsigned] int (а именно: char, signed char, unsigned char, signed short и unsigned short) продвигаются к типу [unsigned] int. Тип float продвигается к double.


Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.