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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Мудрёная операция с указателями в IAR C, Компилятор ругается.
Д_М
сообщение Dec 20 2017, 19:02
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Приветствую!
Имеется структура и переменная - указатель, которая хранит адрес этой структуры.
Обращение к полям структуры через указатель Syst->SIO1.CRC;
Проверено, работает. Ничего удивительного. Решил в указатель загрузить адрес поля этой структуры
crc = &Syst->SIO1.CRC;
Компилятор ругается. Собственно, почему? Технически такое корректно. Меня в своё время очень удивило, что в качестве аргумента можно передавать адреса локальных переменных. Здесь ещё менее хитро, а компилятор ругается.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 20 2017, 19:10
Сообщение #2


Гуру
******

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



QUOTE (Д_М @ Dec 20 2017, 21:02) *
Компилятор ругается. Собственно, почему?
Потому что вы что-то написали неправильно. Не видя конкретного сообщения компилятора сказать что-либо точнее невозможно (телепатия барахлит).


--------------------
На любой вопрос даю любой ответ
"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
jcxz
сообщение Dec 20 2017, 19:18
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Д_М @ Dec 20 2017, 21:02) *
Компилятор ругается. Собственно, почему? Технически такое корректно.

С чего бы это?

Цитата(Д_М @ Dec 20 2017, 21:02) *
а компилятор ругается.

И правильно делает. Берёте указатель на один тип, и пытаетесь присвоить его указателю другого типа.
Если CRC - типа int, то &Syst->SIO1.CRC - имеет тип указателя int *, а не указателя на структуру.

PS: И чего собственно мудрёного-то тут?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 20 2017, 19:29
Сообщение #4


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

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



Потому что у полей нет адресов.
Go to the top of the page
 
+Quote Post
Д_М
сообщение Dec 20 2017, 19:35
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Объявления
unsigned int *crc;
syspar Sys; // Декларация структуры типа syspar
__no_init volatile syspar *Syst @0x0100;


Syst = &Sys;
crc = &Syst->SIO1.CRC; // Ругается компилятор
crc = &Sys.SIO1.CRC;



Error[Pe513]: a value of type "unsigned int volatile *" cannot be assigned to an entity of type "unsigned int *"
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Dec 20 2017, 19:45
Сообщение #6


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(ViKo @ Dec 20 2017, 22:29) *
Потому что у полей нет адресов.


у декларации структуры - да. но есть смещение от начала структуры. и соответственно размер всей структуры.
а относительно указателя на данную структуру, есть адресс по факту (иначе, от противного, надо начинать верить в магию).

2копикастер
в подобных случая нужно
1) привести полностью код влияющий на ругань. т.е. все используемые типы и саму операцию, которую не пропускает компилятор.
Чтоб не париться - обычно делается так. Заводите болванку типа одной функции майн. и вставляете туда свою строчку которая с проблемой. копируете всё необходимое так-же.
проверяете компиляцию. зачастую на этом этапе вы сами с успехом найдёте свою ошибку в большинстве случаев. если проблема всё равно осталась и мысли закончились - только после этого постите
проблему на форум.
2) как уже прозвучало выше - надо привести оригинал ругани.

удачи вам
(круглый)

Цитата(Д_М @ Dec 20 2017, 22:35) *
...Error[Pe513]: a value of type "unsigned int volatile *" cannot be assigned to an entity of type "unsigned int *"


приведение типов.
тип с лева не равен типу с права. не нравится volatile .
т.е. компилятор видит с одной стороны вам пофигу на оптимизацию, а с другой обломс - вы явно указываете, что эту переменную нельзя оптимизировать.
ну или по другому - компилятор не имеет в своём стандартном наборе приведение одного к другому.

попробуйте явно привести ручками тип один к другому. показывая компилятору что Вы знаете о траблах в коде и берёте на себя всю ответственность за результат.

Сообщение отредактировал kolobok0 - Dec 20 2017, 19:51
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 20 2017, 20:06
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Д_М @ Dec 20 2017, 21:35) *
Error[Pe513]: a value of type "unsigned int volatile *" cannot be assigned to an entity of type "unsigned int *"

