Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/67: Рейтинг темы: голосов - 67, средняя оценка - 4.90
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647

Оператор GOTO: за и против

20.11.2011, 16:38. Показов 15036. Ответов 146
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди, по ходу, газет не читают:
Оператор GOTO в языках высокого уровня является объектом критики, поскольку чрезмерное его применение приводит к созданию нечитаемого «спагетти-кода». Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Доводы против оператора GOTO», который заметил, что качество программного кода обратно пропорционально количеству операторов GOTO в нём. Статья приобрела широкую известность как среди теоретиков, так и среди практиков программирования, в результате чего взгляды на использование оператора GOTO были существенно пересмотрены. В своей следующей работе Дейкстра обосновал тот факт, что для кода без GOTO намного легче проверить формальную корректность.

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

Доводы против оператора GOTO оказались столь серьёзны, что в структурном программировании его стали рассматривать как крайне нежелательный

Начало тут
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2011, 16:38
Ответы с готовыми решениями:

Оператор GOTO и его метки
Здесь я хотел раз и навсегда разобраться с метками оператора GOTO. 1) Если метка является идентификатором, то есть начинается с...

Goto - за и против
С удивлением обнаружил на форуме аж двух сторонников оператора goto. Посему объявляю опрос.

Оператор goto
Здравствуйте. Я в лабораторной работе проверяю введенные данные на различные ошибки. Я это все сделал, каждую ошибку мне выдает. То...

146
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
30.01.2017, 15:14
Студворк — интернет-сервис помощи студентам
The trick по делу пишет. Терпеть каскады If\End If - да ну нафиг... О таком угандошивании
кода яростные сторонники структурного программирования упомянуть забыли.

Цитата Сообщение от кот Бегемот Посмотреть сообщение
Ну и где проще и яснее?
Равноценные варианты. Ситуации написания программ в 10 строк и заново как-то слабо
экстраполируются на что-то более ёмкое, неопределённое, где софт пишется далеко
не с первой попытки даже имея разработанный вариант архитектуры. И реструктуризация
по примеру выше(например при сложном парсинге) может вылиться в каскад конструкций
на три четыре экрана в ширину, разумеется если программист вообще в силах будет такое
мутить, но дерут сомнения в этом.

PS Лет 20 я программировал на Бейсике
Пафоса то сколько разведено. Хоть какую-нть ссаную прогу бы презентовал, понять хоть
насколько всё соответствует действительности, а то вдруг перед нами российский клон
Кена Сильвермана...

Цитата Сообщение от кот Бегемот Посмотреть сообщение
Когда Вы изучите какой-нибудь нормальный язык
Если вы про Паскаль, то эти ЯП одного ранга и нести столь дешёвый бред в 2017 году себе не
позволит ни один более менее осведомлённый программист.

Цитата Сообщение от echs Посмотреть сообщение
Оператор GOTO должен быть выше своей метки
Уже вижу фейспалм человека, который всерьёз последует этому совету и спустится на GL2.
0
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
01.02.2017, 17:02
Переключение между блоками.
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SCREEN 13
A:
CLS
PRINT "1"
DO
K$ = INKEY$
IF K$ = "C" THEN GOTO B
LOOP
B:
CLS
PRINT "2"
DO
K$ = INKEY$
IF K$ = "C" THEN GOTO A
LOOP
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
01.02.2017, 17:18
STAR WARS
Это тот самый случай когда применять GOTO
не следует. А ведь я сторонник GOTO.
0
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
21.04.2017, 21:29
Я сейчас программирую на языке Python а GOTO переход там не как найти не могу.Теперь буду там программировать хоть я не сторонник удаления GOTO перехода...
1
 Аватар для CoderHuligan
1745 / 1010 / 257
Регистрация: 30.06.2015
Сообщений: 5,120
Записей в блоге: 56
22.04.2017, 11:01
они нашли друг-друга)
0
0 / 4 / 0
Регистрация: 02.04.2017
Сообщений: 61
12.05.2017, 21:34
Цитата Сообщение от кот Бегемот Посмотреть сообщение
как много слов в некрологе...
На дворе 2017 год. Иванофранковск. Украина. В Колледже электронных приборов (КЭП ИФНТУНГ) до сих пор учат программировать на QuickBasic. Сам недавно был в шоке когда узнал... Следователно господин Бегемот, этот язык не в коей мере не может считаться мёртвым.
0
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
15.01.2023, 19:35
Как с помощью CALL ABSOLUTE и DEF SEG преодолеть GOTO переход?...
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
15.01.2023, 20:54
Преодолеть — в смысле убрать? Откройте редактор и уберите оттуда GOTO.
0
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
15.01.2023, 21:43
Гото переход все выключает а информация из включённой программы передаётся.ассемблером со стороны из компьютера памяти!,.......,..............
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38176 / 21111 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 14
17.01.2023, 11:47
Дискуссия вокруг GoTo - это типичный психологический феномен массового сознания. Дейкстра, разумеется, прав - избыточное использование GoTo приводит к плохому коду. GoTo превратился в мем. А массовое сознание к мышлению не способно. Оно "мыслит" клипово: "Раз Goto, значит плохо". Так же "мыслит" и нейросеть...

