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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

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

typedef struct{
	uint8_t turn; // перем. для вкл/выкл будильника on=1, off=0
	uint8_t hour;
	uint8_t min;
}alarm_t;

alarm_t alarm[7];
можна ли как-то умудриться чтобы нумерация элементов массива начиналась не с 0 а с 1 ?
это связанно с тем что нумерация будильников начинается с 1
Tell Me The Truth
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

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

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

Сообщение ARV »

нумерация - это понятие относительное. для чеговека она начинается с 1, а для программы - с 0. в чем проблема при выводе номера человеку делать i+1, в то время как i будет начинаться с 0?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

WiseLord писал(а):А смысл?
вот для чего, таким образом номер 1 будильника совпадает с номером 1 дня недели

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

void check_alarms(void){

	uint8_t i;

	if(f_new_min == 1){

		for (i = 1; i <=7; ++i) {

			if( day_of_week == i ){

				if( alarm[i].hour == hour && alarm[i].min == min ) BUZZER_ON;
			}

		}

		f_new_min = 0; // сбрасываем флаг новой минуты
	}

}
может оно и не совсем верно, но сделал массив будильников на один больше

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

typedef struct{
	uint8_t turn; // прем. для вкл/выкл будильника on=1, off=0
	uint8_t hour;
	uint8_t min;
}alarm_t;

	  alarm_t alarm[8];
Tell Me The Truth
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Ну.. тут можно было сделать и что-то вроде

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

void check_alarms(void)
{
   uint8_t i;

   if(f_new_min == 1){
      for (i = 0; i <7; ++i) {
         if( day_of_week == i + 1 )
            if( alarm[i].hour == hour && alarm[i].min == min ) BUZZER_ON;
      }
      f_new_min = 0; // сбрасываем флаг новой минуты
   }
}
и не тратить зря память.
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

есть ли принципиальная разница между этими записями применительно к циклу

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

for (i = 1; i <7; ++i)
и

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

for (i = 1; i <7; i++)
Tell Me The Truth
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Применительно к циклу принципиальной разницы нет, но первый вариант (с преинкрементом) может быть немного быстрее. Правда, в случае C++ и более сложных объектов, нежели int или какой там тип у i.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

я к тому...., при первом заходе в цикл инкремент ведь не делается ?
Tell Me The Truth
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

во-первых, откуда такое желание делать по-своему? ну вот какая разница, будет понедельник нулем или единицей? если ВСЕ сущности нумеровать ЕДИНООБРАЗНО, то они будут сохранять взаимное соответствие: НУЛЕВОЙ будильник для ПОНЕДЕЛЬНИКА, который ноль... а раньше было ПЕРВЫЙ будильник для ПОНЕДЕЛЬНИКА, который 1.

никакой разницы. но следовать стилю все-таки лучше, чем противостоять ему...

во-вторых, цикл for(A; B; C) всегда работает так:
- до начала цикла выполняется список действий А
- в начале очередной (в том числе самой первой) итерации проверяется условие В
- тело цикла отрабатывает только в том случае, если B не равно нулю
- после прогона тела цикла выполняется список действий С
- после этого снова проверяется условие В и т.д. до победного конца
Последний раз редактировалось ARV Пн дек 05, 2016 19:35:24, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение prinv »

Конкретно в цикле - без разницы какой вид инкремента использовать, пост или пре. В других местах разница может критичной.
Никакая контра не уйдёт от нас
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

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

Сообщение ptr128 »

WiseLord писал(а):Применительно к циклу принципиальной разницы нет, но первый вариант (с преинкрементом) может быть немного быстрее
Ложное утверждение. Постинкремент и преинкремент различаются тогда и только тогда, когда они используются в выражении, содержащем еще какие-либо члены выражения. Если все выражение состоит только из пост- или пре- (как в примере) , то компилятор сгенерирует один и тот же код для обеих случаев.

По синтаксису С, выбор пост- или пре- инкремента на результирующее значение инкрементируемой или декрементируемой переменной не влияет. А влияет только на то, какое значение будет использовано далее в выражении - до инкремента или после. Если же значение вообще не используется, то и разницы нет.
Последний раз редактировалось ptr128 Пн дек 05, 2016 19:36:31, всего редактировалось 1 раз.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

иногда воспитание утомляет - пришлось исправить и это сообщение... :roll: :))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение WiseLord »

ptr128 писал(а):Ложное утверждение
Вообще-то я там дальше написал, для каких случаев это не ложно. В C++, если инкремент происходит не с простой переменной, а с экземпляром класса (для которого перегружен оператор инкремента), разница может быть. Связано с копированием экзепляра объекта.

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

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

Сообщение Siarzhuk »

ARV писал(а):ну вот какая разница, будет понедельник нулем или единицей?
Коллега походу покамест не прочуствовал, что этот ноль не просто индекс - а базовый принцип тутошнего Мироздания. Это как таблицу Пифагора называть таблицей умножения. А какие "стихи" выходят из индексов под магией двух делений - целочисленного и по-модулю - ничего лишнего! :)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Siarzhuk писал(а):А какие "стихи" выходят из индексов под магией двух делений - целочисленного и по-модулю
и какие же? продекламируйте, прошу вас! :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение Siarzhuk »

ARV писал(а):и какие же? продекламируйте, прошу вас! :)
[напыщенно так]

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

buffer[index / 8] & (1 << index % 8)
чем не ноктюрн?
[/напыщенно так]
;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

Сообщение WiseLord »

Что-то вроде прохода по битам элементов массива. Где ликовать - тоже не очень ясно.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Siarzhuk писал(а):

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

buffer[index / 8] & (1 << index % 8)
На ночь такой "код" лучше не читать...
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

в цикле происходит зависание

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

	for (i = 0; i < 6; ++i) {
		eeprom_read_block( &alarm[i], &cp_alarm[i], sizeof(alarm) );
	}
в чем может быть ошибка ?
Tell Me The Truth
Ответить

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