State_Maschine

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Здравствуйте, Уважаемый All!

Очень хочется узнать, как наиболее эффективно в С реализовать subj. Простейший
прием через оператор switch мне известен, но ведь он, похоже, работает
перебором всех case-ов. А это проигрыш в скорости. Также интересует -
кто-нибудь делал класс subj-а для C++? Поделитесь пожалуйста.

Всего Вам Хорошего
Ольга


Re: State_Maschine
Hello, Olga!

(03 Июл 06 23:42), Olga Nonova писАл All:
 ON> Очень хочется узнать, как наиболее эффективно в С реализовать subj.
 ON> Простейший прием через оператор switch мне известен, но ведь он,
 ON> похоже, работает перебором всех case-ов.
 до тех пор пока не сработает, дальше брейк.
 ON>  А это проигрыш в скорости.
 Я знаю только два способа. Второй это массив ссылок на функции. Также хотелось
бы узнать еще способы.

ЗЫ.
 Удивительно, но именно сегодня и мне понадобилась машина состояний.
Оказывается уже вчера:)

With best regards, Igor.        Time: 01:21        Date: 04 Июл 06

Re: State_Maschine
Hello, Igor!
You wrote to Olga Nonova on Tue, 04 Jul 2006 00:21:58 +0400:

 IU>  Я знаю только два способа. Второй это массив ссылок на функции. Также
 IU> хотелось бы узнать еще способы.
GCC позволяет делать указатели на метки, и делать goto на эти указатели.
То есть, можно сделать массив ссылок на метки.
Примерно так:

void *states[] = { &&a, &&b, &&c };
for(;;) {
  goto states[i];
  ...
  a: do_state_1();
  ...
  continue;
  b: do_state_2();
  ...
  continue;
  c: do_state_3();
  ...
  continue;
}


Впрочем, он сам умеет раскрывать switch в такой массив, соответственно не
надо
пользоваться нестандартными расширениями C.

With best regards, Serg.



Re: State_Maschine

X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Olga Nonova!
You wrote in conference fido7.ru.embedded to All on Mon, 3 Jul 2006 19:42:45
+0000 (UTC):


 ON> Очень хочется узнать, как наиболее эффективно в С реализовать subj.
 ON> Простейший прием через оператор switch мне известен, но ведь он,
 ON> похоже, работает перебором всех case-ов.

Откройте для себя оператор break

dima
http://www.dorlov.no-ip.com
http://dimorlus.dynalias.com




Re: State_Maschine
Привет, Olga !


 03 Jul 06 , 23:42  Olga Nonova писал к All:

ON> Очень хочется узнать, как наиболее эффективно в С реализовать subj.
ON> Простейший прием через оператор switch мне известен, но ведь он,
ON> похоже, работает перебором всех case-ов. А это проигрыш в скорости.

Дизассеблировать скомпилированный с оптимизацией код пробовали?
Попробуйте. Много интересного увидите.


.                                            С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev
... Спаривание электронов под контролем принципа Паули

Re: State_Maschine
Hi Olga!

03 Jul 06 23:42, Olga Nonova wrote to All:

 ON> Очень хочется узнать, как наиболее эффективно в С реализовать subj.
 ON> Простейший прием через оператор switch мне известен, но ведь он,
 ON> похоже, работает перебором всех case-ов. А это проигрыш в скорости.
 ON> Также интересует - кто-нибудь делал класс subj-а для C++? Поделитесь
 ON> пожалуйста.

    ага. перебором. сразу видно большого знатока языка Це.

        movl    .L8(%eax), %eax
        jmp     *%eax
....

.L8:
        .long   .L2
        .long   .L3
        .long   .L4
        .long   .L2
        .long   .L2
        .long   .L2
        .long   .L5
        .long   .L6
        .long   .L7

...

.L3:
        subl    $12, %esp
        pushl   $.LC0
        call    puts
        addl    $16, %esp
        jmp     .L2