Но каждый, кто достаточно хорошо знаком с программированием, понимает: императивное программирование на низком уровне (на существующих архитектурах) вообще невозможно без Goto. Есть Goto и во внутренних языках виртуальных машин (мне так кажется). Есть он и в ряде языков (напр. в C/С++).

Известно также, что все конструкции с GoTo можно реализовать и без него. Но вот эти реализации могут быть довольно неуклюжими. Типичный пример - выход из группы вложенных циклов на самый верхний уровень. Без GoTo это можно сделать с помощью флаговых переменных. Но - довольно "стрёмно". А вот в "политкорректной" джаве GoTo, разумеется, нет. Но!

Вот как решается в джаве приведенная выше проблема:

Java
1
2
3
4
5
6
7
8
9
10
11
    L1: for (int i=...; i<...; i++)
         {
              for (int j=...; j<...;j++)
             {
                   for (int k=...; k<...; k++)
                   {
                       ...
                       if (условие) break L1;
                   } 
              }
           }
Что это, как не форма GoTo? Конечно, это не переход в чистом виде, но нечто весьма к нему близкое!
1
Эксперт по электронике
6800 / 3227 / 335
Регистрация: 28.10.2011
Сообщений: 12,592
Записей в блоге: 7
17.01.2023, 13:58
Цитата Сообщение от Catstail Посмотреть сообщение
Конечно, это не переход в чистом виде, но нечто весьма к нему близкое!
Это переход в чистом виде.
В break должно быть указано сколько вложенных циклов прерывать и переход должен быть в конец прерываемого цикла, а не куда угодно.
Миниатюры
Оператор GOTO: за и против  
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
17.01.2023, 19:20
Просто засовываете этот двойной цикл в функцию и делаете Return когда надо. Вот код на FreeBASIC:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Function FindStringA( _
        ByVal pBufer As UByte Ptr, _
        ByVal BufferLength As Integer, _
        ByVal pStr As UByte Ptr, _
        ByVal Length As Integer _
    )As UByte Ptr
    
    Dim BytesCount As Integer = Length * SizeOf(UByte)
    
    For i As Integer = 0 To BufferLength - Length
        Dim pDestination As UByte Ptr = @pBufer[i]
        Dim Finded As Long = memcmp( _
            pDestination, _
            pStr, _
            BytesCount _
        )
        If Finded = 0 Then
            Return pDestination
        End If
    Next
    
    Return NULL
    
End Function
Будет работать с двойными, тройными и N-арными циклами.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
18.01.2023, 02:21
Цитата Сообщение от Catstail Посмотреть сообщение
Дейкстра, разумеется, прав - избыточное использование GoTo приводит к плохому коду.
Не к плохому, а к трудноструктурируемому.
Плохой код это тот, который не работает или содержит баги.
Лично у меня нет вопросов к спецам, чей код работает прекрасно, есть ли там макароны или нет.

А дядя Эдсгер и его последователь Вирт совместно обосрались по этой теме, добавив в своё творение goto, вместо предполагаемых
"технических средств"(реструктуризация кода), Вирт был не дураком по мозгам, но болваном по жизни, доверяться нужно
не хлипкому теоретику, а толковому практику который делом может показать, а не словом пустым.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Просто засовываете этот двойной цикл в функцию и делаете Return когда надо. Вот код на FreeBASIC:
Идея технически интересна, но несёт с собой крайне избыточное абстрагирование.
Если выразиться простым языком - мы теряем идеологически чистую модульность. Это не макароны, конечно,
но такой прям неприятно рваный код с кучей перебежек туда сюда, которые распыляют внимание.

