Easyelectronics.ru

Электроника для всех
Текущее время: 24 янв 2019, 05:40

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




Начать новую тему Ответить на тему  [ Сообщений: 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
Сообщения: 1410
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
Сообщения: 1410
Ну для начала просто тулчейн обновить попробуйте, раз привыкли к старой студии. 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
Сообщения: 717
А почему должно быть по другому?

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


Последний раз редактировалось 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
Сообщения: 717
Давай с другого боку подойдём. Взглянем на приоритеты операций.
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
Сообщения: 717
Чем тебе 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
Сообщения: 1410
Т.е. вы хотите сдвигать адрес на определенную размерность? Может тогда просто temp += sizeof(int); ?


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

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 144
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 часов


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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