powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Чем плох безусловный переход??
25 сообщений из 109, страница 3 из 5
Чем плох безусловный переход??
    #32965883
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DocAl mayton
P.S. Ищу транслятор Eiffel. Пока не смог нигде выкачать для Windows.
А тут его нету?

Thnx.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32965925
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizкак то раз я пытался автомат изобразить.
есть последовательность экранных форм {f1, f2, f3,...,fn}
и надо записать переходы при нажатии соответствующих кнопок на
из любого на f1
из любого на fn
из fk на fk-1
из fk на fk+1

по-моему, писать это структурными операторами (for, while) жутко не удобно.
с гото тескт получался проще.
Ага. Классическое спагетти получается, прямо из любого учебника семидесятых годов.

Для подобных случаев существует понятие "таблица решений" - как явная ее реализация, так и какая-нибудь из неявных.[/quot]
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32965956
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton1) Господит Softwarer упомянул об использовании оператора break.
Господин Softwarer упомянул и о такой существующей кое-где конструкции, как break <метка>.

mayton2) Отвечаю на вопрос, касаемо полиморфизма.

Классический С обладал его зачатками. Достаточно вспомнить как спользовались "указатели на функции". Фактически это была попыта сделать goto управляемым на этапе выполнения (позднее связывание).
Хм. Давайте я подкину Вам еще информацию:

- понятие "вычисляемого GOTO" (таблицы переходов) существует с пятидесятых, кажется, годов; с шестидесятых - точно.

- понятие "указателя на функцию" появилось отнюдь не в C и не является ближайшим наследником вычисляемого GOTO. Существующий сейчас наследник вычисляемого GOTO - это SWITCH.

Важно отметить, что это - два принципиально разных механизма. Различаются они тем, что функция получает параметры, в то время как GOTO не способен их передать (можно только пользоваться глобальными переменными).

Соответственно, если указатели на функции можно рассматривать как инструмент полиморфизма при собственной реализации ООП, GOTO - нельзя рассматривать как даже грубую аналогию ООП-механизма (в нем нереализуемо собственно понятие "объекта").

maytonтаблица содержит адреса переходов (на самом деле адреса команд call) на реализации самих функций для данного обьекта. Это суть - безусловный переход на вызов метода.
call нельзя рассматривать как аналог jmp.

call - это аналог inline (то есть подстановки в место вызова тела вызываемой подпрограммы). Единственное исключение из этой аналогии - бесконечная рекурсия, что обычно малоинтересно.

jmp - куда более "общий", чем call, механизм. Можно сказать, что вызов подпрограммы является одним из "правильных" вариантов goto (наряду с goto в реализации цикла итп).
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32965971
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
boolean iscondition=false;
firstFor: 
for(int i= 0 ;i< 10 ;i++) {
    for(int j= 0 ;j< 10 ;j++)  {
        for(int k= 0 ;k< 10 ;k++)  {  
            if (condition(a[i][j][k])){
                iscondition=true;
                break firstFor;
            }
        }
   }
}

Можно и на C:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
boolean iscondition=false;
for(int i= 0 ;!iscondition&&(i< 10 );i++) {
    for(int j= 0 ;!iscondition&&(j< 10 );j++)  {
        for(int k= 0 ;k< 10 ;k++)  {  
            if (condition(a[i][j][k])){
                iscondition=true;
                break;
            }
        }
   }
}

Можно и без флага:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for(int i= 0 ;i< 10 ;i++) {
    for(int j= 0 ;j< 10 ;j++)  {
        for(int k= 0 ;k< 10 ;k++)  {  
            if (condition(a[i][j][k])){
                i = j = k =  10 ;
            }
        }
   }
}

Я уже говорил - если смотреть на реальный код, оказывается, что существуют альтернативы. Ситуации, где GOTO резко лучше - как минимум, очень редки.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32966177
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinА если у тебя строчек так тысяч пять - шесть?

goto, ИМХО, используется потому, что это фактически asm без никто :)
Ну типа JMP

А кто тебе предлагает прыгать по всей программе?
Предлагается использовать goto локально, для решения задач, вроде выхода из циклической конструкции. Здесь общий объем кода ни на что не влияет. Как раз чем накрученней условия циклов, тем сложнее читать.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32966193
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinА я goto никогда не использовал. Не потому, что я его не люблю. Просто необходимости небыло.

Кстати, интересно, а кокой код быстрее будет:
Код: plaintext
1.
2.
3.
4.
while TRUE do
begin
// сдесь код
end;
или
Код: plaintext
1.
2.
3.
{забыл как метка на паскале зовётся :)))} lbl;
// здесь код
goto lbl;


Вообще, с машинной точки зрения беусловный переход будет быстрее, чем любое условие. Но в данном примере все зависит от компилятора. Хороший компилятор замент цикл простым jmp. А плохой...
По крайней я проверил, что Delphi заменяет на jmp. Так что разности в производительности нет. А насчет читабельности -- то здесь неудачный пример, здесь как раз goto и не нужен.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32966230
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

А кто-нибудь хочет попробовать практически сравнить два варианта -
с goto и без ?.

У меня есть переписанный с бейсика на с++ тестовый вариант сборки
пентамино, годов этак конца 80-х (Если кто помнит, алгоритм давался
в журнале "Наука и Жизнь").
Было предложено переписать его без использования goto,
правда с параноидальными требованиями

Параноидальные требования
1. Запрещается использовать подпрограммы/функции
2. Не допускается дублирование кода


Я попробовал это сделать, но запутался и бросил.

Если кто-нибудь изъявит желание переписать этот кусок,
могу сюда забросить исходник (он маленький).
Потом сравним.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32966374
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelikk SarinА если у тебя строчек так тысяч пять - шесть?

goto, ИМХО, используется потому, что это фактически asm без никто :)
Ну типа JMP

А кто тебе предлагает прыгать по всей программе?
Предлагается использовать goto локально, для решения задач, вроде выхода из циклической конструкции. Здесь общий объем кода ни на что не влияет. Как раз чем накрученней условия циклов, тем сложнее читать.

А чем halt плох?

В принципе в случаях, когда производительность нужна ЛЮБОЙ ценой и for i := 1 to 50
заменяется на 50 команд. А все функции переписываются каждый раз с начала наверное goto очень хорошая вещь.

Хотя, каждому своё. Я goto не юзаю. Но кричать на каждом углу не юзайте goto не хочу.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32966418
Dubrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
...
У Haskell есть довольно неплохой компиллятор со средой. ( Кому интересно - могу дать ссылки).
...


Давай, интересно, что есть нового в нашем несовершенном мире (или не нового).
---
С уважением, Dubrov.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32966460
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dubrov mayton
...
У Haskell есть довольно неплохой компиллятор со средой. ( Кому интересно - могу дать ссылки).
...


Давай, интересно, что есть нового в нашем несовершенном мире (или не нового).
---
С уважением, Dubrov.

Смотри мой пост на предыдущей странице.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32966593
basic крут
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZrenByПривет.

А кто-нибудь хочет попробовать практически сравнить два варианта -
с goto и без ?.

Параноидальные требования
1. Запрещается использовать подпрограммы/функции
2. Не допускается дублирование кода




Брасай, любопытно посмотреть, как извращались на бейсике, где нет методов.

А условия действительно параноидальные :) В тот и смысл, что функции убирают дублирование кода и упрощают процесс написания кода, делают его лекго читаемым и т.п.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32966665
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
basic крут
Брасай, любопытно посмотреть, как извращались на бейсике, где нет методов.


Правда, тут уже извраты не бейсика, а с :).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
#include<cstdio>
#include<cassert>

const long AX =  15 ;
const long AY =   4 ;