Добавлено через 5 минут
Но это не о коде выше, а о чём-то потолще.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
18.01.2023, 04:02
Цитата Сообщение от Quiet Snow Посмотреть сообщение
но такой прям неприятно рваный код с кучей перебежек туда сюда, которые распыляют внимание.
Наоборот.
Обычно там где кусок кода с двойным циклом — это что‐то для поиска. Потому что как нашли нам нужно выйти, дальнейшая беготня по циклу не нужна. Логично создать функцию вроде FindЧтото и запихнуть туда этот цикл.
Иногда даже так и пишут в комментариях рядом: /' ищем то‐то и то‐то в массиве '/ что тоже явный признак отдельного логического блока. И таким блокам следует давать название и выносить в функцию.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38176 / 21111 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 14
18.01.2023, 08:00
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Лично у меня нет вопросов к спецам, чей код работает прекрасно, есть ли там макароны или нет.
- тут Вы не вполне правы. "Код работает" - это хорошо, но не всё. Нужно, чтобы он был пригоден к реинжиниригу (т.е. к доработкам). И вот тут "макароны" крайне нежелательны.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
18.01.2023, 18:11
Цитата Сообщение от Catstail Посмотреть сообщение
- тут Вы не вполне правы. "Код работает" - это хорошо, но не всё. Нужно, чтобы он был пригоден к реинжиниригу (т.е. к доработкам). И вот тут "макароны" крайне нежелательны.
Программист в принципе не обязан писать код пригодный к реинжинирингу и вообще выкладывать исходный код
(это его личное дело), более того сейчас есть всякие обфускаторы которые намеренно запутывают код,
в этом смысл даже есть для защиты информации. Но сейчас люди(нормальные) и не пишут макароны,
им для себя же не выгодно это. И разумеется к этому не призываю, а лишь говорю что таких обязательств нет.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Обычно там где кусок кода с двойным циклом — это что‐то для поиска
Почему вдруг? Двойной цикл? И с чего вдруг вообще цикл? ))) А не например не важнее какая-нибудь функция
которую человек хочет изучить или почему например не кусок кода с формулами?
Уверен, что понимаешь что такое модульность и зачем она нужна? Ты же сам радел за сборку объектных файлов.
Представь себе многосложные процедуры по 100, 200, 500, 1000 строк, это же совсем другое дело
они кишат кучей конструкций которые могут делать много всего и где важных деталей не одна и не две,
но процесс должен быть локализован в процедуре, чтобы не тащить лишних деталей в более высокоуровневую
логику программы. Чем более грамотно разбита прога, тем проще по итогу работать с функционалом кода,
проще читать и разбирать код незнакомому человеку.

И вот смотри чел заходит в функцию A и видит 10 вызовов B, C, D, E, F, G, H, I ,J, K и на этом месте его клинит,
потому что теперь он должен в уме припаивать одну к другой, чтобы собрать общую картину. А так он бы просто
читал код, без беготни туда сюда по процедурам.
Модульность как идеология ломается малозначимостью этих B...K функций. И не потому что они
не могут быть короткими, а потому что в них сугубо циклы эти драные, они разбиты не потому что требуют
декомпозиции или выделения по общим признакам задачи или в виде "чёрного ящика"(того что под капотом,
чтобы лишний раз не лезть), а именно разбито просто так, без особого на то смысла.
Человек, привыкнувший к нормальной модульности будет долго ломать бошку зачем это сделали.
Мы получаем излишнюю декомпозицию и бонусом издержки ЦП на вызов этих функций, потому что
их, возможно, будет много, коли всюду придерживаться такой специфики.
Это не та цена, которую стоило бы платить за отказ от GOTO. Лучше GOTO, либо таки воспользоваться флагами.
Вообще внешнее кольцо цикла можно заменить на цикл DO, тогда можно будет выскочить через EXIT DO
не прибегая к клепанию процедур, но даже это плохо(мы это уже обсуждали, кстати), потому как конкретные
конструкции не зря придумали. Городить всегда ради этого процедуру, другой вид цикла или ещё что-нибудь -
ну такое себе. Плюс на практике редко бывает вложенность выше 3-х.

Главная проблема GOTO это не его наличие, а переплетение прыжков, когда прыжки идут в разные места.
И к примеру один прыжок пересекается с другим(одна ветвь кода начинает как-бы рекурсивно по ходу дела
включать в себя другую), т.е. один идёт сверху вниз, второй наоборот. Когда GOTO локализованы,
не пересекаются или имеют чёткую структуру(прыжки в одно место) с ними обычно проблем нет.

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


