|
void const *argument, Что это? |
|
|
|
 |
Ответов
|
Jan 6 2014, 23:38
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Вообще-то компилятор должен "съедать" этот параметр при вызове функции и без явного преобразования. Как и для параметра "void *" компилятор должен принимать указатель на любой неконстантный объект из соответствующего адресного пространства. Если отказывается, то это наверное плохой компилятор. Без явного преобразования очевидно, что безопаснее. Цитата(ViKo @ Jan 7 2014, 02:35)  Нужно поправить - брать адрес структуры. Какая разница в данном случае, с амперсандом или без? В случае когда голый идентификатор структуры без указания поля. Однозначнее, конечно, было бы с амперсандом, но на данный момент в Си оба варианта вроде бы одинаковые. Цитата(megajohn @ Jan 7 2014, 02:18)  если оно будет на стеке, то по моменту запуска самой задачи естветсвено всё уплывет. Квалификатор const не запретит передачу локальной переменной. Не встать на грабли - забота программиста. const в параметре "проявит себя" только внутри тела функции, когда этот указатель без явного преобразования будет передан параметром или присвоен другому типизированному указателю на константу. Цитата(megajohn @ Jan 7 2014, 02:18)  то есть так нельзя Suart_init mb_cfg = { 0, 9600 }; task_start( mb_task, ..., (void*)mb_cfg );
а так можно const Suart_init mb_cfg = { 0, 9600 }; task_start( mb_task, ..., (void*)mb_cfg ); Второй вариант тоже будет на стеке. Просто менять его значения нельзя будет.
Сообщение отредактировал GetSmart - Jan 7 2014, 02:22
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 7 2014, 08:50
|

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

|
Цитата(GetSmart @ Jan 7 2014, 02:38)  Какая разница в данном случае, с амперсандом или без? В случае когда голый идентификатор структуры без указания поля. Однозначнее, конечно, было бы с амперсандом, но на данный момент в Си оба варианта вроде бы одинаковые. Возможно, в других языках варианты одинаковые. Но не в С. В C можно структуру передавать в функцию, именно, по значению, а не по ссылке. Т.е., имя структуры не есть ее адрес. В отличие от массива.
|
|
|
|
|
Jan 7 2014, 10:08
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(ViKo @ Jan 7 2014, 14:50)  Возможно, в других языках варианты одинаковые. Но не в С. Чем отличается результат двух вариантов выражений со структурами ниже? Код (void*)&mb_cfg и (void*)mb_cfg Если отличаются, то в каких компиляторах. Идентификатор/имя массива тоже не является адресом его первого элемента. Иначе выражение &mass было бы аналогом &(&mass[0]). Взятие адреса от адреса в Си допустимо?
Сообщение отредактировал GetSmart - Jan 7 2014, 10:18
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 7 2014, 10:18
|

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

|
Цитата(GetSmart @ Jan 7 2014, 13:08)  Чем отличается результат двух вариантов выражений со структурами ниже? Код (void*)&mb_cfg и (void*)mb_cfg Если отличаются, то в каких компиляторах. Тем, что второй вариант не компилируется. Keil V5.1.0 source\exsUSB.c(164): error: #171: invalid type conversion Led9_id = osThreadCreate(osThread(Led_thread), (void *)led9); А в каком компиляторе работают оба?
|
|
|
|
|
Jan 8 2014, 11:10
|

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