//Тут всякая мутотень
const          long W_[ 12 ]={ 0 , 2 , 6 , 14 , 22 , 30 , 38 , 46 , 62 , 78 , 94 , 110 };
const unsigned long F_[ 126 ]  =  {0x01010102,0xff000100,0x01020304,0x00000000,
0x00000000,0x01020304,0x01020101,0x00000102,0x01020101,0x0000fffe,0x00000102,
0x01020101,0x01020202,0x00ff0001,0x01010102,0x00010202,0x00010202,0x010000ff,
0x01010102,0x00fffefe,0x00010202,0x01010102,0x00010202,0x01000001,0x01010100,
0x00010202,0x00010202,0x01010100,0x01000001,0x00010202,0x00000102,0x01020202,
0x01020000,0x00000102,0x01020202,0x0000fffe,0x01020202,0x00000102,0x00010102,
0x01010202,0x00010102,0x0100ffff,0x01010202,0x00fffffe,0x01010202,0x00010102,
0x00000001,0x01020303,0x01010101,0x00fffefd,0x00010203,0x01010101,0x00010203,
0x01000000,0x01000000,0x00010203,0x01010101,0x00010203,0x01020303,0x000000ff,
0x01020303,0x00000001,0x00010102,0x01010000,0x01010202,0x00010100,0x00010102,
0x01000101,0x01020201,0x0000ffff,0x00000101,0x01020100,0x00010101,0x01000102,
0x00000101,0x01020201,0x00010101,0x010100ff,0x01010102,0x0100ffff,0x01010102,
0x00010201,0x01010102,0xff000101,0x01010102,0x00fffeff,0x01010202,0xff000001,
0x00010102,0x0100ff00,0x01010202,0x010000ff,0x00010102,0x01010201,0x01020203,
0x00ff0000,0x01010203,0xff000000,0x01020203,0x00000100,0x01010203,0x01000000,
0x01010101,0xff000102,0x01000000,0x01010203,0x01010101,0x0100fffe,0x00000001,
0x01020302,0x01020203,0x00000101,0x01010203,0x00ffffff,0x01020203,0x0000ffff,
0x01010203,0x00010101,0x00010101,0x0100fffe,0x00000101,0x01020203,0x01010000,
0xff000102,0x00010101,0x01010203};
const long L_[ 12 ]={ 1 , 2 , 4 , 4 , 4 , 4 , 4 , 8 , 8 , 8 , 8 , 8 };const char C_[]="*XITZUVWLPFYN";
long       A_[ 60 ];

long cnt( 0 ),pfc,cur,xo[ 13 ],yo[ 13 ],key[ 12 ],knd[ 12 ];

#define A(x,y) (*(A_+(y)*AX+(x)))
#define X(n,k,c) (c?(long)((signed char)((F_[W_[(n)]+(k<< 1 )  ]>>( 32 - 8 *(c)))&0xFF)): 0 )
#define Y(n,k,c) (c?(long)((signed char)((F_[W_[(n)]+(k<< 1 )+ 1 ]>>( 32 - 8 *(c)))&0xFF)): 0 )
#define Log(f)                                                              \
  fprintf((f),"fig.# %d\n",cnt);for(int y= 0 ;y<AY;++y){for(int x= 0 ;x<AX;++x){\
  fputc(C_[A(x,y)],(f));}fputc('\n',(f));}fputc('\n',(f));

//Тут мутотень закончилась, дальше можно работать

