Имя: Пароль:
1C
1С v8
Подскажите по "Перейти <Метка>;"
0 r_i_n_i_k
 
23.11.11
15:55
хочу использовать эту конструкцию..а что выступает в качестве метки?
1 PR
 
23.11.11
15:56
Неудачник
2 aleks-id
 
23.11.11
15:56
это метка
убей_себя_об_стену:
3 r_i_n_i_k
 
23.11.11
15:56
чё так?
4 rs_trade
 
23.11.11
15:57
(0) щас какашками же закидают. в чем причина столь странного желания?
5 r_i_n_i_k
 
23.11.11
15:57
любопытство)
6 PR
 
23.11.11
15:57
(3) Метками пользуются люди, которые не могут написать правильный красивый алгоритм без меток.
7 r_i_n_i_k
 
23.11.11
15:57
и желание программмно перейти)
8 r_i_n_i_k
 
23.11.11
15:57
(6) это про меня
9 r_i_n_i_k
 
23.11.11
15:58
кто то подскажет?
10 rs_trade
 
23.11.11
15:58
(3)  wiki:GOTO раздел критика
11 aleks-id
 
23.11.11
15:58
(*пишет в блокнотик "https://1cers.ru/users.php?id=63874 - гомнокодер" *)
12 Reset
 
23.11.11
15:59
(9) смотри (2), неполноценный
13 Stim213
 
23.11.11
15:59
набросились)
14 aleks-id
 
23.11.11
15:59
аааа.... исправьте плиз (11)
15 rs_trade
 
23.11.11
16:00
(9) не делай так. тебя будут проклинать все кто увидит твой код.
16 Stim213
 
23.11.11
16:00
Оправданное применение

Тем не менее, в практическом программировании применение GOTO в некоторых случаях можно считать допустимым. Поскольку GOTO — «простейший», «атомарный» оператор перехода, а все остальные являются «составными», производными от него, то применение GOTO допустимо и оправданно, когда другие средства языка не реализуют или недостаточно эффективно реализуют нужную функциональность. К таким случаям можно отнести:
[править]
Выход из нескольких вложенных циклов сразу

Обычно считается, что в языках, где операторы досрочного завершения цикла (такие, как break и continue в Си) могут относиться только к тому из вложенных циклов, в котором они расположены, использование goto допустимо, чтобы выйти из нескольких вложенных циклов сразу. Здесь GOTO значительно упрощает программу, избавляя от необходимости создания вспомогательных переменных-флагов и условных операторов.

Другие варианты решения этой проблемы — помещение вложенных циклов в отдельную процедуру и использование команды досрочного выхода из процедуры, а в языках с поддержкой исключений — генерацию исключения, обработчик которого располагается за пределами циклов. Однако подобные решения могут снижать производительность, в особенности если этот участок кода вызывается многократно (поскольку и вызовы процедур, и операторы работы с исключениями транслируются далеко не в одну машинную инструкцию).

Пример:
int matrix[n][m];
int value;
...
for(int i=0; i<n; i++)
 for (int j=0; j<m; j++)
   if (matrix[i][j] == value)
   {
     printf("value %d found in cell (%d,%d)\n",value,i,j);
     //act if found
     goto end_loop;
   }
printf("value %d not found\n",value);
//act if not found
end_loop: ;

Прямолинейный способ избавления от GOTO — создать дополнительную переменную-флаг, сигнализирующую, что надо выйти из внешнего цикла (после выхода из внутреннего по break) и обойти блок кода, выполняющийся, когда значение не найдено. Но вряд ли этот способ можно рекомендовать на практике, так как в результате код окажется загромождён проверками, станет длиннее и будет дольше работать. Но можно вынести код в функцию и использовать return.

Без изменения структуры кода проблема решается, если команда break (или её аналог) позволяет выйти из нескольких вложенных блоков сразу, как в Java или Ada. Аналогичный код на Java никакого goto не требует:
int[][] matrix;
int value;
...
outer: {
 for(int i=0; i<n; i++)
   for (int j=0; j<m; j++)
     if (matrix[i][j] == value)
     {
       System.out.println("value " + value + " found in cell (" + i + "," + j + ")");
       break outer;
     }
 System.out.println("value " + value + " not found");
}

Тем не менее, если специальной конструкции для выхода из вложенного цикла нет, в некоторых случаях из него удобнее выходить именно с помощью GOTO.
[править]
Обработка ошибок

Этот случай применим к языкам, не содержащим конструкции try ... finally — например, к C без применения SEH, существующего только в Windows. В этом случае goto используется для перехода на код «очистки» — находящийся в конце функции и уничтожающий созданные ею объекты перед выходом из неё. Этот метод широко используется при написании драйверов.

