ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
27 апреля
128455 Топик полностью
skmr (22.08.2008 01:32, просмотров: 109) ответил rezident на Попробую привести пример. Это пример только для данных. Без передачи указателя на функцию в качестве параметра другой функции.
Ничего не понял. В чем проблема? И какая разница какого типа будет поле 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)