Страница 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
Спасибо! Буду это иметь ввиду!
Ну а всётаки для укрепления знаний - если есть другие функции, то как это работает "нижеописанное" Что будет считаться приоритетным? " что глобальное и что локальное"
Или есть разница в том что, объявил до функции, а присвоил значение внутри функции, и после присвоения значения, переменная считается уже локальной.