P.S: Вообще не люблю код, который увидел выше, в нём вообще ноль от бейсика,
там и _ подчёркивания голимые, когда можно и нужно без них, они портят весь вид кода, потом выполнение
функции сразу во время инициализации. Как-бы понятно зачем, но визуально выглядит адски хреново.
Если коду нужна критическая скорость проще написать его на ассемблере, будет адекватнее
и прогер сразу всё поймёт, что это критический кусок и там нужна скорость.
Плюс нету комментов. Т.е. оформление кода, чтобы его удобно было читать, тут - на двоечку.
Попытка усидеть на трёх стульях: выдержать стиль с++, написать критический по производительности код
на бейсике(что лучше не делать) и при этом уйти от GOTO, разрушая модульность(важнейшую вещь).

Программируя на Бейсике лучше сохранять каноны ЯП, например @ можно было бы заменить VARPTR,
SizeOf(UByte) задекларировать как константу оператором CONST в начале программы, не выполнять memcmp
во время DIM (завести переменные до цикла) т.к. это нагромождение двух действий в одну строку.
Раньше очень даже правильно декларации переменных\массивов были отдельно и не было такой возможности,
потому что пихать в них код - ну это писец, это два концептуально разных действия.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
18.01.2023, 19:15
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Почему вдруг? Двойной цикл? И с чего вдруг вообще цикл? ))) А не например не важнее какая-нибудь функция
которую человек хочет изучить или почему например не кусок кода с формулами?
Потому что нет нужны выпрыгивать наружу с формулами. Вычислил — сделал Return result. GOTO тут нет.
А вот выпрыгивать наружу из циклов и даже двойных — это нужно. В VB.NET для этого сделали Exit For For (повторяем столько раз, сколько нужно прыжков).
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Представь себе многосложные процедуры по 100, 200, 500, 1000 строк
На тысячу строк кода? Неудобно читать. Даже 500 строк неудобно.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
И вот смотри чел заходит в функцию A и видит 10 вызовов B, C, D, E, F, G, H, I ,J, K и на этом месте его клинит,
Кто в здравом уме пишет A, B, C, D, E? Так не надо писать. Надо писать: FindString, RemoveEmptyLines, RotateMatrix, DrawRectangle, CreateHttpReader. Такие названия сразу говорят сами за себя и в дублировании комментариями не нуждаются.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
издержки ЦП на вызов этих функций
Нет. ГЦЦ такие штуки прекрасно встраивает, в ассемблерном коде даже отсутствуют команды call и ret.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
там и _ подчёркивания голимые
Не люблю бегать глазами слева направо. Если у функции больше двух параметров, их удобно смотреть в столбик. (VB.NET уже избавился от этих _ в конце строки, и можно писать в столбик без него.)
Цитата Сообщение от Quiet Snow Посмотреть сообщение
SizeOf(UByte) задекларировать как константу оператором CONST в начале программы
Нет, эта штука нужна только внутри этой функции, другие функции знать про неё не должны. Во‐вторых, если функция не в самом начале программы, то придётся листать и прокручивать, что же там означает эта константа.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
не выполнять memcmp
во время DIM (завести переменные до цикла) т.к. это нагромождение двух действий в одну строку
Так быстрее.
Если сделать Dim Finded As Long — это сначала создат переменную и обнулит её, а потом на следующей строка Finded = memcmp(), мы записываем результат функции в Finded. Спрашивается, зачем мы обнуляем переменную, если нуль мы всё равно перезаписываем? Гоняем процессор вхолостую?
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Раньше очень даже правильно декларации переменных\массивов были отдельно
Ну и нет смысла выносить наружу переменную, которая нужна только внутри цикла, внутри условия, или внутри любого блока видимости.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38176 / 21111 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 14
18.01.2023, 19:27
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Программист в принципе не обязан писать код пригодный к реинжинирингу
- если он пишет "в стол". А если работает в команде, то ...
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
18.01.2023, 20:01
Цитата Сообщение от Замабувараев Посмотреть сообщение
Exit For For
В FB вроде тоже сделали? Было же вроде? В PB есть Break.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Неудобно читать. Даже 500 строк неудобно.
Если неудобно - делается дополнительная работа над декомпозицией в т.ч. с процедурами.
Но если этот функционал нежелательно видеть в других процедурах - то его и не надо туда пихать.
500-1000 для меня норм, если внутри всё концептуально собрано. Человек в любом случае должен
будет держать весь этот код в памяти иначе он с ним ничего не сделает, просто чем больше он технического
кода сможет распихать по процедурам строго по смыслу - тем читабельнее будет.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Кто в здравом уме пишет A, B, C, D, E? Так не надо писать. Надо писать: FindString, RemoveEmptyLines, RotateMatrix, DrawRectangle, CreateHttpReader.
Да, собственно, вообще не про имена, это пример масовки, которую юзер узреет. Само собой надо именовать.
Просто когда начнёшь именовать ничего не значащие концептуально куски кода, то станет трудно
это адекватно делать длина имён станет невообразимой, а читающий код вылупит глаза, как в фильме
"вспомнить всё".



