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

 
 
> void const *argument, Что это?
ViKo
сообщение Jan 6 2014, 19:06
Сообщение #1


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

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



В Keil CMSIS-RTOS RTX в параметрах задач указано:
Код
void job1 (void const *arg)

Что это, зачем? Писал, не задумываясь. Теперь хочу просветиться.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Jan 6 2014, 23:38
Сообщение #2


.
******

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 7 2014, 08:50
Сообщение #3


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

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



Цитата(GetSmart @ Jan 7 2014, 02:38) *
Какая разница в данном случае, с амперсандом или без? В случае когда голый идентификатор структуры без указания поля. Однозначнее, конечно, было бы с амперсандом, но на данный момент в Си оба варианта вроде бы одинаковые.

Возможно, в других языках варианты одинаковые. Но не в С. В C можно структуру передавать в функцию, именно, по значению, а не по ссылке. Т.е., имя структуры не есть ее адрес. В отличие от массива.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 10 2014, 11:45
Сообщение #4


.
******

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



Цитата(ViKo @ Jan 7 2014, 14:50) *
В C можно структуру передавать в функцию, именно, по значению, а не по ссылке. Т.е., имя структуры не есть ее адрес. В отличие от массива.

Ну и как это связано с явным преобразованием идентификатора структуры? Разве при этом недостаточно информации о том, что "заказчик" желает взять именно её адрес?

Более интересна ситуация, которую я нашёл у себя в исходниках, применения явного преобразования адреса к локальной (чаще регистровой) переменной. Вроде:
Код
void foo(float val)
{
    u32 val32 = *(u32 *)&val;

    u32 res32 = 0x80000000;
    if (val32 != 0)
        res32 = (((val32 & 0x007FFFFF) >> 1) | 0x00400000) |
                ...;
....
}

Вот здесь (во второй строке), спрашивается, компилятору хватит информации не облажаться.

Сообщение отредактировал GetSmart - Jan 10 2014, 13:27


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 10 2014, 11:59
Сообщение #5


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

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



Цитата(GetSmart @ Jan 10 2014, 14:45) *
Ну и как это связано с явным преобразованием идентификатора структуры? Разве при этом недостаточно информации о том, что "заказчик" желает взять именно её адрес?

Никак. С тем вопросом уже разобрались.
Цитата
Более интересна ситуация, которую я нашёл у себя в исходниках, применения явного преобразования адреса к локальной (чаще регистровой) переменной.

Как это - адрес у регистровой переменной? Ну, для PIC-ов, где все переменные - регистры, можно понять. А вы о каком процессоре говорите?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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, 14:50) Возможно...   Jan 7 2014, 10:08
|||- - ViKo   Цитата(GetSmart @ Jan 7 2014, 13:08) Чем ...   Jan 7 2014, 10:18
|||- - 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
|||- - GetSmart   Цитата(ViKo @ Jan 7 2014, 16:18) Тем, что...   Jan 8 2014, 06:38
|||- - ViKo   Цитата(GetSmart @ Jan 8 2014, 09:38) А (v...   Jan 8 2014, 09:21
|||- - Сергей Борщ   Цитата(ViKo @ Jan 8 2014, 11:21) Мое мнен...   Jan 8 2014, 10:51
|||- - GetSmart   Цитата(ViKo @ Jan 8 2014, 15:21) Проверьт...   Jan 8 2014, 10:56
|||- - ViKo   Цитата(GetSmart @ Jan 8 2014, 13:56) Кейл...   Jan 8 2014, 11:10
|||- - Сергей Борщ   Цитата(ViKo @ Jan 8 2014, 13:10) На uin...   Jan 8 2014, 18:11
|||- - 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 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


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

 


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


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