Ничего не понял. В чем проблема? И какая разница какого типа будет поле param? Имеем:
struct _st_IAPparam; /* неважно какие типы полей в структуре */
typedef _st_IAPparam st_IAPparam;
unsigned int f_IAP(unsigned int cmd, void *pntr)
{
unsigned int *single_param;
st_IAPparam *struct_param;
switch (cmd) {
case CMD_WITH_SINGLE_PARAM:
single_param = (unsigned int *) pntr;
if (*single_param < 22)
...
break;
case CMD_WITH_STRUCT_PARAM:
struct_param = (st_IAPparam *) pntr;
if (struct_param->param p[1] < 33)
...
break;
default : /* параметра нет */
...
break;
}
....
}
void mmfunc (void)
{
unsigned int uint_param = 12;
st_IAPparam struct_param;
...
if (! f_IAP(CMD_WITH_NO_PARAM, (void*) 0))
return 0;
...
if (! f_IAP(CMD_WITH_SINGLE_PARAM, &uint_param))
return 0;
...
if (! f_IAP(CMD_WITH_STRUCT_PARAM, &struct_param))
return 0;
...
}
Вроде все как Вы описали. Или хочется, чтобы во втором случае, pntr - использовался не как указатель на переменную, а сам параметр (котрорый функция принимает как void*) был бы этой переменной? Если так и Ваш параметр укладывается в 16 бит, просто преобразуйте указатель pntr, к 16-битному типу (как я понял у Вас sizeof (void*) всегда >= 16 и потери не произойдет).
Может вообще в Вашем примере использовать переменное число параметров?
unsigned int f_IAP(unsigned int cmd, ...)
И в зависимости от cmd "доставать" (макросы va_start, va_arg, va_end) необходимые параметры?
А вообще прислушайтесь к совету Сергея. Преобразование типов - источник ошибок (т.е. Вы фактически выключаете способность компилятора подсказать Вам, где ошибка).
Вы считаете что unsigned long - 4-ре байта, unsigned int - 2 байта? Чтобы не наступать на грабли при переносе программ, надо забыть это :-)
Насколько я помню, единственное, что можно сказать определенно:
sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)
-
- Ответ rezident(546 знак., 22.08.2008 02:18)