Easyelectronics.ru

Электроника для всех
Текущее время: 25 мар 2019, 17:29

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 14:06 
Заглядывает иногда

Зарегистрирован: 03 июл 2013, 17:40
Сообщения: 31
Всем привет! Не нашел ветку в которой лучше спросить по Си на GCC (AVR studio 4.19 GCC 3.3). Если такая уже есть, то перенесите плиз.
Вопрос в том, что почему - то конструкции типа (data type*)pointer++ для void указатель не работаю.
Пример:

char mas[4] = {0x01,0x02,0x03,0x04};
void *temp = (int *)mas;
temp++;

temp будет увеличен на 1, а если написать так:

char mas[4] = {0x01,0x02,0x03,0x04};
void *temp = mas;
(int *)temp++;

то всплывает warning: ../Proj1.c:9:1: warning: value computed is not used

При этом конструкции вида temp = (int *)temp + 1; работают.
Внятного ответа не нашел, может кто подскажет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 14:31 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1547
Andmaster писал(а):
GCC 3.3

Сейчас не 2000 год вроде как. Возьмите тулчейн новее, у меня ничего не всплывает с вашим примером, никаких ворнингов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 15:26 
Заглядывает иногда

Зарегистрирован: 03 июл 2013, 17:40
Сообщения: 31
NStorm писал(а):
Andmaster писал(а):
GCC 3.3

Сейчас не 2000 год вроде как. Возьмите тулчейн новее, у меня ничего не всплывает с вашим примером, никаких ворнингов.


А что посоветуете? Перейти на новую atmel studio последнюю со встроенным тулчейном или поставить новое на avr studio 4.19 или может вообще типа в iar или что-то подобное?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 15:30 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1547
Ну для начала просто тулчейн обновить попробуйте, раз привыкли к старой студии. https://www.microchip.com/mymicrochip/f ... e=en607654
Тулчейн и IDE ведь разные вещи. avr-gcc можно много в каких IDE использовать, это уже на вкус и цвет, надо пробовать самому.
Новая студия сделана на MSVC - тяжеловесна довольно-таки. Есть еще MPLAB X бесплатный, он с новых версий avr-gcc поддерживает, но пока в стадии бета.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 15:51 
Заглядывает иногда

Зарегистрирован: 03 июл 2013, 17:40
Сообщения: 31
Спасибо за ссылочку. Распаковал в папку где старый тулчейн стоял с перезаписей файлов. (или надо по-другому ставить?). Ворнингов нет, но код:
char mas[4] = {0x01,0x02,0x03,0x04};
void *temp = mas;
(int *)temp++;
просматривая в дебагере дает увеличение temp на 1... то есть, что (int *)temp++, что (char *)temp++ увеличивается на 1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 16:02 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 736
А почему должно быть по другому?

См. сообщение ниже.


Последний раз редактировалось VladislavS 30 окт 2018, 16:14, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 16:07 
Заглядывает иногда

Зарегистрирован: 03 июл 2013, 17:40
Сообщения: 31
VladislavS писал(а):
А почему должно быть по другому? Выражение (int *)temp++ возвращает (int *)temp, а затем инкрементирует temp++. Переменная temp как было (void *) так и осталась.


Указатель преобразован к типу int?
Если написать:
int *p;
p++;
то p увеличится на 2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 16:11 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 736
Давай с другого боку подойдём. Взглянем на приоритеты операций.
https://ru.cppreference.com/w/cpp/langu ... precedence
Приоритет постинкремента выше приоритета приведения типов. Значит (int *)temp++ всё равно что (int *)(temp++). Инкрементируется всё равно переменная temp, а её тип (void *).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 16:20 
Заглядывает иногда

Зарегистрирован: 03 июл 2013, 17:40
Сообщения: 31
VladislavS писал(а):
Давай с другого боку подойдём. Взглянем на приоритеты операций.
https://ru.cppreference.com/w/cpp/langu ... precedence
Приоритет постинкремента выше приоритета приведения типов. Значит (int *)temp++ всё равно что (int *)(temp++). Инкрементируется всё равно переменная temp, а её тип (void *).


Хорошо, а если так ((int *)temp)++; то выводится ошибка ../Proj1.c:10:16: error: lvalue required as increment operand.

Как тогда правильно преобразовать тип void и инкрементировать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 16:37 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 736
Чем тебе temp = (что хочешь) не нравится?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 17:06 
Заглядывает иногда

Зарегистрирован: 03 июл 2013, 17:40
Сообщения: 31
VladislavS писал(а):
Чем тебе temp = (что хочешь) не нравится?


Да в общем всем нравится, просто хотел разобраться в этой тонкости. То есть инкремент с преобразованием типа void указателей не работает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 18:23 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 1547
Т.е. вы хотите сдвигать адрес на определенную размерность? Может тогда просто temp += sizeof(int); ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 30 окт 2018, 23:19 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 163
Andmaster писал(а):
То есть инкремент с преобразованием типа void указателей не работает

Встречный вопрос - чему равен sizeof(void) на вашей платформе? :-D Адресная арифметика принимает во внимание размер указываемого типа - инкремент указателя сдвигает его на количество байт равное sizeof(указуемый тип).
Andmaster писал(а):
Хорошо, а если так ((int *)temp)++; то выводится ошибка ../Proj1.c:10:16: error: lvalue required as increment operand.

lvalue - это, можно назвать, как "то чему можно просвоить" (сейчас верно огребу шишек от специалистов за такие трактовки) и, судя по всему результат приведения к int* - а) не тa-жe самая пeременная, что и temp, b) не является модифицируемым. Т.е. даже если его и инкрементировать - на исходной переменной temp это никак не отразится - была вроде у вас и такая ошибка по ходу разбирательств. Заведите указатель нормального типа, и его уже двигайте: int* t = (int*)temp; t++;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio + AVR GCC
СообщениеДобавлено: 31 окт 2018, 00:37 
Заглядывает иногда

Зарегистрирован: 03 июл 2013, 17:40
Сообщения: 31
int* t = (int*)temp; t++; действительно сдвигает на два байта. Просто в некоторых мануалах читал, в том числе у дихальта, что конструкции типа:
void *addres;
(u16 *)addres++; //Увеличили указатель как будто он u16, т.е. на 2 байта
(u08 *)addres++; // А теперь словно он u08 -- на один байт
не работают именно в таком виде.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: SOVA


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB