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

 
 
 
Reply to this topicStart new topic
> помогите с контрукциями С, непонятно
Dubov
сообщение Jul 11 2012, 15:26
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Волей судьбы пришлось разбираться с чужим кодом.
Никак не пойму что означает такая конструкция:
CODE
typedef void ( * DSP_Proc ) ( win_inst * win, mod_msg * pMsg );


а потом вижу такое
CODE
DSP_Proc Сom_fProc[CMD_NUMBER];

где элементы массива - имена, ранее объявленых функций.

Зачем так сильно всё усложнать? где такие выкрутасы оправданы и полезны?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 11 2012, 15:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dubov @ Jul 11 2012, 18:26) *
Никак не пойму что означает такая конструкция:
Код
typedef void ( * DSP_Proc ) ( win_inst * win, mod_msg * pMsg );

Есть такая штука - указатель на функцию. DSP_Proc - имя типа указателя на фунцкию принимающую два параметра (win_inst * и mod_msg *) и не возвращающая ничего(void).


Цитата(Dubov @ Jul 11 2012, 18:26) *
Код
DSP_Proc Сom_fProc[CMD_NUMBER];

где элементы массива - имена, ранее объявленых функций.

Сom_fProc - массив указателей на функцию.


Цитата(Dubov @ Jul 11 2012, 18:26) *
Зачем так сильно всё усложнать? где такие выкрутасы оправданы и полезны?

Иногда такое нужно и удобно - во многих языках такое есть. Почитайте у того же K&R или ещё где.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 11 2012, 17:36
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Dubov @ Jul 11 2012, 18:26) *
где такие выкрутасы оправданы и полезны?

Вы хотите выполнить команду из некого набора. Каждая команда соответствует индексу (номеру) в массиве указателей на функцию. Указатели на функцию собраны в один массив. Команде 0 соответствует указатель 0-й, 1 - 1-й, и т.д. И вы просто вызываете нужную функцию DSP_Proc Сom_fProc[CMD_NUMBER] по указателю.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jul 12 2012, 20:48
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Не хочу засорять форум однотипными вопросами. Но очень нужна помощь в понимании некоторых конструкции, а посему опять вопрос)
Вижу контсрукцию:
CODE
typedef struct tagX {

int16 * p; //!< pointer to samples buffer

} X;
X x1;


а затем вижу такое

CODE
memcpy( &RawVal[0],
&x1.p[0],
NUMB*sizeof(int16) );
memcpy( &RawVal[NUMB],
&ad7324.pSamp[NUMB*FRAME_SZ],
NUMB*sizeof(int16) );


Получается сначала объявили структуру, где поле является указателем, а потом копируется по адресу указателя целый массив. Это нормально?
Go to the top of the page
 
+Quote Post
Tiro
сообщение Jul 12 2012, 21:03
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Цитата(Dubov @ Jul 12 2012, 23:48) *
Не хочу засорять форум однотипными вопросами. Но очень нужна помощь в понимании некоторых конструкции, а посему опять вопрос)

Керниган Ритчи Язык С второе издание
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 12 2012, 21:18
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dubov @ Jul 12 2012, 23:48) *
Получается сначала объявили структуру, где поле является указателем, а потом копируется по адресу указателя целый массив. Это нормально?

Конечно нормально - указатели для того и придумали, чтобы читать-писать по адресу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2012, 21:32
Сообщение #7


Гуру
******

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



QUOTE (Dubov @ Jul 12 2012, 23:48) *
а потом копируется по адресу указателя целый массив.
по адресу, на который указывает этот указатель.
p - адрес, на который указывает указатель. p[0] - значение, на которое указывает указатель. &p[0] - адрес значнения, на которое указывает указатель, т.е. то же самое, что и p. Эту конструкцию можно записать гораздо проще и понятнее:
CODE
memcpy( RawVal, x1.p, NUMB * sizeof(int16));
Почему автор выбрал такую запутанную форму выражения своей мысли - загадка. Возможно он считал, что именно так будет понятнее.


--------------------
На любой вопрос даю любой ответ
"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
mdmitry
сообщение Jul 12 2012, 21:48
Сообщение #8


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Сергей Борщ @ Jul 13 2012, 01:32) *
Почему автор выбрал такую запутанную форму выражения своей мысли - загадка. Возможно он считал, что именно так будет понятнее.

Однажды нарвался с IAR под ARM.
Не компилировалось именно это
Код
memcpy( RawVal, x1.p, NUMB * sizeof(int16));

А это проходило:
Код
memcpy( &RawVal[0], &x1.p[0], NUMB*sizeof(int16) );

Была выборочно включена MISRA, которая на вид написания кода накладывает заметные ограничения. Возможно у автора кода такая же ситуация.

С включенной MISRA
Код
switch(a)
{
case 1:
case 2:
break;
case 3:
break;
default:
break;
}

не соберётся. Будет ругаться на отсутствие
Код
break
в
Код
case 1:
.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2012, 22:18
Сообщение #9


Гуру
******

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



QUOTE (mdmitry @ Jul 13 2012, 00:48) *
Не компилировалось именно это
CODE
memcpy( RawVal, x1.p, NUMB * sizeof(int16));
Странно это. Второй параметр memcpy - void const *. Так зачем разыменовывать уже готовый указатель, чтобы взятием адреса вернуться к нему же? Могу допустить, что MISRA не резрешает использовать имя массива как указатель на его начало, но такое черз одно место использование указателя во втором параметре - нет уж, нафиг такую миСРУ. Она была задумана для уменьшения ошибок/описок, но в этом случае она их явно провоцирует.


--------------------
На любой вопрос даю любой ответ
"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
mdmitry
сообщение Jul 13 2012, 08:56
Сообщение #10


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Сергей Борщ @ Jul 13 2012, 02:18) *
Странно это. Второй параметр memcpy - void const *. Так зачем разыменовывать уже готовый указатель, чтобы взятием адреса вернуться к нему же? Могу допустить, что MISRA не резрешает использовать имя массива как указатель на его начало, но такое черз одно место использование указателя во втором параметре - нет уж, нафиг такую миСРУ. Она была задумана для уменьшения ошибок/описок, но в этом случае она их явно провоцирует.

У меня своя функция принимала указатель на массив и работало только с указанной выше конструкцией.

Код
static unsigned char SendCommand(... ,    unsigned char *pcmd,  unsigned char cmdSize, unsigned char *pData,     unsigned int dataSize );

error = SendCommand(..., myBuffer, mysize, &myrxbuf[0], 0);

Буфер myrxbuf был глобальный для единицы трансляции.
Там и с const какие-то сложности были, сейчас уже не помню.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 13 2012, 14:58
Сообщение #11


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Ну это странно, так как по стандарту языка С RawVal везде, кроме sizeof(RawVal) и &RawVal автоматически приводится к &RawVal[0].

Т.е. требование мисры писать только &RawVal[0] сродни требованию писать
Код
    unsigned char foo;

    foo = (unsigned char)0;
так как 0 таки ж имеет тип int и к unsigned char он в этом выражении приводится автоматически.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 05:23
Рейтинг@Mail.ru


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