Перейти к содержанию
    

Наверное я плохо знаю С

Есть такая структура:

 

 
struct slt
{
  int count;
  void (*dnt) (unsigned char);
};

 

-----------------------------------------------------

 

Вот как она используется:

 

 
#define SIZE 10
struct slt _slt[SIZE];

void f (unsigned char B)
{
  if(_slt[b].dnt) _slt[b].dnt((unsigned char)B);
}

Непонятно что вообще такое dnt ? и что происходит когда выполняется строка _slt.dnt((unsigned char)B) ???

Изменено пользователем kumle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное :) dnt - указатель на функцию без возвращаемого значения, принимающую один входной аргумент типа unsigned char, соответственно _slt.dnt((unsigned char) B ) - вызов функции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

dnt - указатель на функцию, принимающую параметр unsigned char и возвращающую void: void func(unsigned char)

 

Приведение параметра B к типу unsigned char - лишнее, он и так уже такого типа.

Возможно этот код станет понятнее, если его немного переписать:

void f (unsigned char B)
{
    slt const * pslt = _slt[b];
    if(pslt->dnt)
        pslt->dnt(B);
}

Тут видно, что если указатель на функцию не равен нулю, то вызывается функция, на которую он указывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я понял теперь, это типа защиты такой от вызова несуществующей функции.

Значит где то в коде надо искать саму функцию dnt, но ее может и не быть, раз такой вызов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо искать присвоение полю структуры или инициализацию структуры при описании.

Функция может называться как угодно.

 

Выглядеть может так:

_slt [здесь какой-то индекс].dnt = имя функции;

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтоб не создавать почти пустую тему, задам вопрос здесь.

 

Объясните пожалуйста кусок из FatFS:

 

DSTATUS disk_initialize(BYTE drv /* Physical drive nmuber (0..) */
)
{
    DSTATUS stat;
    int result;

    (void) result;
...

 

Что здесь обозначает последняя строка, на которую к тому же ИАР варнингует "Warning[Pe549]: variable "result" is used before its value is set" ?

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что здесь обозначает последняя строка, на которую к тому же ИАР варнингует "Warning[Pe549]: variable "result" is used before its value is set" ?

Данная строка как бы призвана подавить другой ворнинг - о том, что переменная не используется. Ровным счетом ничего более не обозначает, должна быть выброшена оптимизатором.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Данная строка как бы призвана подавить другой ворнинг - о том, что переменная не используется. Ровным счетом ничего более не обозначает, должна быть выброшена оптимизатором.

А что будет, если я везде, где эти варнинги и переменная "результ", я всё руками вырежу вместе с объявлением переменной?

 

И в догонку - зачем автор это поставил? В смысле переменную, которая не юзается. Даже (void)result вместо комментирования переменной, раз она не юзается. Такое ощущение, что автор хотел схитрить, но ИАР ему не дал :) Вместо одного варнинга получился другой.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На первое - да ничего не будет, чёрной магии там нет. Хотя иногда IAR ругался на якобы неиспользуемые переменные, хотя они явно использовались в теле функции.

На второе - функция должна возвращать результат. Под это дело была создана переменная, но это функция инициализации и никакого результата она вернуть не может - только статус выполнения. Вероятно поэтому переменную всё-же оставил (захомячил) а варнинг о неиспользовании замаскировал другим, а его вероятно отключил в IAR-е.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что будет, если я везде, где эти варнинги и переменная "результ", я всё руками вырежу вместе с объявлением переменной?

Ничего плохого не будет.

 

И в догонку - зачем автор это поставил? В смысле переменную, которая не юзается. Даже (void)result вместо комментирования переменной, раз она не юзается. Такое ощущение, что автор хотел схитрить, но ИАР ему не дал :) Вместо одного варнинга получился другой.

Просто шаблон. (void)result позволяет использовать или не использовать result без генерации предупреждения во втором случае.

Другое дело, что предупреждения у всех компиляторов разные. IAR в данном случае на воду дует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...