|
Наверное я плохо знаю С, Очень непонятная структура |
|
|
|
Jun 29 2012, 06:13
|

Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 15-12-09
Из: Москва
Пользователь №: 54 280

|
Есть такая структура: Код 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)  ???
Сообщение отредактировал kumle - Jun 29 2012, 06:15
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Jun 29 2012, 06:21
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
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); } Тут видно, что если указатель на функцию не равен нулю, то вызывается функция, на которую он указывает.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 8 2012, 09:39
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Чтоб не создавать почти пустую тему, задам вопрос здесь. Объясните пожалуйста кусок из 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 - Aug 8 2012, 09:41
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 8 2012, 09:53
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(aaarrr @ Aug 8 2012, 14:47)  Данная строка как бы призвана подавить другой ворнинг - о том, что переменная не используется. Ровным счетом ничего более не обозначает, должна быть выброшена оптимизатором. А что будет, если я везде, где эти варнинги и переменная "результ", я всё руками вырежу вместе с объявлением переменной? И в догонку - зачем автор это поставил? В смысле переменную, которая не юзается. Даже (void)result вместо комментирования переменной, раз она не юзается. Такое ощущение, что автор хотел схитрить, но ИАР ему не дал  Вместо одного варнинга получился другой.
Сообщение отредактировал GetSmart - Aug 8 2012, 09:59
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 8 2012, 10:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

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