Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: передать тип структура в ф-ю
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Метценгерштейн
не сообразить никак.

есть структура
Код
typedef enum {
  ADC_CMD_GET_VALUE,
  ADC_CMD_SET_PIN,
  ADC_CMD_SET_CHANNEL,
  ADC_CMD_SET_CHANNEL_PRESCALLER,
  ADC_CMD_SET_CHANNEL_REFERENCE,
  ADC_CMD_SET_CALLBACK,
  ADC_CMD_UPDATE,
  ADC_CMD_HANDLE,
} adc_cmd_t;


некая ф-я хочет получить несколько параметров этой структуры, можно по очереди. Например, номер пина.
Код
err_hw_t adc_cmd( adc_cmd_t cmd, ... );

прототип ее.

как это делается?
Xenia
Цитата(Метценгерштейн @ Feb 5 2015, 11:00) *
есть структура...


Это не структура, а ЕНУМ! sm.gif

Делается так:
err_hw_t adc_cmd( ADC_CMD_SET_CHANNEL_PRESCALLER, ... );

Т.е. весь список, начиная с ADC_CMD_GET_VALUE и кончая ADC_CMD_HANDLE, нумеруется компилятором по-порядку (обычно начиная с 0), после чего эти имена отождествляются с целыми числами. Соответственно этому, функция получает через параметр число.
Метценгерштейн
да, точно, енум.
ADC_CMD_SET_PIN
как мне сказать этой ф-ии, что пин такой-то?
Xenia
Этот енум практически эквивалентен определению:

Код
#define  ADC_CMD_GET_VALUE      0
#define  ADC_CMD_SET_PIN          1
#define  ADC_CMD_SET_CHANNEL       2
#define  ADC_CMD_SET_CHANNEL_PRESCALLER  3
#define  ADC_CMD_SET_CHANNEL_REFERENCE    4
#define  ADC_CMD_SET_CALLBACK     5
#define  ADC_CMD_UPDATE         6
#define  ADC_CMD_HANDLE    7

Т.е. позволяет заменять число на мнемонику. И более ничего. Подставляешь тупо вместо числа - вот и вся недолга sm.gif.
Метценгерштейн
это понятно. корректно ли так передавать номер каналав ф-ю?
Код
adc_cmd (ADC_CMD_SET_CHANNEL,0);

ругани нет

сама ф-я
Код
err_hw_t adc_cmd( adc_cmd_t cmd, ... )
{
  va_list args;
  err_hw_t retval = HW_SUCCESS;
  if(adc_init_en == 0) return HW_ERROR;
  va_start(args,cmd);
  switch(cmd)
  {
    case ADC_CMD_GET_VALUE:
      {
        retval = HW_ERROR_CMD;
      }
      break;
    case ADC_CMD_SET_CALLBACK:
      {    
        callback = va_arg( args, adc_callback_t );
      }
      break;
    case ADC_CMD_SET_PIN:
      {
        unsigned int pin       = va_arg( args, unsigned int );
        unsigned int en        = va_arg( args, unsigned int );
        if( pin > 31 )
        {
          retval = HW_ERROR_CMD;
        }
...
...
...
Xenia
Цитата(Метценгерштейн @ Feb 5 2015, 11:15) *
это понятно. корректно ли так передавать номер каналав ф-ю?


Это это значение только для switch/case используется, то всё нормально. Собственно для того енумы и сделаны.
Арифметику только нельзя делать с енумами, хотя иногда и это проходит.

P.S. va_list и va_start уберите! Не нужно ничего этого.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.