int main(){
  assert(AX*AY ==  60 );
  assert(AX>AY);

  long i,x,y;
  
  pfc = - 1 ; cur =  0 ; xo[ 0 ] =  0 ; yo[ 0 ] =  0 ; goto label2070;

label2070:
  key[cur] = - 1 ; goto label2180;

label2090:
  for(i =  0 ; i <= pfc; ++i)if(key[cur]==key[i])goto label2180;

label2140:
  long x_[ 5 ],y_[ 5 ];
  for(i =  0 ; i <  5 ; ++i){
    x_[i] = xo[cur] + X(key[cur], knd[cur], i);
    y_[i] = yo[cur] + Y(key[cur], knd[cur], i);
    if(!i)continue;
    if((x_[i]< 0 )||(y_[i]< 0 )||(x_[i]>=AX)||(y_[i]>=AY)||(A(x_[i],y_[i])))goto label2160;
  }
  for(i =  0 ; i <  5 ; ++i)A(x_[i], y_[i]) = key[cur] +  1 ;
  for(x =  0 ; x < AX; ++x)for(y =  0 ; y < AY; ++y)if(!A(x,y)){
    xo[pfc +  2 ] = x; yo[pfc +  2 ] = y; goto label2260;
  }

label2260:
  ++pfc; cur = pfc +  1 ; if(pfc <  11 )goto label2070;
  ++cnt;
  Log(stdout);
  goto label2240;

label2160:
  ++knd[cur]; if(knd[cur] < L_[key[cur]])goto label2140;

label2180:
  ++key[cur]; knd[cur] =  0 ; if(key[cur] <  12 )goto label2090;
  if(pfc <  0 ){fprintf(stdout,"Complete\n");return  0 ;};

label2240:
  for(i =  0 ; i <  5 ; ++i)A(xo[pfc] + X(key[pfc], knd[pfc], i),
                          yo[pfc] + Y(key[pfc], knd[pfc], i))= 0 ;
  --pfc; cur = pfc +  1 ; goto label2160;
}
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32966993
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вспоминается анекдот:

Сидит программер. Что-то кодит. К нему подходит юзер.
Ю: Что ты делаешь?
П: Пишу программу
Ю: А что она делает?
П: Не знаю. Щас скомпилим, запустим и узнаем...


P.S. ZrenBy вдохновил.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32967141
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
))))
тогда уже не "таблица решений", а матрица перехода автомата из состояния в состояние.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32967143
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiebentearbeithДайте и мне шашкой помахать :)
...

И ещё.То, что не отвалилось в процессе эволюции - нужно.

угу.
вот, к примеру, арифметический иф (с переходом на три ветвления) в фортране отвалился.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32967376
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SarinХотя, каждому своё. Я goto не юзаю. Но кричать на каждом углу не юзайте goto не хочу.

Круто, подписываюсь под этим :)
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32967517
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin Lelikk SarinА если у тебя строчек так тысяч пять - шесть?

goto, ИМХО, используется потому, что это фактически asm без никто :)
Ну типа JMP

А кто тебе предлагает прыгать по всей программе?
Предлагается использовать goto локально, для решения задач, вроде выхода из циклической конструкции. Здесь общий объем кода ни на что не влияет. Как раз чем накрученней условия циклов, тем сложнее читать.

А чем halt плох?

В принципе в случаях, когда производительность нужна ЛЮБОЙ ценой и for i := 1 to 50
заменяется на 50 команд. А все функции переписываются каждый раз с начала наверное goto очень хорошая вещь.

Хотя, каждому своё. Я goto не юзаю. Но кричать на каждом углу не юзайте goto не хочу.

Halt плох тем, что он не завершает, а убивает программу.
А расписать for на 50 строк кода глупо. Так как весь короткий цикл при исполнении процессором уже декодирован и выполняется гораздо быстрее и не по коду.
Кстати, если в функции исполняется приличный кусок кода, то экономить на вызове функции смысла не имеет.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32967659
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то в словах Sarin-a есть резон. Представьте себе код, в котором в целях повышения производительности исключен нормальный выход. К примеру ... это может быть видеокодек или трассировщих лучей. Для останова такого процесса используется какое-нибудь внешнее воздействие. Например установка внешнего флага bStopThread в состояние true.

За примерами далеко ходить не надо. Возьмите любую задачу с погружением в глубокую рекурсию.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32967747
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вроде halt с чем-то спутал.
Есть какая-то команда выхода из цикла :)
Склероз.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32967830
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinЯ вроде halt с чем-то спутал.
Есть какая-то команда выхода из цикла :)
Склероз.

Может throw ?
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32968749
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizтогда уже не "таблица решений", а матрица перехода автомата из состояния в состояние.
Это простой частный случай таблицы решений, вполне уместный в данном случае.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32969225
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton SarinЯ вроде halt с чем-то спутал.
Есть какая-то команда выхода из цикла :)
Склероз.

Может throw ?

Нет, он вроде в контексе Delphi
Можно raise или break
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32969340
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
break.
Вспомнил. Спасибо большое. Вообще склероз - болезнь чудная. Каждый день что-то новое.
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32972310
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZrenByПравда, тут уже извраты не бейсика, а с :).
Остальное пропущу, приведу свой код. Что было - отмечено собачками. Найти отличия несложно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

const long AX =  15 ;
const long AY =   4 ;

//Тут всякая мутотень
const          long W_[ 12 ]={ 0 , 2 , 6 , 14 , 22 , 30 , 38 , 46 , 62 , 78 , 94 , 110 };
const unsigned long F_[ 126 ]  =  {0x01010102,0xff000100,0x01020304,0x00000000,
0x00000000,0x01020304,0x01020101,0x00000102,0x01020101,0x0000fffe,0x00000102,
0x01020101,0x01020202,0x00ff0001,0x01010102,0x00010202,0x00010202,0x010000ff,
0x01010102,0x00fffefe,0x00010202,0x01010102,0x00010202,0x01000001,0x01010100,
0x00010202,0x00010202,0x01010100,0x01000001,0x00010202,0x00000102,0x01020202,
0x01020000,0x00000102,0x01020202,0x0000fffe,0x01020202,0x00000102,0x00010102,
0x01010202,0x00010102,0x0100ffff,0x01010202,0x00fffffe,0x01010202,0x00010102,
0x00000001,0x01020303,0x01010101,0x00fffefd,0x00010203,0x01010101,0x00010203,
0x01000000,0x01000000,0x00010203,0x01010101,0x00010203,0x01020303,0x000000ff,
0x01020303,0x00000001,0x00010102,0x01010000,0x01010202,0x00010100,0x00010102,
0x01000101,0x01020201,0x0000ffff,0x00000101,0x01020100,0x00010101,0x01000102,
0x00000101,0x01020201,0x00010101,0x010100ff,0x01010102,0x0100ffff,0x01010102,
0x00010201,0x01010102,0xff000101,0x01010102,0x00fffeff,0x01010202,0xff000001,
0x00010102,0x0100ff00,0x01010202,0x010000ff,0x00010102,0x01010201,0x01020203,
0x00ff0000,0x01010203,0xff000000,0x01020203,0x00000100,0x01010203,0x01000000,
0x01010101,0xff000102,0x01000000,0x01010203,0x01010101,0x0100fffe,0x00000001,
0x01020302,0x01020203,0x00000101,0x01010203,0x00ffffff,0x01020203,0x0000ffff,
0x01010203,0x00010101,0x00010101,0x0100fffe,0x00000101,0x01020203,0x01010000,
0xff000102,0x00010101,0x01010203};
const long L_[ 12 ]={ 1 , 2 , 4 , 4 , 4 , 4 , 4 , 8 , 8 , 8 , 8 , 8 };const char C_[]="*XITZUVWLPFYN";
long       A_[ 60 ];

long cnt( 0 ),pfc,cur,xo[ 13 ],yo[ 13 ],key[ 12 ],knd[ 12 ];