Syst - имеет модификатор типа "volatile" и, соответственно любой член объекта на который он указывает, автоматом имеет этот модификатор.
А Вы пытаетесь указатель на такой тип присвоить обычному указателю без типа volatile. На что Вам и указывает компилятор.
Приведение указателя без модификатора "volatile", к указателю имеющему такой модификатор (указателю такого же типа) - это разрешённая операция и выполняется без ошибки и без варнинга.
Обратная операция - запрещена (ну т.е. требует явного указания такого приведения).
Что является логичным, зная что такое "volatile".
Go to the top of the page
 
+Quote Post
Д_М
сообщение Dec 21 2017, 10:18
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



extern unsigned int CRC(char data, unsigned int crc, unsigned int poly);

void MB1_Send(void)
{
union
{
char *ch;
int *ui;
}target;
unsigned char
amount = Syst->SIO1.amount,
data = *Syst->SIO1.ptr;

if(Syst->SIO1.size < amount)
{
Syst->SIO1.CRC = CRC(*Syst->SIO1.ptr, Syst->SIO1.CRC, SIO1_poly); // Ругается компилятор
Syst->SIO1.CRC = CRC(data, Syst->SIO1.CRC, SIO1_poly); // Не ругается компилятор

Тоже самое, но через промежуточную локальную переменную.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 21 2017, 12:42
Сообщение #9


Гуру
******

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



QUOTE (Д_М @ Dec 21 2017, 12:18) *
// Ругается компилятор
Теперь он, наверное, ругается иначе? Пришет что-то про неопределенный порядок доступа к volatile-переменным в выражении? А вы принципиально не хотите прочитать то, что пишет вам компилятор?


--------------------
На любой вопрос даю любой ответ
"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
aiwa
сообщение Dec 21 2017, 13:09
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Вы умолчали, что компилятор ругается на
Цитата
data = *Syst->SIO1.ptr;


Если Syst - это указатель на структуру, то *Syst - это уже ссылка на структуру и синтакстически требуется точка:
Syst->SIO1.CRC = CRC((*Syst).SIO1.ptr, Syst->SIO1.CRC, SIO1_poly); // Ругается компилятор




Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 21 2017, 13:56
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aiwa @ Dec 21 2017, 15:09) *
Если Syst - это указатель на структуру, то *Syst - это уже ссылка на структуру и синтакстически требуется точка:

Нет. Операция -> имеет приоритет выше чем операция разыменования указателя *.

PS: Топик стоит перенести в раздел: "Предлагаю работу" с заголовком: "Ищу телепата". Автор сознательно пытается поиграть тут в шараду, а не ищет реально решение проблемы. А мы ведёмся... laughing.gif
Go to the top of the page
 
+Quote Post
x893
сообщение Dec 21 2017, 13:58
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Видимо лень читать гугло-поиск или на крайний случай книгу.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 21 2017, 14:04
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(x893 @ Dec 21 2017, 15:58) *
Видимо лень читать гугло-поиск или на крайний случай книгу.

видимо лень прочитать даже советы озвученные тут laughing.gif
Go to the top of the page
 
+Quote Post
aiwa
сообщение Dec 21 2017, 15:14
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(jcxz @ Dec 21 2017, 15:56) *
Нет. Операция -> имеет приоритет выше чем операция разыменования указателя *.


В смысле ptr - указатель на char-подобный вид?
В таком случае на инициализацию data была бы точно такая же ругань компилятора, как и при вызове функции.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 21 2017, 17:04
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(aiwa @ Dec 21 2017, 17:14) *
В смысле ptr - указатель на char-подобный вид?

В смысле - я читаю то, что написано у ТС. А не пытаюсь придумать, что же он хотел там написать. А написано там: взять значение члена "SIO1.ptr", а затем его разыменовать.
А Вы пытаетесь придумать "Что бы там такое другое могло быть?". Но если так, то почему бы например не предположить что автор там хотел написать скажем "*Syst-SIO1.ptr" или что ещё другое? Тогда можно вообще 100500 вариантов придумать.
Цитата(aiwa @ Dec 21 2017, 17:14) *
В таком случае на инициализацию data была бы точно такая же ругань компилятора, как и при вызове функции.

А Вы обратите внимание что и при инициализации data и при вызове функции выражение-то одно и то же "*Syst->SIO1.ptr".
Если бы ругалось на него, то в обоих случаях должно. А значит - видимо с ним всё нормально.
Go to the top of the page
 
+Quote Post

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

 


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


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