|
Цитата(GetSmart @ Jan 8 2014, 13:56)  Кейлу логично было бы запретить использование (void *)&mass. Наверное, так оно и есть. Проверил. Получил. uint16_t arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; uint16_t *parr = &arr; source\Exercises.c(159): error: #144: a value of type "uint16_t (*)[10]" cannot be used to initialize an entity of type "uint16_t *" На uint16_t *parr = &arr[0]; не ругается, естественно. На uint16_t *parr = (uint16_t *)&arr; тоже не ругается!
|
|
|
|
Сообщений в этой теме
ViKo void const *argument Jan 6 2014, 19:06 megajohn ну к примеру у вас на контроллере два UART
и в од... Jan 6 2014, 19:57 ViKo Цитата(megajohn @ Jan 6 2014, 22:57) то е... Jan 6 2014, 20:35 kosyak© Вот зачем оно конст...? Jan 6 2014, 20:14 megajohn если оно будет на стеке, то по моменту запуска сам... Jan 6 2014, 20:18 kosyak© тогда уж
task_start( mb_task, ..., (void const*)... Jan 6 2014, 20:40    GetSmart Цитата(ViKo @ Jan 7 2014, 16:18) Led9_id ... Jan 7 2014, 10:38     ViKo Цитата(GetSmart @ Jan 7 2014, 13:29) Пред... Jan 7 2014, 10:42      Сергей Борщ Цитата(ViKo @ Jan 8 2014, 11:21) Мое мнен... Jan 8 2014, 10:51         ViKo Цитата(Сергей Борщ @ Jan 8 2014, 21:11) Е... Jan 8 2014, 18:30          Сергей Борщ Цитата(ViKo @ Jan 8 2014, 20:30) Почему ж... Jan 9 2014, 01:29  GetSmart Цитата(ViKo @ Jan 7 2014, 14:50) В C можн... Jan 10 2014, 11:45   ViKo Цитата(GetSmart @ Jan 10 2014, 14:45) Ну ... Jan 10 2014, 11:59    GetSmart Цитата(ViKo @ Jan 10 2014, 17:59) Как это... Jan 10 2014, 12:07     ViKo Цитата(GetSmart @ Jan 10 2014, 15:07) Ещё... Jan 10 2014, 14:13 megajohn Цитата(GetSmart @ Jan 7 2014, 03:38) Квал... Jan 7 2014, 10:20 Tarbal В процессорах с Гарвардской архитектурой AVR, PIC,... Jan 9 2014, 02:47 Сергей Борщ Цитата(Tarbal @ Jan 9 2014, 04:47) В проц... Jan 9 2014, 07:28  Herz Цитата(Сергей Борщ @ Jan 9 2014, 09:28) А... Jan 9 2014, 08:11   Сергей Борщ Цитата(Herz @ Jan 9 2014, 10:11) А каким ... Jan 9 2014, 12:19    ViKo Цитата(Сергей Борщ @ Jan 9 2014, 15:19) Я... Jan 9 2014, 12:24     Сергей Борщ Цитата(ViKo @ Jan 9 2014, 14:24) Да, с ло... Jan 9 2014, 12:44  ViKo Цитата(Сергей Борщ @ Jan 9 2014, 10:28) А... Jan 9 2014, 08:16  Tarbal Цитата(Сергей Борщ @ Jan 9 2014, 10:28) Н... Jan 9 2014, 18:55 GetSmart Цитата(Tarbal @ Jan 9 2014, 08:47) В проц... Jan 10 2014, 19:22 andrewlekar При чём тут static вообще? На ARMах const в опреде... Jan 9 2014, 10:17 XVR Использование ключевых слов static и/или const для... Jan 9 2014, 10:20 ViKo Цитата(XVR @ Jan 9 2014, 13:20) Поэтом, п... Jan 9 2014, 10:36 andrewlekar Цитатадля каких именно компиляторов
Ни для каких. ... Jan 9 2014, 10:27 andrewlekar Что, вашему компилятору не хватает ума разместить ... Jan 9 2014, 10:40 andrewlekar Что вы этим гениальным кодом хотите проверить? В c... Jan 10 2014, 05:29 Tarbal Цитата(andrewlekar @ Jan 10 2014, 08:29) ... Jan 10 2014, 14:22 редактор Цитатато надо было указать квалификатор __flash.
О... Jan 10 2014, 08:04 andrew_b Цитата(редактор @ Jan 10 2014, 12:04) con... Jan 10 2014, 08:54 ViKo Удостоверился в Кейл для глобальных переменных:
- ... Jan 10 2014, 09:45 Сергей Борщ Цитата(ViKo @ Jan 10 2014, 11:45) Удостов... Jan 10 2014, 11:05 andrewlekar ЦитатаУ кого есть IAR AVR?
ЦитатаДля процессора с ... Jan 10 2014, 17:30 Tarbal Цитата(andrewlekar @ Jan 10 2014, 21:30) ... Jan 10 2014, 22:35 andrewlekar ЦитатаНичего не понял. Может попробуете еще раз вы... Jan 11 2014, 06:32 Tarbal Цитата(andrewlekar @ Jan 11 2014, 10:32) ... Jan 11 2014, 18:22  Сергей Борщ Цитата(Tarbal @ Jan 11 2014, 20:22) Я вам... Jan 11 2014, 19:33   Tarbal Цитата(Сергей Борщ @ Jan 11 2014, 22:33) ... Jan 13 2014, 12:28 Tarbal Вот документ.
На странице 5 есть информация о разм... Jan 14 2014, 13:10 demiurg_spb Цитата(Tarbal @ Jan 14 2014, 17:10) Вот д... Jan 14 2014, 15:42  Tarbal Цитата(demiurg_spb @ Jan 14 2014, 19:42) ... Jan 14 2014, 16:09   demiurg_spb Цитата(Tarbal @ Jan 14 2014, 20:09) Прост... Jan 14 2014, 16:34    Tarbal Цитата(demiurg_spb @ Jan 14 2014, 20:34) ... Jan 14 2014, 18:46     Сергей Борщ Цитата(Tarbal @ Jan 14 2014, 20:46) О ста... Jan 15 2014, 07:37 Сергей Борщ Цитата(Tarbal @ Jan 14 2014, 15:10) Вот д... Jan 14 2014, 18:09 andrewlekar Ну вот я собрал ваш код при помощи IAR AVR 5.3. Во... Jan 15 2014, 04:53 Tarbal Цитата(andrewlekar @ Jan 15 2014, 08:53) ... Jan 15 2014, 13:13  Сергей Борщ Цитата(Tarbal @ Jan 15 2014, 15:13) И как... Jan 15 2014, 15:23 dxp Очень плотно использовал IAR для AVR в конце девян... Jan 15 2014, 13:49 Tarbal Цитата(dxp @ Jan 15 2014, 17:49) Очень пл... Jan 16 2014, 23:40
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|