...

.L2:
        leave
        ret


    Исходный текст:

 switch( i )
 {
         case 1: puts("1"); break;
         case 2: puts("2"); break;
         case 6: puts("6"); break;
         case 7: puts("7"); break;
         case 8: puts("8"); break;
 }


                                                   Slav.

Re: State_Maschine
Hello, Olga!
You wrote to All on Mon, 3 Jul 2006 19:42:45 +0000 (UTC):

 ON> Здравствуйте, Уважаемый All!

 ON> Очень хочется узнать, как наиболее эффективно в С реализовать subj.
 ON> Простейший прием через оператор switch мне известен, но ведь он,
 ON> похоже, работает перебором всех case-ов. А это проигрыш в скорости.

Необязательно.
Например в Такскинге для 51-х - можно было переключать прагмой режим работы
свитча сравнением/по таблице.


With best regards,
Alexandr Torres.  E-mail: snipped-for-privacy@yahoo.com
[ Жамству бой !]



Re: State_Maschine
Здравствуйте, Уважаемый Alexandr!

Tue Jul 04 2006 12:58, Alexandr Torres wrote to Olga Nonova:

 ON>> Простейший прием через оператор switch мне известен, но ведь он,
 ON>> похоже, работает перебором всех case-ов. А это проигрыш в скорости.

 AT> Hеобязательно.
 AT> Hапример в Такскинге для 51-х - можно было переключать прагмой режим
 AT> работы  свитча сравнением/по таблице.

Во втором случае, по-видимому становилось обязательным требование, чтобы
выражение при switch принимало значения 0,1,2,3... Т.е. индекс для таблицы
jamp-ов. Иначе я не представляю, как пользоваться такой таблицей.

Всего Вам Хорошего
Ольга
 


Re: State_Maschine
Hello, Olga!
You wrote to Alexandr Torres on Tue, 4 Jul 2006 09:12:38 +0000 (UTC):

 ON> Здравствуйте, Уважаемый Alexandr!

 ON> Tue Jul 04 2006 12:58, Alexandr Torres wrote to Olga Nonova:

 ON>>> Простейший прием через оператор switch мне известен, но ведь он,
 ON>>> похоже, работает перебором всех case-ов. А это проигрыш в скорости.

 AT>> Hеобязательно.
 AT>> Hапример в Такскинге для 51-х - можно было переключать прагмой режим
 AT>> работы  свитча сравнением/по таблице.

 ON> Во втором случае, по-видимому становилось обязательным требование,
 ON> чтобы выражение при switch принимало значения 0,1,2,3...

В стейт-машине, как правило, по другому и не бывает.

With best regards,
Alexandr Torres.  E-mail: snipped-for-privacy@yahoo.com
[ Жамству бой !]



Re: State_Maschine
Здравствуйте, Уважаемый Alexandr!

Tue Jul 04 2006 13:37, Alexandr Torres wrote to Olga Nonova:

 AT>>> работы  свитча сравнением/по таблице.

 ON>> Во втором случае, по-видимому становилось обязательным требование,
 ON>> чтобы выражение при switch принимало значения 0,1,2,3...

 AT> В стейт-машине, как правило, по другому и не бывает.

Однако, не знаю как в просто С, но в С++ нет никаких ограничений на тип и
значения выражения при switch. Именно такая универсальность и вынуждает
компилятор реализовать перебор со сранением, что для ембеднутых устройств не
есть хорошо.

По поводу "по другому не бывает" о нумерации состояний как 0,1,2..., то в
макроассемблере есть чрезвычайно изящное решение с использованием indirect
jmp-а, а регистр-указатель принимает значения непосредственно адресов меток
перехода. Имена меток и несут в себе название стейтов. При этом не надо
никаких таблиц jmp-ов и перекодировок из индексов в физические адреса. Жаль,
что ничего подобного в С реализовать похоже нельзя.

Всего Вам Хорошего
Ольга


Re: State_Maschine
Hello, Olga!
You wrote to Alexandr Torres on Tue, 4 Jul 2006 10:45:28 +0000 (UTC):

 ON> Здравствуйте, Уважаемый Alexandr!

 ON> Tue Jul 04 2006 13:37, Alexandr Torres wrote to Olga Nonova:

 AT>>>> работы  свитча сравнением/по таблице.

 ON>>> Во втором случае, по-видимому становилось обязательным требование,
 ON>>> чтобы выражение при switch принимало значения 0,1,2,3...

 AT>> В стейт-машине, как правило, по другому и не бывает.

 ON> Однако, не знаю как в просто С, но в С++ нет никаких ограничений на тип
 ON> и значения выражения при switch.

Дело не в ограничениях на тип в свитче, а на ДНК разработчика, пишущего
стей-машину.

 ON> По поводу "по другому не бывает" о нумерации состояний как 0,1,2..., то
 ON> в макроассемблере есть чрезвычайно изящное решение с использованием
 ON> indirect jmp-а, а регистр-указатель принимает значения непосредственно
 ON> адресов меток перехода. Имена меток и несут в себе название стейтов.
 ON> При этом не надо никаких таблиц jmp-ов и перекодировок из индексов в
 ON> физические адреса. Жаль, что ничего подобного в С реализовать похоже
 ON> нельзя.

И не надо самому, компилятор все сделает, если он не убогий.

With best regards,
Alexandr Torres.  E-mail: snipped-for-privacy@yahoo.com
[ Жамству бой !]



Re: State_Maschine
Здравствуйте, Уважаемый Alexandr!

Tue Jul 04 2006 15:23, Alexandr Torres wrote to Olga Nonova:

 ON>> Однако, не знаю как в просто С, но в С++ нет никаких ограничений на тип
 ON>> и значения выражения при switch.

 AT> Дело не в ограничениях на тип в свитче, а на ДHК разработчика, пишущего
 AT> стей-машину.

А как быть с ДHК авторов C++?

 ON>> По поводу "по другому не бывает" о нумерации состояний как 0,1,2..., то
 ON>> в макроассемблере есть чрезвычайно изящное решение с использованием
 ON>> indirect jmp-а, а регистр-указатель принимает значения непосредственно
 ON>> адресов меток перехода. Имена меток и несут в себе название стейтов.
 ON>> При этом не надо никаких таблиц jmp-ов и перекодировок из индексов в
 ON>> физические адреса. Жаль, что ничего подобного в С реализовать похоже
 ON>> нельзя.

 AT> И не надо самому, компилятор все сделает, если он не убогий.

"Это вряд-ли".(с) Просто, здесь один из тех случаев, когда ассемблер лучше
ЯВУ.

Всего Вам Хорошего
Ольга


Re: State_Maschine
Hello, Olga!
You wrote to Alexandr Torres on Tue, 4 Jul 2006 14:34:44 +0000 (UTC):

 ON> Здравствуйте, Уважаемый Alexandr!

 ON> Tue Jul 04 2006 15:23, Alexandr Torres wrote to Olga Nonova:

 ON>>> Однако, не знаю как в просто С, но в С++ нет никаких ограничений на
 ON>>> тип и значения выражения при switch.

 AT>> Дело не в ограничениях на тип в свитче, а на ДHК разработчика,
 AT>> пишущего стей-машину.

 ON> А как быть с ДHК авторов C++?

А причем тут они к стейт-машине?

 ON>>> По поводу "по другому не бывает" о нумерации состояний как 0,1,2...,
 ON>>> то в макроассемблере есть чрезвычайно изящное решение с
 ON>>> использованием indirect jmp-а, а регистр-указатель принимает значения
 ON>>> непосредственно адресов меток перехода. Имена меток и несут в себе
 ON>>> название стейтов. При этом не надо никаких таблиц jmp-ов и
 ON>>> перекодировок из индексов в физические адреса. Жаль, что ничего
 ON>>> подобного в С реализовать похоже нельзя.

 AT>> И не надо самому, компилятор все сделает, если он не убогий.

 ON> "Это вряд-ли".(с) Просто, здесь один из тех случаев, когда ассемблер
 ON> лучше ЯВУ.

Очередная глупость "коллектиффа аффтаров".
 ON> Всего Вам Хорошего
 ON> Ольга

With best regards,
Alexandr Torres.  E-mail: snipped-for-privacy@yahoo.com
[ Жамству бой !]



Re: State_Maschine

X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Olga Nonova!
You wrote in conference fido7.ru.embedded to Alexandr Torres on Tue, 4 Jul
2006 14:34:44 +0000 (UTC):

 ON>>> Однако, не знаю как в просто С, но в С++ нет никаких ограничений
 ON>>> на тип  и значения выражения при switch.

 AT>> Дело не в ограничениях на тип в свитче, а на ДHК разработчика,
 AT>> пишущего  стей-машину.

 ON> А как быть с ДHК авторов C++?

Проблема в ДНК тех, кто берется оценивать языки ни разу их не зная.

 ON>>> По поводу "по другому не бывает" о нумерации состояний как
 ON>>> 0,1,2..., то  в макроассемблере есть чрезвычайно изящное решение с
 ON>>> использованием indirect jmp-а, а регистр-указатель принимает
 ON>>> значения непосредственно адресов меток перехода. Имена меток и
 ON>>> несут в себе название стейтов.
 ON>>> При этом не надо никаких таблиц jmp-ов и перекодировок из индексов
 ON>>> в физические адреса. Жаль, что ничего подобного в С реализовать
 ON>>> похоже нельзя.

 AT>> И не надо самому, компилятор все сделает, если он не убогий.

 ON> "Это вряд-ли".(с) Просто, здесь один из тех случаев, когда ассемблер
 ON> лучше ЯВУ.

Это как раз в точности обратный этому пример.

dima
http://www.dorlov.no-ip.com
http://dimorlus.dynalias.com




Re: State_Maschine

X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Olga Nonova!
You wrote in conference fido7.ru.embedded to Alexandr Torres on Tue, 4 Jul
2006 10:45:28 +0000 (UTC):


 AT>>>> работы  свитча сравнением/по таблице.

 ON>>> Во втором случае, по-видимому становилось обязательным требование,
 ON>>> чтобы выражение при switch принимало значения 0,1,2,3...

 AT>> В стейт-машине, как правило, по другому и не бывает.

 ON> Однако, не знаю как в просто С, но в С++ нет никаких ограничений на

Вы не знаете ни как в просто С ни как в С++, вы вообще ни хрена не знаете.

 ON> тип и значения выражения при switch.

Бред. Только целое (и его варианты)

 ON> Именно такая универсальность и вынуждает компилятор реализовать перебор
 ON> со сранением, что для ембеднутых устройств не есть хорошо.

Бред.

 ON> По поводу "по другому не бывает" о нумерации состояний как 0,1,2...,
 ON> то в макроассемблере есть чрезвычайно изящное решение с
 ON> использованием indirect jmp-а, а регистр-указатель принимает

В каком именно макроассемблере?

 ON> значения непосредственно адресов меток перехода. Имена меток и несут
 ON> в себе название стейтов. При этом не надо никаких таблиц jmp-ов и
 ON> перекодировок из индексов в физические адреса. Жаль, что ничего
 ON> подобного в С реализовать похоже нельзя.

В С это во-первых, можно реализовать прямо - массив адресов функций и их
вызов по индексу. А можно сонструкцией case. Во что скомпилируется то или
другое зависит от возможностей целевой платформы.

dima
http://www.dorlov.no-ip.com
http://dimorlus.dynalias.com




Re: State_Maschine