Пример такой обработки ошибок (все имена и константы, кроме NULL, вымышлены и приведены лишь для примера):
int fn( int* presult )
{
 int sts = 0;
 TYPE entity, another_entity = NULL;
 TYPE2 entity2 = NULL;

 if ( !( entity = create_entity() ) )
   { sts = ERROR_CODE1; goto exit0; }

 if ( !do_something( entity ) )
   { sts = ERROR_CODE2; goto exit1; }

 if ( condition ) {
   if ( !( entity2 = create_another_entity() ) )
     { sts = ERROR_CODE3; goto exit1; }

   if ( ( *presult = do_another_thing( entity2 ) == NEGATIVE )
     { sts = ERROR_CODE4; goto exit2; }
 }
 else {
   if ( ( *presult = do_something_special( entity ) == NEGATIVE )
     { sts = ERROR_CODE5; goto exit2; }
 }
 exit2: if ( entity2 ) destroy_another_entity( entity2 );
 exit1: destroy_entity( entity );
 exit0: return sts;
}

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

Главным критерием применимости goto во всех случаях, включая указанные, является ненарушение используемой парадигмы программирования. В приведенных примерах это — структурное программирование, то есть должны сохраняться иерархическая организация программы и таковая же логика её работы. Нарушение принципа иерархии (например: переходы внутрь цикла; обход операций инициализации — как явных, так и неявных; выход из кода, следующего за fork(), в код, предшествующий ему) чревато всевозможными побочными эффектами, возникающими из деталей трансляции программы в машинный код, и, как следствие, странными, труднообнаружимыми ошибками.
[править]
Автогенерация кода

Ещё одним допустимым применением безусловного перехода является код, который генерируется автоматически, например, генерируемые с помощью программных инструментальных средств лексические и синтаксические анализаторы. Например, код, генерируемый утилитами yacc, lex, bison изобилует командами goto, но в этом нет ничего плохого, так как этот код в принципе не предназначен для восприятия и редактирования человеком, а его корректность целиком определяется корректностью создающего его инструмента. Иначе говоря, здесь имеет место та же самая ситуация, что в случае с компилятором языка высокого уровня, создающим машинный код (с неизбежными командами безусловного перехода) просто потому, что таков целевой язык.
17 r_i_n_i_k
 
23.11.11
16:02
{Документ.СчетНаОплатуПокупателю.МодульОбъекта(1261,12)}: Ожидается метка
           Перейти <<?>>x; (Проверка: Толстый клиент (обычное приложение))


пишет так...как задать эту метку?
18 Reset
 
23.11.11
16:03
(17) Глядь, ты специально ее так назвал? "Перейти на х;"
19 r_i_n_i_k
 
23.11.11
16:03
(18) нет, так получилось)
20 ptiz
 
23.11.11
16:05
F1
Любой исполняемый оператор может иметь метку, используемую в качестве точки перехода в операторе Перейти.
В общем случае формат оператора языка следующий:

~метка:Оператор[(параметры)] [ДобКлючевоеСлово];

В качестве меток используются специальные идентификаторы, начинающиеся с символа ‘~’ (тильда) и состоящие из последовательности букв, цифр и символов ‘_’ (подчеркивание). Чтобы пометить оператор, надо поместить перед ним метку и следующий за ней символ ":".

Пример:
~метка:А=В;
21 r_i_n_i_k
 
23.11.11
16:08
спасибо
22 aleks-id
 
23.11.11
16:20
Пример:
int matrix[n][m];
int value;
bool not_found=false;
...
while (i<n) or (not_found) do
 { j=0;
   while (j<m) or (not_found) do
   {
   if (matrix[i][j] == value)
      {
        printf("value %d found in cell (%d,%d)\n",value,i,j);
        not_found = true;
       }
    j++;}
  i++;}
printf("value %d not found\n",value);
//act if not found
23 aleks-id
 
23.11.11
16:21
тьфу.  
bool not_found=true;
....
not_found = false;
24 Maxus43
 
23.11.11
16:23
ниразу не пользовался метками в 1с. вот помню на бэйсике в школе востребованная команда была
25 Extro
 
23.11.11
16:23
А при отладки, допустим, использовать метки - религия не позволяет?
26 МастерВопросов
 
23.11.11
16:23
27 aka AMIGO
 
23.11.11
16:26
неее.. больше метку не применяю.. как обложили меня со всех сторон в форуме, с тех пор даже вспоминать без содрогания про метку не могу.. :)

ТС, умоляю, не-на-до-ме-ток! :)
28 GROOVY
 
23.11.11
16:28
Никогда после ассемблера переход по меткам не применяю.
29 aleks-id
 
23.11.11
16:30
и вообще код в (22) надо в функцию перенести и все.
30 Wobland
 
23.11.11
16:31
не читал ещё ветку. автору много прилетело? ;)
31 Wobland
 
23.11.11
16:33
(25) при отладке спасает отладчик, просмотр значений переменных и голова
32 aleks-id
 
23.11.11
16:33
(30) да так. чутка. пару катях и всё.
33 Wobland
 
23.11.11
16:35
автор, забудь об этом. настрой голову и забудь. про оправданное применение от стима пойду почитаю пока
34 Morphius
 
23.11.11
16:43
http://lurkmore.ru/Go_to
Эта тема подтверждает статью
35 Wobland
 
23.11.11
18:30
«Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации»
36 Rebelx
 
23.11.11
18:47
а я использую Goto :))
37 andrewks
 
23.11.11
18:51
пля, мало вам той ветки, что-ли?
38 _
vovanidze_3412341
 
23.11.11
18:54
ниразу небыло случая чтобы необходимо было применять метку...
39 Пришел в тапках
 
23.11.11
18:57
вот это жестоко
40 smaharbA
 
23.11.11
19:00
ГоуТу самый правильный метод, на сри на возгласы
41 GreyK
 
23.11.11
19:00
(36) У меня то-же иногда вылетает русское "да пошел ты", но я стараюсь сдерживаться и говорить ангельские анналоги: "Пока ты не ..." или "Возврат ...",
42 Vladal
 
23.11.11
19:02
(41) Зачёт
43 vmv
 
23.11.11
19:03
вопить на гото, значит не быть программистом, хотя это ж форум 1С, какие тут программисты, так - счетоводы с правом конфигурить)
44 _
vovanidze_3412341
 
23.11.11
19:03
(41) типа вежливость 1с-ников
45 Vladal
 
23.11.11
19:12
На вопрос в (0) ответили?
46 NcSteel
 
23.11.11
19:14
(43) Так вот , раз не программисты , то и не нужен ГоТо
47 _
vovanidze_3412341
 
23.11.11
19:15
48 DJ Anthon
 
23.11.11
19:49
(40) это только для тебя, мастер скриптов
Ошибка? Это не ошибка, это системная функция.