|
Мудрёная операция с указателями в IAR C, Компилятор ругается. |
|
|
|
Dec 20 2017, 19:18
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Д_М @ Dec 20 2017, 21:02)  Компилятор ругается. Собственно, почему? Технически такое корректно. С чего бы это? Цитата(Д_М @ Dec 20 2017, 21:02)  а компилятор ругается. И правильно делает. Берёте указатель на один тип, и пытаетесь присвоить его указателю другого типа. Если CRC - типа int, то &Syst->SIO1.CRC - имеет тип указателя int *, а не указателя на структуру. PS: И чего собственно мудрёного-то тут?
|
|
|
|
|
Dec 20 2017, 19:45
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 20 2017, 20:06
|
Гуру
     
Группа: Свой
Сообщений: 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".
|
|
|
|
|
Dec 21 2017, 13:09
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Вы умолчали, что компилятор ругается на Цитата data = *Syst->SIO1.ptr; Если Syst - это указатель на структуру, то *Syst - это уже ссылка на структуру и синтакстически требуется точка: Syst->SIO1.CRC = CRC((*Syst).SIO1.ptr, Syst->SIO1.CRC, SIO1_poly); // Ругается компилятор
|
|
|
|
|
Dec 21 2017, 13:56
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(aiwa @ Dec 21 2017, 15:09)  Если Syst - это указатель на структуру, то *Syst - это уже ссылка на структуру и синтакстически требуется точка: Нет. Операция -> имеет приоритет выше чем операция разыменования указателя *. PS: Топик стоит перенести в раздел: "Предлагаю работу" с заголовком: "Ищу телепата". Автор сознательно пытается поиграть тут в шараду, а не ищет реально решение проблемы. А мы ведёмся...
|
|
|
|
|
Dec 21 2017, 15:14
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(jcxz @ Dec 21 2017, 15:56)  Нет. Операция -> имеет приоритет выше чем операция разыменования указателя *. В смысле ptr - указатель на char-подобный вид? В таком случае на инициализацию data была бы точно такая же ругань компилятора, как и при вызове функции.
|
|
|
|
|
Dec 21 2017, 17:04
|
Гуру
     
Группа: Свой
Сообщений: 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". Если бы ругалось на него, то в обоих случаях должно. А значит - видимо с ним всё нормально.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|