Страница 1 из 3
Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 17:58:58
RUNA
Здравствуйте!
Вот пришлось разбираться с кодом на C. Компилятор ругается на команды.
void __init(void)
{
#define R24V PORTA.6 //
#define R48V PORTA.4 //
#define R96V PORTA.7 //
#define R192V PORTA.5 //
unsigned char temp;
temp=PINC;
temp= (temp & 0b00001100);
switch (temp)
{
case 0x00:
{
R24V=0;
R48V=1;
R96V=1;
R192V=0;
break;
}
case 0x08:
{
R24V=1;
R48V=0;
R96V=1;
R192V=0;
break;
}
....
Выдает ошибку
error: expected ';' before numeric constant
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 18:52:50
Ivanoff-iv
фигурные скобки не нужны, тут принцип не как у иф/елзе а как при переходе на метку (если бы брейков не было код бы дальше пошел выполняться)
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 19:49:44
RUNA
Скобки убрал, та же ерунда.
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 19:59:12
Ivanoff-iv
должно быть так:
switch (переменная)
{
case число:
код;
код;
break;
case другое_число:
код;
код;
break;
};
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:01:50
Аlex
Выложите весь код switch-case'а и покажите на какую строку ругается компилятор.
По поводу скобок. Они допускаются к использованию, но в данном случае в них нет необходимости.
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:02:54
RUNA
Да, именно так я и сделал. Но, ругается не на скобки а на ";"
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:04:32
Аlex
PS: Да, и какой компилятор ? Б.м. код взят из CV, а пытаетесь его прогнать через какой-либо другой. Тогда, с данным кодом, это не прокатит.
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:05:29
Ivanoff-iv
Alex да, только если их сделать как у ТС, break сможет выкинуть только из внутренней скобки, а не из свитча.
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:10:07
RUNA
void __init(void)
{
#define R24V PORTA.6 //
#define R48V PORTA.4 //
#define R96V PORTA.7 //
#define R192V PORTA.5 //
unsigned char temp;
temp=PINC;
temp= (temp & 0b00001100);
switch (temp)
{
case 0x00:
{
R24V=0;
R48V=1;
R96V=1;
R192V=0;
break;
}
case 0x08:
{
R24V=1;
R48V=0;
R96V=1;
R192V=0;
break;
}
case 0x04:
{
R24V=1;
R48V=1;
R96V=1;
R192V=0;
break;
}
case 0x0C:
{
R24V=1;
R48V=1;
R96V=1;
R192V=1;
break;
}
}
Ругается на все что выделено
Ругань от компилятора
../__init.c:33: error: expected ';' before numeric constant
../__init.c:41: error: expected ';' before numeric constant
../__init.c:42: error: expected ';' before numeric constant
../__init.c:43: error: expected ';' before numeric constant
../__init.c:44: error: expected ';' before numeric constant
../__init.c:49: error: expected ';' before numeric constant
../__init.c:50: error: expected ';' before numeric constant
../__init.c:51: error: expected ';' before numeric constant
../__init.c:52: error: expected ';' before numeric constant
../__init.c:57: error: expected ';' before numeric constant
../__init.c:58: error: expected ';' before numeric constant
../__init.c:59: error: expected ';' before numeric constant
../__init.c:60: error: expected ';' before numeric constant
}
Добавлено after 4 minutes 9 seconds:
Мож какую нибудь библиотеку надо подключить?
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:13:34
Ivanoff-iv
В CVAVR такой код скомпилился без проблем
switch (Byte) {
case 0x00: break;
case 0x08: break;
};
дак у тебя, похоже это и без кейса не сработает - проверь
Добавлено after 45 seconds:
в смысле - эта ошибка к кейсу не относится
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:20:38
Аlex
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3112172#p3112172"]break сможет выкинуть только из внутренней скобки, а не из свитча.[/uquote] Вы уверены в своём ответе ?
RUNA, компилятор какой ?
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:22:29
Ivanoff-iv
давай весь код, интересует какие и где переменные объявлены (похоже он имена твоих переменных рассматривает частями)
Добавлено after 33 seconds:
про брейк сейчас проверю
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:25:32
Аlex
По всей видимости, код с синтаксисом CVAVR'а пытаются скомпилировать другим более вменяемым компилятором.
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:37:15
Ivanoff-iv
да, кидает, куда надо...
Добавлено after 2 minutes 12 seconds:
А что не нравится тебе и более вменяемому компилятору?
Добавлено after 1 minute 43 seconds:
мне вот, было, скобки не понравились , но это не они (да и они оказались правильны) (а мне наука)
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:38:52
Siarzhuk
PORTA.6 - интересный такой С, что позволяет идентификаторы, начинающиеся с цифр. Смотрите примеры к вашему компилятору как доступ к полям порта осуществляется и правьте соответственно.
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 20:43:34
Ivanoff-iv
чета я ваще аслеп

то, что искал - прямо под носом лежит!
всё, пора спать а то уже второй явный косяк и оба сегодня
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 21:22:45
RUNA
Компилятор WinAVR-20100110 для AStudio
Добавлено after 2 minutes 49 seconds:
Весь код был создан под CVAVR 1.25.9 . Пытаюсь переделать под AStudio 4
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 21:42:04
Ivanoff-iv
Да, в CVAVR так и пишется PORTA.6 ,а в других компилятора может быть по другому
Добавлено after 3 minutes 42 seconds:
RUNA у тебя в дефайнах косяк, потому так по коду и раскидано
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 21:47:21
RUNA
Где мне найти описалова на WinAVR-20100110 а, то найти не могу.
Ткните носом где взять. Уже целый день сижу с это проблемой, а решить не могу.
Re: Помогите, не понимаю Switch case
Добавлено: Вт май 23, 2017 21:56:36
Ivanoff-iv
возми готовый проект под свой компилятор и посмотри как там к конкретной ноге порта обращаются
Добавлено after 1 minute 13 seconds:
или сам попробуй по разному (без точки например)
Добавлено after 1 minute 35 seconds:
или в дефайны впиши только номера битов,а внизу уже соберёшь значение
Добавлено after 4 minutes 23 seconds:
примерно так:
#define R24V 6 //
#define R48V 4 //
#define R96V 7 //
#define R192V 5 //
а внизу сначала
PORTA &= 0b00001111; // для очистки 4-7 ног порта А
а затем
PORTA |=(1<<R24V)|(1<<R96V); //для записи 1 в нужные места
причины правок — добавил комментарии, исправил написание побитового или.