|
|
  |
помогите с контрукциями С, непонятно |
|
|
|
Jul 11 2012, 15:26
|
Местный
  
Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052

|
Волей судьбы пришлось разбираться с чужим кодом. Никак не пойму что означает такая конструкция: CODE typedef void ( * DSP_Proc ) ( win_inst * win, mod_msg * pMsg ); а потом вижу такое CODE DSP_Proc Сom_fProc[CMD_NUMBER]; где элементы массива - имена, ранее объявленых функций. Зачем так сильно всё усложнать? где такие выкрутасы оправданы и полезны?
|
|
|
|
|
Jul 11 2012, 15:33
|
Гуру
     
Группа: Свой
Сообщений: 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 или ещё где.
|
|
|
|
|
Jul 12 2012, 20:48
|
Местный
  
Группа: Участник
Сообщений: 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) ); Получается сначала объявили структуру, где поле является указателем, а потом копируется по адресу указателя целый массив. Это нормально?
|
|
|
|
|
Jul 12 2012, 21:32
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jul 12 2012, 21:48
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 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: .
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Jul 12 2012, 22:18
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jul 13 2012, 08:56
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 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 какие-то сложности были, сейчас уже не помню.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Jul 13 2012, 14:58
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 он в этом выражении приводится автоматически.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|