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

 
 
> 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 7 2014, 10:08
Сообщение #4


.
******

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


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


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

Группа: Модераторы
Сообщений: 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);
А в каком компиляторе работают оба? rolleyes.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 8 2014, 06:38
Сообщение #6


.
******

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



Цитата(ViKo @ Jan 7 2014, 16:18) *
Тем, что второй вариант не компилируется.
Keil V5.1.0

А (void *)&mass скомпилируется, если это идентификатор массива? Кейла 5-ого под рукой нет чтобы проверить. Идентификаторы массивов, структур и юнионов должны (были) отличаться в применении. При явном преобразовании адреса логично было бы чтобы выражение с идентификатором было приведено к адресу силами самого программиста, дабы не возникало неоднозначностей.

Жаль, в Си нет операторов детипизации указателей, сохраняя исходное адресное пространство. В идеале ещё как-то наследующих выравнивание и другие атрибуты. Вручную для безопасной работы приходится объявлять указатель на void и потом его присваивать к другому типизированному указателю.

Сообщение отредактировал GetSmart - Jan 8 2014, 06:48


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


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

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



Цитата(GetSmart @ Jan 8 2014, 09:38) *
А (void *)&mass скомпилируется, если это идентификатор массива? Кейла 5-ого под рукой нет чтобы проверить.

Проверьте на том, что имеете.
Мое мнение - для массива &mass и mass - одно и то же. Особенность языка.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 8 2014, 10:56
Сообщение #8


.
******

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



Цитата(ViKo @ Jan 8 2014, 15:21) *
Проверьте на том, что имеете.
Мое мнение - для массива &mass и mass - одно и то же. Особенность языка.

В IARе я так много раз делал без замечаний. Но если 5-ый Keil ругается на явное преобразование адреса от имени структуры без амперсанда, то использование аналогичного синтаксиса к имени массива порождает другой глюк. Кейлу логично было бы запретить использование (void *)&mass. Иначе будут новые грабли.


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


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

Группа: Модераторы
Сообщений: 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; тоже не ругается!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 8 2014, 18:11
Сообщение #10


Гуру
******

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



Цитата(ViKo @ Jan 8 2014, 13:10) *
На uint16_t *parr = (uint16_t *)&arr; тоже не ругается!
Естественно. Вы же делаете явное приведение типа. В этом случае каждый сам себе злобный Буратина, а компилятор умывает руки - если вы его просите о таком, значит знаете, чего хотите.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Jan 8 2014, 18:30
Сообщение #11


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

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



Цитата(Сергей Борщ @ Jan 8 2014, 21:11) *
Естественно. Вы же делаете явное приведение типа. В этом случае каждый сам себе злобный Буратина, а компилятор умывает руки - если вы его просите о таком, значит знаете, чего хотите.

Значит, компилятор "имеет представление" о том, что такое &arr. Почему же он неявное приведение не делает?
Ассемблерные команды получаются те же, что и для uint16_t *parr = arr;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 9 2014, 01:29
Сообщение #12


Гуру
******

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



Цитата(ViKo @ Jan 8 2014, 20:30) *
Почему же он неявное приведение не делает?
Потому что таковы правила языка. Это называется "безопасность типов" (type safety). Он не даем вам случайно спутать теплое с мягким и мух с котлетами. Но и оставляет вам право сделать это, если вам это действительно нужно, через явное приведение типов.


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- 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
||- - 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


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

 


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


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