|
Подскажите по "Перейти <Метка>;" | ☑ | ||
---|---|---|---|---|
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
|
(4) ага вот мистасрач:
Теорема Бома — Якопини реалистична? или снова про goto |
|||
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) это только для тебя, мастер скриптов
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |