реклама на сайте
подробности

 
 
> вопрос по Си небольшой.
Метценгерштейн
сообщение Sep 6 2006, 06:13
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



У меня организован такой цикл case:

switch(State) {
...
case IDLE: // этот код выполняется если снято с охраны
off(LED);

if( one_wire_main () ) { //если что-то приложили (ключ)

if(USER_KEYS()) {
State = IDLE_HAS_KEY;
}
}

break;

case IDLE_HAS_KEY:
...

Вопрос- вот иду я по проге, приложили USER_KEYS, я сразу прыгаю на метку IDLE_HAS_KEY? Или дохожу до оператора break, потом компилятор анализирует что там было раньше и после break прыгает уже на метку?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Sep 6 2006, 06:24
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Что значит цикл case???

на case IDLE_HAS_KEY: вы попадете только когда оператор switch(State) выполнится заново и при этом State будет = IDLE_HAS_KEY

switch - это всего лишь переключатель в зависимости от State делается JUMP в нужную точку

если хотите в этой же итерации попасть туда используйте goto

например так:
Код
switch(State) {
...
case IDLE: // этот код выполняется если снято с охраны
  off(LED);

  if( one_wire_main () ) { //если что-то приложили (ключ)

    if(USER_KEYS()) {
      State = IDLE_HAS_KEY;
      goto _IDLE_HAS_KEY:
    }
  }

break;


case IDLE_HAS_KEY:
_IDLE_HAS_KEY:
...


Сообщение отредактировал KRS - Sep 6 2006, 06:28
Go to the top of the page
 
+Quote Post
Harvester
сообщение Sep 6 2006, 06:55
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(KRS @ Sep 6 2006, 10:24) *
Что значит цикл case???

на case IDLE_HAS_KEY: вы попадете только когда оператор switch(State) выполнится заново и при этом State будет = IDLE_HAS_KEY

switch - это всего лишь переключатель в зависимости от State делается JUMP в нужную точку

если хотите в этой же итерации попасть туда используйте goto

например так:
Код
switch(State) {
...
case IDLE: // этот код выполняется если снято с охраны
  off(LED);

  if( one_wire_main () ) { //если что-то приложили (ключ)

    if(USER_KEYS()) {
      State = IDLE_HAS_KEY;
      goto _IDLE_HAS_KEY:
    }
  }

break;


case IDLE_HAS_KEY:
_IDLE_HAS_KEY:
...


Совет правильный, но вообще-то использование команды goto является плохим стилем программирования и очень затрудняет отладку. Лично я построил бы диспетчер следующим образом:
Код
do{

  State = IDLE;
  off(LED); // этот код выполняется если снято с охраны
  ...

  if( one_wire_main ()  && USER_KEYS())  //если приложили правильный ключ
    State = IDLE_HAS_KEY;

  if( ... ) //другое событие
    State = ...;

  if( ... ) //n-е событие
    State = ...;

}while(State == IDLE);

switch(state)
{
  case IDLE_HAS_KEY:
    ...
    break;

  case ...:
    ...
    break;
  
  default:
    ...
    break;
}

Ну и все это, разумеется, крутится в бесконечном цикле.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 6 2006, 08:29
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



ясно, с этим вроде разобрался, вот ещё не ясно как лучше сделать.
Уже, наверное, понятно, что я пишу под ключ- таблетку. У меня есть мастер ключ, и есть юзер ключи. Теперь я хочу, чтобы если приложил кратковременно мастер, просто поменяло состояние на другое, а если его удерживаю хотя бы 5 сек, сразу попадаю в др. подпрограмму записи USER ключа. Как это лучше реализовать?

if( MasterKey () ) { //здесь- что, если приложен мастер
//здесь опишем процесс, записи новых ключей, только из IDLE
//если прижали мастер на 5 сек

CntT0= 0;
while (CntT0 !=95) //если в теч. 5 сек. приложили мастер, вызываю запись USERa
...
WRITE_KEY();
...
State = IDLE_HAS_KEY;
...

State = IDLE_HAS_KEY; это состояние, куда я должен попать если кратковременно приложил- отпучтил ключ, а если 5 сек. удерживаю, то в ф-ю WRITE_KEY();

как бы это завернуть покрасивше?

Сообщение отредактировал Метценгерштейн - Sep 6 2006, 08:32
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Sep 6 2006, 09:22
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



так корректно будет?

CntT0= 0;
if( !one_wire_main () ) { //если отпустили ключ
if (CntT0 !=95) //если не досчитал до 5 сек., то меняю сост. на IDLE_HAS_KEY
State = IDLE_HAS_KEY;
else
WRITE_KEY();
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Метценгерштейн   вопрос по Си небольшой.   Sep 6 2006, 06:13
|- - Harvester   Цитата(Метценгерштейн @ Sep 6 2006, 12:29...   Sep 6 2006, 11:41
|- - Метценгерштейн   немного конкретизирую задачу- при приложении масте...   Sep 8 2006, 07:35
|- - Harvester   Цитата(Метценгерштейн @ Sep 8 2006, 11:35...   Sep 8 2006, 12:41
|- - Метценгерштейн   while ( MasterKey () ) { //пока ещё приложен ключ ...   Sep 11 2006, 10:23
|- - PaulS   Цитата(Метценгерштейн @ Sep 11 2006, 14:2...   Sep 11 2006, 10:54
- - Shurmas   Пример с сетью 1-wire с "таблеткой" и др...   Sep 11 2006, 13:41
|- - Метценгерштейн   ещё вопрос по Си (простой) в таком виде case ARME...   Sep 14 2006, 11:17
- - dezzer   ЦитатаНе понятно по скобкам, этот таймер у меня вн...   Sep 14 2006, 11:44
|- - Метценгерштейн   всё правильно, я немного не так выразился, по прер...   Sep 14 2006, 12:02
|- - _Bill   Цитата(Метценгерштейн @ Sep 14 2006, 15:0...   Sep 14 2006, 12:21
- - xemul   2 Метценгерштейн имхо, было бы неплохо нарисовать ...   Sep 14 2006, 15:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 19:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016