#define A(x,y) (*(A_+(y)*AX+(x)))
#define X(n,k,c) (c?(long)((signed char)((F_[W_[(n)]+(k<< 1 )  ]>>( 32 - 8 *(c)))&0xFF)): 0 )
#define Y(n,k,c) (c?(long)((signed char)((F_[W_[(n)]+(k<< 1 )+ 1 ]>>( 32 - 8 *(c)))&0xFF)): 0 )
#define Log(f)                                                              \
  fprintf((f),"fig.# %d\n",cnt);for(int y= 0 ;y<AY;++y){for(int x= 0 ;x<AX;++x){\
  fputc(C_[A(x,y)],(f));}fputc('\n',(f));}fputc('\n',(f));

//Тут мутотень закончилась, дальше можно работать

int main(){
  assert(AX*AY ==  60 );
  assert(AX>AY);

  long i,x,y;
  long x_[ 5 ],y_[ 5 ];


  //@@@
  enum estate{ label2070, label2180, label2090, label2140, label2160,
               label2260, label2240};
  estate state;

  pfc = - 1 ; cur =  0 ; xo[ 0 ] =  0 ; yo[ 0 ] =  0 ; state = label2070; //@@@ goto label2070;

  //@@@
  while(  1 ){
  switch( state)
  {
//@@@label2070:
   case label2070:
     key[cur] = - 1 ; state = label2180; //@@@ goto label2180;
     break;

//@@@label2090:
   case label2090:
    for(i =  0 ; i <= pfc; ++i)
    {
      if(key[cur]==key[i])
      {
        state = label2180;
        //@@@goto label2180;
        break;
      }
    }
    if( state == label2180)
      break;

//@@@label2140:
  case label2140:
  {
  //@@@long x_[ 5 ],y_[ 5 ];
  for(i =  0 ; i <  5 ; ++i){
    x_[i] = xo[cur] + X(key[cur], knd[cur], i);
    y_[i] = yo[cur] + Y(key[cur], knd[cur], i);
    if(!i)continue;
    if((x_[i]< 0 )||(y_[i]< 0 )||(x_[i]>=AX)||(y_[i]>=AY)||(A(x_[i],y_[i])))
    {
      //@@@goto label2160;
      state = label2160;
      break;
    }
  }
  if(state == label2160)
    break;
  for(i =  0 ; i <  5 ; ++i)A(x_[i], y_[i]) = key[cur] +  1 ;
  for(x =  0 ; x < AX; ++x){
   for(y =  0 ; y < AY; ++y)
   {
    if(!A(x,y))
    {
      xo[pfc +  2 ] = x; yo[pfc +  2 ] = y; //@@@goto label2260;
      state = label2260;
      break;
    }
   }
   if(state == label2260) break;
  }
  if(state == label2260) break;

  }

//@@@label2260:
  case label2260:
  ++pfc; cur = pfc +  1 ; if(pfc <  11 ){ state = label2070; break; } //@@@goto label2070;
  ++cnt;
  Log(stdout);
  state = label2240;
  break;
  //@@@goto label2240;

//@@@label2160:
  case label2160:
  ++knd[cur]; if(knd[cur] < L_[key[cur]]){ state = label2140; break; } //@@@goto label2140;

//@@@label2180:
  case label2180:
  ++key[cur]; knd[cur] =  0 ; if(key[cur] <  12 ){ state = label2090; break;} //@@@goto label2090;
  if(pfc <  0 ){fprintf(stdout,"Complete\n");return  0 ;};

//@@@label2240:
  case label2240:
  for(i =  0 ; i <  5 ; ++i)A(xo[pfc] + X(key[pfc], knd[pfc], i),
                          yo[pfc] + Y(key[pfc], knd[pfc], i))= 0 ;
  --pfc; cur = pfc + 1; //@@@ goto label2160;
  state = label2160;
  } // end switch
  } // end while
}
...
Рейтинг: 0 / 0
Чем плох безусловный переход??
    #32972399
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
      state = label2260;
      break;
    }
   }
   if(state == label2260) break;
  }
  if(state == label2260) break;
...


Понятно, конечно, но ...
...
Рейтинг: 0 / 0
25 сообщений из 109, страница 3 из 5
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Чем плох безусловный переход??
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]