Если у функции больше двух параметров, их удобно смотреть в столбик.
Для
_ этого
_ должен
_ быть
_ хелпер
_ в
_ среде
_ разработки
_,
_ а
_ не
_ эта
_ срань
_ в
_ коде
_.

Есть CTRL + вправо, для быстрой пробежки по словам, есть Home\End, можно в теле процедуры (или перед ней)
выделять блок с комментариями и там в подобном стиле растолковывать каждый параметр, это полезно для больших прог.
Некоторые редакторы дают возможность уменьшать масштаб колёсиком. Короче технических средств много.
А это забивает весь экран этими самыми _, неприятно это видеть в коде и читать такой код.

Цитата Сообщение от Catstail Посмотреть сообщение
- если он пишет "в стол". А если работает в команде, то ...
С этим невозможно спорить.
1
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
18.01.2023, 23:00
Цитата Сообщение от Замабувараев Посмотреть сообщение
Если сделать Dim Finded As Long — это сначала создат переменную и обнулит её
Так предложено было это сделать перед циклом(лучше в начале процедуры). Так не будет нагромождения.
А одно лишнее зануление, по отношению к циклу, где действий делается в сотни\тысячи раз больше -
ровным счётом ни на что не повлияет. Да и если на то пошло, что доходит до того,
что мы вынуждены считать зануления и мелкие аспекты внутренней работы операторов бейсика,
то это звоночек, что пора уже писать на уровне ниже или использовать память вручную,
а не вымучивать всё это на бейсике, так хотя бы прозрачнее. Ну если уровень заморочек вырос настолько.
А так да FB гибок, наворотили по-взрослому, но для старожилов от Бейсика это выглядит как-то
совсем с ног на голову.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Ну и нет смысла
Смысл в группировке всей используемой и заводимой памяти, т.е. писать код без нагромождения этих DIM.
Чтобы быстро найти нужную переменную в начале программы\подпрограммы или соотв. быстро понять
задекларирована она или нет.
Банально, пишешь прогу, тебя отвлекли, отошёл, вернулся, уже не помнишь что где декларировал,
проверять несколько сот строк пестрящих переменными - как бы идея не очень. А так вернулся в начало функции,
последние задекларированные видно сразу, сразу проверил чего не хватает и тут же дописал.
Обычно вешаю закладку на начало и на место, где сейчас пишется код. 1 клик - и уже в нужном месте.
В общем-то ничего нового и отсебятинского не говорю, люди на QB с давних пор, так делали, группировали,
константы, декларации типов, прототипы процедур, декларации массивов, потом шёл код и процедуры.
Когда у тебя в программе всё по полочкам - совсем другое дело, на неё приятно смотреть.
Мне не всегда удаётся этому следовать, FB и современные IDE сильно развращают, но как бы
эталон есть эталон, не просто так в QB это было сделано, реально приучало к порядку.
На асме например тоже было важно настроить и заассумить сегменты сразу, это просто давало порядок
в программе. Это примерно как порядок на рабочем месте, отвёртка в одном месте, молоток в другом и т.п.
Конечно это не помешает разложить код, просто немного пофыркаю, делая оформительскую работу
за другого человека, всё равно это время и его жалко.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2023, 23:00
Помогаю со студенческими работами здесь

Оператор GOTO
Дано 50 вещественных чисел. Определить наибольшую величину из них. С помощью оператора GOTO

Оператор goto
Как передать управление из одного класса в другой c помощью goto(или как то по другому)?

Оператор GOTO
GOTO в топку. В нормальных языках нужны только циклы, а GOTO пусть останется только для *.bat, и *.cmd файлов.

оператор GoTo
Ввести с клавиатуры произвольное целое число X в диапазоне от 80 до 500. Если введенное число X не соответствует указанному диапазону, с...

Безусловный оператор GoTo
Доказать (путем перебора возможных значений), что для любых величин А,В,С типа Boolean следующие пары логических выражений имеют одинаковые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru