Страница 1 из 1

switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 12:04:07
king-live
Доброго времени суток! Почему не работает код. Только один проход ветвления. Нету бесконечного цикла чтобы входила по очереди в case.

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


int x;
int main()
while(1)
{
switch(x)
{
case0:...
case1:...
case2:...
}
x=x+1;
}
}

Спасибо!

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 12:06:19
ploop
В конце кейса что?

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 12:09:34
king-live
....
case0: ....break;
.....
.....
ну в конце можно ещё дописать
if (x==3)
x=0;
.....

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 12:52:43
ChipKiller
king-live писал(а):Почему не работает код.

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

int x;
int main()
while(1)
{
switch(x)
.....
... наверное из-за невнимательности :)

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

int x;
int main()
{ 
while(1)
{
switch(x)
.....

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 14:53:50
king-live
Писал на форуме на скорую руку, поэтому и упустил "{" ниже пример.

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

#include <avr/io.h>
#define F_CPU 4000000UL
#include <util/delay.h>

int a;
int b;
int c;
int d;
int x;

int main ()
{
a=1;
b=2;
c=3;
x=0;
while(1)
	{
	switch(x)
		{
		case 0:
			  break;
		
		case 1:
			{
			 d=a+b;
			  break;
			}
		case 2:
			{
			d=a+c; break;
			}
		case 3:
			{
			d=b+c; break;
			}
		case 4:
			{
			d=d+b; break;
			}
		case 5:
			{
			d=c+b; break;
			}
		}
	x=x+1;
	}
}
Пошагово в AVRStudio хотел проверить изменения значений переменных. Для опыта. Но не входит даже в цикл.

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 15:00:59
ploop
Хоть я и не силён в Си, но вижу, что у вас X чётко задан и равен нулю. Для компилятора остальной код просто не имеет смысла, поэтому отбрасывается.

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 15:57:43
king-live
А какже "x=x+1;" значения x меняется. Но цикла нет всёравно.

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 16:02:48
Goodefine
А что будет после x=5? Его иногда и обнулять надо...

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 16:06:16
Pavel V.
Надо листинг смотреть, может соптимизировалось что-нибудь :) Попробуй объявить x как volatile.
К switch добавь ветку default, в ней же можно обнулять.

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 16:09:52
ellioh
Оно не volatile, как справедливо замечают выше. Выхода из цикла нет, значит, нигде более x не используется. Могло соптимизировать.

И вот тут есть простой совет: выключите оптимизацию!

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 16:23:52
king-live
Еслибы цикл изначально работалбы, то конечно х обнулилбы после 5, но процесс изначально не стал работать! Если x не равно 0 а равно другому значению до 6. то в цикл входит, расчёт переменной d ведётся. Но опятьже один проход. и переменная х по листингу не изменяется т,е, до строчки х=х+1; не доходит.

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 17:37:37
avreal
Да какая разница -- ни одна из указанных переменных никому вообще не нужна. Компилятору плевать. будет ли кто-то смотреть дизасм или в отладчике крутиить. Он не видит эффекта от кода -- выбрасывает и имеет полное право. Добавьте где-то в цикле PORTB = d;, чтобы он понял, что вычисления хоть кому-то нужны, и посмотрите опять.

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 18:44:05
md5sum
Оптимизатор посмотрев код и увидев, что значение d нигде не используется - выкинул весь switch нафиг :) Код работает при компиляции с ключем -O0

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 19:25:17
ellioh
Кстати, компилятору-то рукоплещу. Он выбросил код, меняющий глобальные переменные, на основании трёх фактов:
1. В рамках цикла факт изменения переменной ни на что не влияет.
2. Цикл вечный, то есть не по прерываниям больше ничего в программе выполняться не будет.
3. Глобальная переменная -- не volatile, то есть скрытым образом (сиречь в прерывании) изменяться и использоваться не может.

Вообще должен сказать, что avr-gcc в плане оптимизации меня в целом скорее радует. Иногда, конечно, загнёт что-то странное, но в среднем выходит достойно.

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 19:29:37
king-live
Да окозалось намного сложнее! Если что-то нигде не используется, то и компилятор это выкидывает "нафиг" - как и было сказанно. Умно устроенно. Добавил PORTB и всё заработало как надо! Спасибо! Единственно почемуто иногда окно "Watch" где можно наблюдать за изменениями значений переменных не работает. Само окно с переменными выходит но изменений в значениях переменных не наблюдается.

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

#include <avr/io.h>
#define F_CPU 4000000UL
#include <util/delay.h>

int a;
int b;
int c;
int d;
int x;

int main ()
{
DDRB=0xFF;
a=1;
b=2;
c=3;
x=0;
while(1)
	{
	switch(x)
		{
		case 0:
			  break;
			
		case 1:
			{
			 d=a; break;
			}
		case 2:
			{
			d=a+1; break;
			}
		case 3:
			{
			d=a+2; break;
			}
		case 4:
			{
			d=a+3; break;
			}
		case 5:
			{
			d=a+4; break;
			}
		
		}
	x=x+1;
	PORTB=d;
	if (x==6)
	x=0;
	}
}

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 19:56:08
ARV
с локальными переменными в отладчике студии непросто: если они регистровые, а скорее всего, так оно и есть, отладчик не может их показать... если вы сделаете переменные глобальными, да еще и static (или лучше volatile) - вы сможете видеть их содержимое в окне Watch

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 19:58:12
ploop
Да окозалось намного сложнее! Если что-то нигде не используется, то и компилятор это выкидывает "нафиг" - как и было сказанно. Умно устроенно.
Если программировать "по большому" - это нормальное явление. Там и не такие фишки выползают. Поэтому и считаю, что если писать для МК на ЯВУ, то надо досконально знать особенности используемого компилятора...

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 20:25:47
king-live
если вы сделаете переменные глобальными,
А разве я не объявил переменную - глобальной (до функции). Я считал, что если переменная объявляется до какой нибудь функции, то внутри функции переменная считается глобальной. Или есть разница в том что, объявил до функции, а присвоил значение внутри функции, и после присвоения значения, переменная считается уже локальной.

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 20:30:41
ARV
когда у вас кроме main нет никаких функций, компилятор в целях оптимизации не делает разницы между локальными и глобальными переменными - ее ведь и нет, не так ли? локальные-то прячутся от сторонних функций. а когда их нет - от кого прятаться? зато локальные лучше оптимизируются... вот у вас и выходят чудеса в решете :)

Re: switch-case Как бесконечный цикл с ветвлением!

Добавлено: Пт апр 22, 2011 20:46:54
king-live
Спасибо! Буду это иметь ввиду!
Ну а всётаки для укрепления знаний - если есть другие функции, то как это работает "нижеописанное" Что будет считаться приоритетным? " что глобальное и что локальное"
Или есть разница в том что, объявил до функции, а присвоил значение внутри функции, и после присвоения значения, переменная считается уже локальной.