реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> передать тип структура в ф-ю
Метценгерштейн
сообщение Feb 5 2015, 08:00
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



не сообразить никак.

есть структура
Код
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, ... );

прототип ее.

как это делается?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 5 2015, 08:03
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Метценгерштейн @ 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), после чего эти имена отождествляются с целыми числами. Соответственно этому, функция получает через параметр число.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 5 2015, 08:06
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



да, точно, енум.
ADC_CMD_SET_PIN
как мне сказать этой ф-ии, что пин такой-то?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 5 2015, 08:11
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Этот енум практически эквивалентен определению:

Код
#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.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Feb 5 2015, 08:15
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



это понятно. корректно ли так передавать номер каналав ф-ю?
Код
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;
        }
...
...
...
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 5 2015, 08:19
Сообщение #6


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Метценгерштейн @ Feb 5 2015, 11:15) *
это понятно. корректно ли так передавать номер каналав ф-ю?


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

P.S. va_list и va_start уберите! Не нужно ничего этого.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 00:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016