Quoted text here. Click to load it

  enum {S0=0, S1, S2, S3, S4...} state;

Quoted text here. Click to load it

  Точно.



Re: State_Maschine
Hi Olga!

04 Jul 06 13:12, Olga Nonova wrote to Alexandr Torres:

 AT>> Hапример в Такскинге для 51-х - можно было переключать прагмой
 AT>> режим работы  свитча сравнением/по таблице.

 ON> Во втором случае, по-видимому становилось обязательным требование,
 ON> чтобы выражение при switch принимало значения 0,1,2,3... Т.е. индекс
 ON> для таблицы jamp-ов. Иначе я не представляю, как пользоваться такой
 ON> таблицей.

    неиспользуемые значения ведут на конец swtich'а.

                                                   Slav.

State_Maschine
Здравствуйте, Уважаемый Slav!

Tue Jul 04 2006 15:05, Slav Matveev wrote to Olga Nonova:

 ON>> ... становилось обязательным требование,
 ON>> чтобы выражение при switch принимало значения 0,1,2,3... Т.е. индекс
 ON>> для таблицы jamp-ов. Иначе я не представляю, как пользоваться такой
 ON>> таблицей.

 SM>     неиспользуемые значения ведут на конец swtich'а.

Проблема в другом. В С++ нормально, но неэффективно для ембеднутых работает
такая конструкция переключателя:

switch (SomeChar) {
  case 'A': Do_A(); break;
  case 'B': Do_B(); break;
  default: Dо_Default(); break;
}

Допустима в С (без плюсов) такая конструкция из значений case-ов? И что
компильнет компилятор- тоже очень интересно.

Всего Вам Хорошего
Ольга


Re: State_Maschine
Hello Olga.

04 Jul 06 18:48, you wrote to Slav Matveev:

 > Проблема в другом. В С++ нормально, но неэффективно для ембеднутых работает
 > такая конструкция переключателя:

 > switch (SomeChar) {
 >   case 'A': Do_A(); break;
 >   case 'B': Do_B(); break;
 >   default: Dо_Default(); break;
 > }

 > Допустима в С (без плюсов) такая конструкция из значений case-ов? И что
 > компильнет компилятор- тоже очень интересно.

Ольга, так а что у Вас получилось?
Чем компилировали? Под какой камень? Тут достаточно квалифицированных людей,
чтоб помочь, конечно если оно Вам действительно нужно.
Nicolas


Re: State_Maschine
Здравствуйте, Уважаемый Nicolas!

Tue Jul 04 2006 19:12, Nicolas Minakov wrote to Olga Nonova:

 >> switch (SomeChar) {
 >>   case 'A': Do_A(); break;
 >>   case 'B': Do_B(); break;
 >>   default: Dо_Default(); break;
 >> }

 >> Допустима в С (без плюсов) такая конструкция из значений case-ов? И что
 >> компильнет компилятор- тоже очень интересно.

 NM> Ольга, так а что у Вас получилось?

Да, у меня все работает. Гложет только ощущение неэффективности компиляции,
которая впрочем с лихвой компенсируется быстродействием процессора.

 NM> Чем компилировали? Под какой камень? Тут достаточно квалифицированных
 NM> людей, чтоб помочь, конечно если оно Вам действительно нужно.

Спасибо на добром слове. А то я уже отчаялась получить в ответ что-либо, кроме
бессмысленного хамства. Работаю я с MCF5270 "ColdFire", это из серии 68K от
FreeScale. Пакет разработки на С++ от GNU. И я столкнулась с проблемой, что в
С++ (не только в GNU компайлере!) оператор switch производит перебор всех
case-ов, пока не произойдет сравнение с искомым. Та-же история и в Дельи.
Внимание, вопрос: Какие есть варианты реализовать в С++ или Дельфях
максимально эффективное ветвление, чтоб без перебора и без ограничений на тип
выражения case-ов?

Всего Вам Хорошего
Ольга


Site Timeline