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

Код

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[b].dnt((unsigned char)cool.gif ???
RabidRabbit
Наверное sm.gif dnt - указатель на функцию без возвращаемого значения, принимающую один входной аргумент типа unsigned char, соответственно _slt[b].dnt((unsigned char) B ) - вызов функции.
Сергей Борщ
dnt - указатель на функцию, принимающую параметр unsigned char и возвращающую void: void func(unsigned char)

Приведение параметра B к типу unsigned char - лишнее, он и так уже такого типа.
Возможно этот код станет понятнее, если его немного переписать:
CODE
void f (unsigned char B)
{
    slt const * pslt = _slt[b];
    if(pslt->dnt)
        pslt->dnt(B);
}

Тут видно, что если указатель на функцию не равен нулю, то вызывается функция, на которую он указывает.
kumle
А я понял теперь, это типа защиты такой от вызова несуществующей функции.
Значит где то в коде надо искать саму функцию dnt, но ее может и не быть, раз такой вызов.
Genadi Zawidowski
Надо искать присвоение полю структуры или инициализацию структуры при описании.
Функция может называться как угодно.

Выглядеть может так:
_slt [здесь какой-то индекс].dnt = имя функции;
GetSmart
Чтоб не создавать почти пустую тему, задам вопрос здесь.

Объясните пожалуйста кусок из 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" ?
aaarrr
Цитата(GetSmart @ Aug 8 2012, 13:39) *
Что здесь обозначает последняя строка, на которую к тому же ИАР варнингует "Warning[Pe549]: variable "result" is used before its value is set" ?

Данная строка как бы призвана подавить другой ворнинг - о том, что переменная не используется. Ровным счетом ничего более не обозначает, должна быть выброшена оптимизатором.
GetSmart
Цитата(aaarrr @ Aug 8 2012, 14:47) *
Данная строка как бы призвана подавить другой ворнинг - о том, что переменная не используется. Ровным счетом ничего более не обозначает, должна быть выброшена оптимизатором.

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

И в догонку - зачем автор это поставил? В смысле переменную, которая не юзается. Даже (void)result вместо комментирования переменной, раз она не юзается. Такое ощущение, что автор хотел схитрить, но ИАР ему не дал sm.gif Вместо одного варнинга получился другой.
bus16
На первое - да ничего не будет, чёрной магии там нет. Хотя иногда IAR ругался на якобы неиспользуемые переменные, хотя они явно использовались в теле функции.
На второе - функция должна возвращать результат. Под это дело была создана переменная, но это функция инициализации и никакого результата она вернуть не может - только статус выполнения. Вероятно поэтому переменную всё-же оставил (захомячил) а варнинг о неиспользовании замаскировал другим, а его вероятно отключил в IAR-е.
aaarrr
Цитата(GetSmart @ Aug 8 2012, 13:53) *
А что будет, если я везде, где эти варнинги и переменная "результ", я всё руками вырежу вместе с объявлением переменной?

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

Цитата(GetSmart @ Aug 8 2012, 13:53) *
И в догонку - зачем автор это поставил? В смысле переменную, которая не юзается. Даже (void)result вместо комментирования переменной, раз она не юзается. Такое ощущение, что автор хотел схитрить, но ИАР ему не дал sm.gif Вместо одного варнинга получился другой.

Просто шаблон. (void)result позволяет использовать или не использовать result без генерации предупреждения во втором случае.
Другое дело, что предупреждения у всех компиляторов разные. IAR в данном случае на воду дует.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.