Д_М 0 20 декабря, 2017 Опубликовано 20 декабря, 2017 · Жалоба Приветствую! Имеется структура и переменная - указатель, которая хранит адрес этой структуры. Обращение к полям структуры через указатель Syst->SIO1.CRC; Проверено, работает. Ничего удивительного. Решил в указатель загрузить адрес поля этой структуры crc = &Syst->SIO1.CRC; Компилятор ругается. Собственно, почему? Технически такое корректно. Меня в своё время очень удивило, что в качестве аргумента можно передавать адреса локальных переменных. Здесь ещё менее хитро, а компилятор ругается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 20 декабря, 2017 Опубликовано 20 декабря, 2017 · Жалоба Компилятор ругается. Собственно, почему?Потому что вы что-то написали неправильно. Не видя конкретного сообщения компилятора сказать что-либо точнее невозможно (телепатия барахлит). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 20 декабря, 2017 Опубликовано 20 декабря, 2017 · Жалоба Компилятор ругается. Собственно, почему? Технически такое корректно. С чего бы это? а компилятор ругается. И правильно делает. Берёте указатель на один тип, и пытаетесь присвоить его указателю другого типа. Если CRC - типа int, то &Syst->SIO1.CRC - имеет тип указателя int *, а не указателя на структуру. PS: И чего собственно мудрёного-то тут? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 декабря, 2017 Опубликовано 20 декабря, 2017 · Жалоба Потому что у полей нет адресов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Д_М 0 20 декабря, 2017 Опубликовано 20 декабря, 2017 · Жалоба Объявления 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 *" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 20 декабря, 2017 Опубликовано 20 декабря, 2017 (изменено) · Жалоба Потому что у полей нет адресов. у декларации структуры - да. но есть смещение от начала структуры. и соответственно размер всей структуры. а относительно указателя на данную структуру, есть адресс по факту (иначе, от противного, надо начинать верить в магию). 2копикастер в подобных случая нужно 1) привести полностью код влияющий на ругань. т.е. все используемые типы и саму операцию, которую не пропускает компилятор. Чтоб не париться - обычно делается так. Заводите болванку типа одной функции майн. и вставляете туда свою строчку которая с проблемой. копируете всё необходимое так-же. проверяете компиляцию. зачастую на этом этапе вы сами с успехом найдёте свою ошибку в большинстве случаев. если проблема всё равно осталась и мысли закончились - только после этого постите проблему на форум. 2) как уже прозвучало выше - надо привести оригинал ругани. удачи вам (круглый) ...Error[Pe513]: a value of type "unsigned int volatile *" cannot be assigned to an entity of type "unsigned int *" приведение типов. тип с лева не равен типу с права. не нравится volatile . т.е. компилятор видит с одной стороны вам пофигу на оптимизацию, а с другой обломс - вы явно указываете, что эту переменную нельзя оптимизировать. ну или по другому - компилятор не имеет в своём стандартном наборе приведение одного к другому. попробуйте явно привести ручками тип один к другому. показывая компилятору что Вы знаете о траблах в коде и берёте на себя всю ответственность за результат. Изменено 20 декабря, 2017 пользователем kolobok0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 20 декабря, 2017 Опубликовано 20 декабря, 2017 · Жалоба Error[Pe513]: a value of type "unsigned int volatile *" cannot be assigned to an entity of type "unsigned int *" Syst - имеет модификатор типа "volatile" и, соответственно любой член объекта на который он указывает, автоматом имеет этот модификатор. А Вы пытаетесь указатель на такой тип присвоить обычному указателю без типа volatile. На что Вам и указывает компилятор. Приведение указателя без модификатора "volatile", к указателю имеющему такой модификатор (указателю такого же типа) - это разрешённая операция и выполняется без ошибки и без варнинга. Обратная операция - запрещена (ну т.е. требует явного указания такого приведения). Что является логичным, зная что такое "volatile". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Д_М 0 21 декабря, 2017 Опубликовано 21 декабря, 2017 · Жалоба 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); // Не ругается компилятор Тоже самое, но через промежуточную локальную переменную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 21 декабря, 2017 Опубликовано 21 декабря, 2017 · Жалоба // Ругается компиляторТеперь он, наверное, ругается иначе? Пришет что-то про неопределенный порядок доступа к volatile-переменным в выражении? А вы принципиально не хотите прочитать то, что пишет вам компилятор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 21 декабря, 2017 Опубликовано 21 декабря, 2017 · Жалоба Вы умолчали, что компилятор ругается на data = *Syst->SIO1.ptr; Если Syst - это указатель на структуру, то *Syst - это уже ссылка на структуру и синтакстически требуется точка: Syst->SIO1.CRC = CRC((*Syst).SIO1.ptr, Syst->SIO1.CRC, SIO1_poly); // Ругается компилятор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 21 декабря, 2017 Опубликовано 21 декабря, 2017 · Жалоба Если Syst - это указатель на структуру, то *Syst - это уже ссылка на структуру и синтакстически требуется точка: Нет. Операция -> имеет приоритет выше чем операция разыменования указателя *. PS: Топик стоит перенести в раздел: "Предлагаю работу" с заголовком: "Ищу телепата". Автор сознательно пытается поиграть тут в шараду, а не ищет реально решение проблемы. А мы ведёмся... :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 21 декабря, 2017 Опубликовано 21 декабря, 2017 · Жалоба Видимо лень читать гугло-поиск или на крайний случай книгу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 21 декабря, 2017 Опубликовано 21 декабря, 2017 · Жалоба Видимо лень читать гугло-поиск или на крайний случай книгу. видимо лень прочитать даже советы озвученные тут :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 21 декабря, 2017 Опубликовано 21 декабря, 2017 · Жалоба Нет. Операция -> имеет приоритет выше чем операция разыменования указателя *. В смысле ptr - указатель на char-подобный вид? В таком случае на инициализацию data была бы точно такая же ругань компилятора, как и при вызове функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 21 декабря, 2017 Опубликовано 21 декабря, 2017 · Жалоба В смысле ptr - указатель на char-подобный вид? В смысле - я читаю то, что написано у ТС. А не пытаюсь придумать, что же он хотел там написать. А написано там: взять значение члена "SIO1.ptr", а затем его разыменовать. А Вы пытаетесь придумать "Что бы там такое другое могло быть?". Но если так, то почему бы например не предположить что автор там хотел написать скажем "*Syst-SIO1.ptr" или что ещё другое? Тогда можно вообще 100500 вариантов придумать. В таком случае на инициализацию data была бы точно такая же ругань компилятора, как и при вызове функции. А Вы обратите внимание что и при инициализации data и при вызове функции выражение-то одно и то же "*Syst->SIO1.ptr". Если бы ругалось на него, то в обоих случаях должно. А значит - видимо с ним всё нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться