kumle 0 29 июня, 2012 Опубликовано 29 июня, 2012 (изменено) · Жалоба Есть такая структура: 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) ??? Изменено 29 июня, 2012 пользователем kumle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RabidRabbit 0 29 июня, 2012 Опубликовано 29 июня, 2012 · Жалоба Наверное :) dnt - указатель на функцию без возвращаемого значения, принимающую один входной аргумент типа unsigned char, соответственно _slt.dnt((unsigned char) B ) - вызов функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 29 июня, 2012 Опубликовано 29 июня, 2012 · Жалоба 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); } Тут видно, что если указатель на функцию не равен нулю, то вызывается функция, на которую он указывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kumle 0 29 июня, 2012 Опубликовано 29 июня, 2012 · Жалоба А я понял теперь, это типа защиты такой от вызова несуществующей функции. Значит где то в коде надо искать саму функцию dnt, но ее может и не быть, раз такой вызов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 29 июня, 2012 Опубликовано 29 июня, 2012 (изменено) · Жалоба Надо искать присвоение полю структуры или инициализацию структуры при описании. Функция может называться как угодно. Выглядеть может так: _slt [здесь какой-то индекс].dnt = имя функции; Изменено 29 июня, 2012 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 8 августа, 2012 Опубликовано 8 августа, 2012 (изменено) · Жалоба Чтоб не создавать почти пустую тему, задам вопрос здесь. Объясните пожалуйста кусок из 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" ? Изменено 8 августа, 2012 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба Что здесь обозначает последняя строка, на которую к тому же ИАР варнингует "Warning[Pe549]: variable "result" is used before its value is set" ? Данная строка как бы призвана подавить другой ворнинг - о том, что переменная не используется. Ровным счетом ничего более не обозначает, должна быть выброшена оптимизатором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 8 августа, 2012 Опубликовано 8 августа, 2012 (изменено) · Жалоба Данная строка как бы призвана подавить другой ворнинг - о том, что переменная не используется. Ровным счетом ничего более не обозначает, должна быть выброшена оптимизатором. А что будет, если я везде, где эти варнинги и переменная "результ", я всё руками вырежу вместе с объявлением переменной? И в догонку - зачем автор это поставил? В смысле переменную, которая не юзается. Даже (void)result вместо комментирования переменной, раз она не юзается. Такое ощущение, что автор хотел схитрить, но ИАР ему не дал :) Вместо одного варнинга получился другой. Изменено 8 августа, 2012 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bus16 0 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба На первое - да ничего не будет, чёрной магии там нет. Хотя иногда IAR ругался на якобы неиспользуемые переменные, хотя они явно использовались в теле функции. На второе - функция должна возвращать результат. Под это дело была создана переменная, но это функция инициализации и никакого результата она вернуть не может - только статус выполнения. Вероятно поэтому переменную всё-же оставил (захомячил) а варнинг о неиспользовании замаскировал другим, а его вероятно отключил в IAR-е. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 8 августа, 2012 Опубликовано 8 августа, 2012 · Жалоба А что будет, если я везде, где эти варнинги и переменная "результ", я всё руками вырежу вместе с объявлением переменной? Ничего плохого не будет. И в догонку - зачем автор это поставил? В смысле переменную, которая не юзается. Даже (void)result вместо комментирования переменной, раз она не юзается. Такое ощущение, что автор хотел схитрить, но ИАР ему не дал :) Вместо одного варнинга получился другой. Просто шаблон. (void)result позволяет использовать или не использовать result без генерации предупреждения во втором случае. Другое дело, что предупреждения у всех компиляторов разные. IAR в данном случае на воду дует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться