Перейти к содержанию
    

Мудрёная операция с указателями в IAR C

Приветствую!

Имеется структура и переменная - указатель, которая хранит адрес этой структуры.

Обращение к полям структуры через указатель Syst->SIO1.CRC;

Проверено, работает. Ничего удивительного. Решил в указатель загрузить адрес поля этой структуры

crc = &Syst->SIO1.CRC;

Компилятор ругается. Собственно, почему? Технически такое корректно. Меня в своё время очень удивило, что в качестве аргумента можно передавать адреса локальных переменных. Здесь ещё менее хитро, а компилятор ругается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор ругается. Собственно, почему?
Потому что вы что-то написали неправильно. Не видя конкретного сообщения компилятора сказать что-либо точнее невозможно (телепатия барахлит).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор ругается. Собственно, почему? Технически такое корректно.

С чего бы это?

 

а компилятор ругается.

И правильно делает. Берёте указатель на один тип, и пытаетесь присвоить его указателю другого типа.

Если CRC - типа int, то &Syst->SIO1.CRC - имеет тип указателя int *, а не указателя на структуру.

 

PS: И чего собственно мудрёного-то тут?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Объявления

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 *"

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что у полей нет адресов.

 

у декларации структуры - да. но есть смещение от начала структуры. и соответственно размер всей структуры.

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

 

2копикастер

в подобных случая нужно

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

Чтоб не париться - обычно делается так. Заводите болванку типа одной функции майн. и вставляете туда свою строчку которая с проблемой. копируете всё необходимое так-же.

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

проблему на форум.

2) как уже прозвучало выше - надо привести оригинал ругани.

 

удачи вам

(круглый)

 

...Error[Pe513]: a value of type "unsigned int volatile *" cannot be assigned to an entity of type "unsigned int *"

 

приведение типов.

тип с лева не равен типу с права. не нравится volatile .

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

ну или по другому - компилятор не имеет в своём стандартном наборе приведение одного к другому.

 

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

Изменено пользователем kolobok0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Error[Pe513]: a value of type "unsigned int volatile *" cannot be assigned to an entity of type "unsigned int *"

Syst - имеет модификатор типа "volatile" и, соответственно любой член объекта на который он указывает, автоматом имеет этот модификатор.

А Вы пытаетесь указатель на такой тип присвоить обычному указателю без типа volatile. На что Вам и указывает компилятор.

Приведение указателя без модификатора "volatile", к указателю имеющему такой модификатор (указателю такого же типа) - это разрешённая операция и выполняется без ошибки и без варнинга.

Обратная операция - запрещена (ну т.е. требует явного указания такого приведения).

Что является логичным, зная что такое "volatile".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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); // Не ругается компилятор

 

Тоже самое, но через промежуточную локальную переменную.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

// Ругается компилятор
Теперь он, наверное, ругается иначе? Пришет что-то про неопределенный порядок доступа к volatile-переменным в выражении? А вы принципиально не хотите прочитать то, что пишет вам компилятор?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы умолчали, что компилятор ругается на

data = *Syst->SIO1.ptr;

 

Если Syst - это указатель на структуру, то *Syst - это уже ссылка на структуру и синтакстически требуется точка:

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

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если Syst - это указатель на структуру, то *Syst - это уже ссылка на структуру и синтакстически требуется точка:

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

 

PS: Топик стоит перенести в раздел: "Предлагаю работу" с заголовком: "Ищу телепата". Автор сознательно пытается поиграть тут в шараду, а не ищет реально решение проблемы. А мы ведёмся... :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо лень читать гугло-поиск или на крайний случай книгу.

видимо лень прочитать даже советы озвученные тут :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

В смысле ptr - указатель на char-подобный вид?

В таком случае на инициализацию data была бы точно такая же ругань компилятора, как и при вызове функции.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В смысле ptr - указатель на char-подобный вид?

В смысле - я читаю то, что написано у ТС. А не пытаюсь придумать, что же он хотел там написать. А написано там: взять значение члена "SIO1.ptr", а затем его разыменовать.

А Вы пытаетесь придумать "Что бы там такое другое могло быть?". Но если так, то почему бы например не предположить что автор там хотел написать скажем "*Syst-SIO1.ptr" или что ещё другое? Тогда можно вообще 100500 вариантов придумать.

В таком случае на инициализацию data была бы точно такая же ругань компилятора, как и при вызове функции.

А Вы обратите внимание что и при инициализации data и при вызове функции выражение-то одно и то же "*Syst->SIO1.ptr".

Если бы ругалось на него, то в обоих случаях должно. А значит - видимо с ним всё нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...