Нескольно простых вопросов о программировании AVR на Си.

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

потрудитесь объяснить, как именно не работает. что вы ожидаете получить и что получаете на самом деле?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Pnjom-Penb »

dm211 писал(а):Почему у меня не работает это?- :dont_know:

Код: Выделить всё

flash int x[4]={100,150,200,250};

k=sizeof (x);

А компилятор какой? :)))
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

Судя по flash, похоже на CodeVision.
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение dm211 »

Да, CV, и не могу получить количество цифр или символов массива.
Реклама
Эиком - электронные компоненты и радиодетали
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение dm211 »

ARV писал(а):потрудитесь объяснить, как именно не работает. что вы ожидаете получить и что получаете на самом деле?
Я хочу получить 4, а получаю-0
Реклама
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Siarzhuk »

dm211 писал(а):... не могу получить количество цифр или символов массива.
sizeof показывает размер объекта в байтах - т.е. в вашем случае размер массива будет равен sizeof(int) * 4.

Для получения размера в "попугаях" классика рекомендует так:

sizeof(x) / sizeof(x[0])

либо вариант для эстетов:

sizeof(x) / sizeof(*x)

Сермяжные практики, пошуршав по системным™ хидерам, находят тот или иной вариант countof, но чаще не найдя оного определяют его локально примерно так:

#define countof(__a) (sizeof(__a) / sizeof(*(__a)))

т.е. применительно для вашего случая использование будет выглядеть так:

k = countof(x);
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение hybroid »

Для эстетов более годный. :)))
Вот только вряд ли это ему поможет, судя по flash.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

Да, есть мнение, что flash в CodeVision "портит" sizeof.

Интересно было бы узнать у автора вопроса, что происходит, если это не flash, а обычный массив. Там работает?

В avr-gcc, кстати, такое у меня вполне корректно отрабатывает:

Код: Выделить всё

static const uint8_t alarmSym[] PROGMEM = {
  /* Empty rectangle */
  0b11111,
  0b00000,
  0b00000,
  // ... много других байтов (кстати, зачем у автора вопроса там int в аналогичном случае?)
  0b00000,
};

for (i = 0; i < sizeof(alarmSym); i++)
  ks0066WriteData(pgm_read_byte(&alarmSym[i]));
Здесь PROGMEM не непонятно что, а вполне обычный макрос (pgmspace.h):
#define PROGMEM __ATTR_PROGMEM__,
в свою очередь
#define __ATTR_PROGMEM__ __attribute__((__progmem__))
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение hybroid »

Недавно британские учёные доказали, что CV портит ДНК людей. После длительного воздействия CV на человека - его можно не спасти, он становится дельфином.
Единственный выход - быстрейшее избавление от патогена.
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение dm211 »

без flash тоже не работает-пробовал. Почему int ?-потому что там цифры :)
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение shindax »

Siarzhuk писал(а):sizeof показывает размер объекта в байтах - т.е. в вашем случае размер массива будет равен sizeof(int) * 4....
Cогласно "классике" sizeof x и sizeof( x ) - это разные вещи. sizeof( x ) для массива вернёт размер указателя, чем массив собственно и является, а sizeof x - уже размер массива 'x' в байтах, да и то, если это было определено на этапе компиляции. :) Как Вы написали, было-бы раньше. Сейчас, наверное, все компиляторы по новым стандартам уже пишут. С некоторых пор, стандарт Си сильно поменяли, как там теперь стало, читать надо. По крайней мере появился запрет на арифметику с указателями. Всё ради хомячков. Глядишь, и тип данных 'массив' введут. :) Лично я в данном случае вообще не вижу смысла в sizeof.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

dm211 писал(а):Почему int ?-потому что там цифры :)
Все они меньше 256, поэтому можно было бы unsigned char обойтись.
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение dm211 »

WiseLord писал(а):
dm211 писал(а):Почему int ?-потому что там цифры :)
Все они меньше 256, поэтому можно было бы unsigned char обойтись.
С unsigned char работает :shock: :beer:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

shindax писал(а):Cогласно "классике" sizeof x и sizeof( x ) - это разные вещи. sizeof( x ) для массива вернёт размер указателя, чем массив собственно и является, а sizeof x - уже размер массива 'x' в байтах, да и то, если это было определено на этапе компиляции. :)
будьте любезны ссылочку на эту классику - хотелось бы приобщиться к знаниям.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

dm211 писал(а):С unsigned char работает :shock: :beer:
CodeVision такой CodeVision...

2 shindax: вот, почитайте, одни из первых гуглящихся результатов по sizeof.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Siarzhuk »

shindax писал(а):С некоторых пор, стандарт Си сильно поменяли, как там теперь стало, читать надо. По крайней мере появился запрет на арифметику с указателями.
Как так запретили? :shock: Без малого половину функционала языка в печь? [мечтательно] Вот бы Бьярну такую смелость во времена былинные. ;-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Pnjom-Penb »

dm211 писал(а):Да, CV, и не могу получить количество цифр или символов массива.
Однажды читал на одном из форумов, что CV не умеет sizeof. Проверял примеры, иллюстрирующие его "работу", на своем экземпляре - действительно не работает. Правда, не во всех версиях.

P.S. Только не подумайте, что я им пользовался - содержал исключительно ради помощи страждущим.

P.P.S.
Rtmip писал(а):А еще более подробно можете написать, чтобы не читать по 100 страниц форума военного?
Я про то, какие еще "не все его недостатки"(CVAVR) и в чем именно не реализует стандарт?
Rtmip, Вы еще здесь? Как Вам эта прэлесть с sizeof'ом? :)))
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение prinv »

Подскажите пожалуйста.
При объявлении в cpp-шном проекте в Atmel Studio 6.2

Код: Выделить всё

#define FIFO( size )\
struct {\
	unsigned char buf[size];\
	unsigned char tail;\
	unsigned char head;\
}

FIFO(128) fifo;
получаю warning:

Код: Выделить всё

anonymous type with no linkage used to declare variable '<anonymous struct> fifo' with linkage [enabled by default]	
В чём ошибка?
Никакая контра не уйдёт от нас
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

Анонимная структура. Попробуйте дать ей какое-нибудь имя - поменять на struct fifo_t {, а дальше как есть.
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение prinv »

Большое спасибо, warning пропал :)
Никакая контра не уйдёт от нас
Ответить

Вернуться в «AVR»