Страница 241 из 421

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн фев 18, 2013 18:47:31
Аlex
Потому, что после выполнения каждого условия, программа попадает на следующее, и оно выполняется.
Используйте switch-case или else if.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн фев 18, 2013 21:14:57
unalex
мне кажется изза того, что при приеме нового бита переменная temp сбрасывается, попробуйте объявить ее как static

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн фев 18, 2013 22:11:00
ibiza11
+1 Alex и +1 unalex :) оба правы.

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

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
	static unsigned char temp;
	switch(temp)
	{
		case 0:
			ru = UDR;
			temp = 1;
			break;
		case 1:
			gu = UDR;
			temp = 2;
			break;
		case 2:
			bu = UDR;
			temp = 0;
			break;
		default:
			break;
	}
}

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн фев 18, 2013 22:32:56
Аlex
temp у него явно не локальная, т.к. в области видимости ф-ии, моим зрением, не обнаруживается :))
Valek3306 писал(а):

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

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
if(temp == 0){temp = 1; ru = UDR; };
if(temp == 1){temp = 2; gu = UDR; };
if(temp == 2){temp = 0; bu = UDR; };
}
Из этого следует, что она не может сбрасываться :))

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 06:11:12
unalex
мыслю абстрактно - не вседа в форум пастят весь кусок функции
Valek3306 писал(а):каждая посылка заносятся в переменную ru
а вот одну мою опечаточку - бит != байт заметил только что 8)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 07:15:18
ibiza11
В общем, думаю автор уже разобрался. :)

PS/ Вопрос про точку с запятой в конце строки:
if(temp == 0){temp = 1; ru = UDR; } ;
Это допустимо? разве круглые скобки не завершают оператор if?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 10:37:44
Совесть
Этот вопрос вы могли бы проверить сами, в течении пары минут. В данном случае все корректно.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 11:09:56
unalex
если компилятор не ругается - это не значит корректно
точка с запятой там не нужна

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 12:39:09
Совесть
"если компилятор не ругается - это не значит корректно" - а что не так в этой записи? чему она противоречит? вашему стилю написания программы?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 12:40:47
ibiza11
Совесть писал(а):Этот вопрос вы могли бы проверить сами, в течении пары минут.
Мог бы - не спрашивал бы. Не было компилятора под рукой. Сейчас проверил - ни ошибок ни предупреждений.
Но смысл так писать? Новый стандарт Си?)))

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 12:53:18
Совесть
В чем отличие от используемого ВАМИ стандарта? В каком из стандартов Си данная запись будет ошибочна?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 12:53:51
Аlex
Точка с запятой является разделителем. Если разделять нечего, то этот символ является пустым оператором. Его можно ставить в любом "пустом" месте, между конструкциями.
Так-же, прокатит такая конструкция:

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

if(....)
   ....
else
   ;
Это если не хочется ставить НОП, и не хочется else сносить. Компилятором он (else) будет отброшен.
Так что стандарт не запрещает его ставить ни после скобок, ни до, ни стопицот раз подряд.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 13:21:34
ibiza11
Совесть писал(а):В чем отличие от используемого ВАМИ стандарта? В каком из стандартов Си данная запись будет ошибочна?
Вы случайно по национальности не еврей? Я вопросы задал, Вы, не ответив на мои, мне свои задаете.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 13:54:18
Совесть
Ок. Отвечу.
"Но смысл так писать?" - это всего лишь стиль записи, кому как удобнее. Каждый выбирает для себя свой, либо подстраивается под требуемый.
"Новый стандарт Си?)))" - чтобы ответить на этот вопрос, надо узнать ваши познания в стандартах Си, т.е. относительно чего он может быть новым. Ради чего и были заданы два наводящих вопроса.
Теперь вы на мои ответите?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 14:47:36
ibiza11
Спасибо.
На Ваши тоже отвечу.
В чем отличие от используемого ВАМИ стандарта? В каком из стандартов Си данная запись будет ошибочна?
От используемого мной стандарта отличий нет.
Согласно используемому мной стандарту ошибок при добавлении точки с запятой после закрывающихся фигурных скобок не будет (этого я не знал до сегодняшнего дня).
В каком конкретно стандарте Си данная запись будет ошибочна я не знаю, поскольку знаком только со стандартом С89 и стараюсь писать код не выходящий за рамки вышеуказанного стандарта. Но поскольку остальные стандарты поддерживают C89, а в С89 эта запись не является ошибочной, то думаю и в других не вызовет ошибок.

Вообще говоря стандарт не запрещает использовать в этом месте разделительную точку с запятой, но и нет ни одного указания к применению подобной конструкции, кроме раздела 3.6.3 Expression and null statements стандарта, в котором точка с запятой рассматривается как пустой оператор. Смысла ставить пустой оператор в том месте спорного кода я не вижу. (Может быть Вы видите?) Из этого можно сделать вывод, что автор тех спорных строк кода Valek3306 либо прочитал стандарт C89 и нашел в нем недосказанный момент и использует его повсеместно, поскольку ему так удобнее или привычнее, либо плодит эту конструкцию по незнанию, думая, что именно так и нужно и по-другому работать не будет. Не знаю как Вам, но мне кажется более достоверным второй вариант. Поэтому и был задан соответствующий вопрос, дабы обратить внимание в первую очередь автора на возможные пробелы в знаниях синтаксиса языка.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 15:13:53
Совесть
О целесообразности речи не велось. Говорилось только о допустимости. Да и современные компиляторы, на мой взгляд, на много умнее тех кто ими пользуется и вполне вероятно спокойно проигнорируют данную запись. По крайней мере используемый мной так и делает.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 15:42:53
ibiza11
Согласен. Речь велась о допустимости. Выяснили, что допустимо. Осталось выяснить, если возможно, почему именно так пишет автор.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 17:46:44
unalex
Совесть писал(а):"если компилятор не ругается - это не значит корректно" - а что не так в этой записи? чему она противоречит? вашему стилю написания программы?
ну конечно, проще напихать точек с запятой, а компилятор их сам уберет в процессе оптимизации


если вы считаете это правильным подходом, то флаг вам в руки

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 19:03:31
ELcat
Главное не писать так:

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

if (a==0); b=1;
Вот в этом случае компилятор тоже не ругнётся, но действие будет выполняться не зависимо от условия.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт фев 19, 2013 19:09:56
unalex
Спойлеркоммент удален, чтобы дискуссия не переросла во флуд