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

 
 
> Наверное я плохо знаю С, Очень непонятная структура
kumle
сообщение Jun 29 2012, 06:13
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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)cool.gif ???

Сообщение отредактировал kumle - Jun 29 2012, 06:15
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
RabidRabbit
сообщение Jun 29 2012, 06:18
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Наверное sm.gif dnt - указатель на функцию без возвращаемого значения, принимающую один входной аргумент типа unsigned char, соответственно _slt[b].dnt((unsigned char) B ) - вызов функции.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 29 2012, 06:21
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
kumle
сообщение Jun 29 2012, 06:29
Сообщение #4


Частый гость
**

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



А я понял теперь, это типа защиты такой от вызова несуществующей функции.
Значит где то в коде надо искать саму функцию dnt, но ее может и не быть, раз такой вызов.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jun 29 2012, 06:32
Сообщение #5


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



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

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

Сообщение отредактировал Genadi Zawidowski - Jun 29 2012, 06:33
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 8 2012, 09:39
Сообщение #6


.
******

Группа: Участник
Сообщений: 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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 8 2012, 09:47
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Данная строка как бы призвана подавить другой ворнинг - о том, что переменная не используется. Ровным счетом ничего более не обозначает, должна быть выброшена оптимизатором.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 8 2012, 09:53
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

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

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

Сообщение отредактировал GetSmart - Aug 8 2012, 09:59


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
bus16
сообщение Aug 8 2012, 10:20
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 10-01-07
Пользователь №: 24 270



На первое - да ничего не будет, чёрной магии там нет. Хотя иногда IAR ругался на якобы неиспользуемые переменные, хотя они явно использовались в теле функции.
На второе - функция должна возвращать результат. Под это дело была создана переменная, но это функция инициализации и никакого результата она вернуть не может - только статус выполнения. Вероятно поэтому переменную всё-же оставил (захомячил) а варнинг о неиспользовании замаскировал другим, а его вероятно отключил в IAR-е.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 8 2012, 10:22
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(GetSmart @ Aug 8 2012, 13:53) *
А что будет, если я везде, где эти варнинги и переменная "результ", я всё руками вырежу вместе с объявлением переменной?

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

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

Просто шаблон. (void)result позволяет использовать или не использовать result без генерации предупреждения во втором случае.
Другое дело, что предупреждения у всех компиляторов разные. IAR в данном случае на воду дует.
Go to the top of the page
 
+Quote Post

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

 


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


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