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

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

20.11.2011, 16:38. Показов 15148. Ответов 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
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
28.01.2017, 12:50
Студворк — интернет-сервис помощи студентам
кот Бегемот
Я такой программы не написал бы. У меня все
GOTO осуществляют переход вниз. Вверх - никогда!
Именно переход вверх (назад) и путает программистов.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.01.2017, 13:04
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Как бы решил такую реальную задачу компетентный программист
Он бы подумал нужно ли её вообще решать и насколько верно, в концептуальном плане оно спроектировано.
Конечно допускаю, что где-то(достаточно редко) вложенные циклы в количестве 100500 может быть и
нужны, но подкорка головного мозга понимает, что за прогу, которая прошибает бошкой стену и вешает
проц намертво, никто ничего не заплатит.
В подавляющем большинстве недетерминированных задач использовать полный перебор - себе дороже.
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
28.01.2017, 13:42
Quiet Snow
Мне кажется, что вы не до оцениваете применение
кратных циклов в большом количестве для практики.
Обычно и не требуется ТОТАЛЬНЫЙ ПЕРЕБОР.
А требуется строго определенное выполнение самого
внутреннего цикла (там может быть и условие). Иными
словами такие программы работают достаточно быстро
и в ряде случаев эффективно. Им помогает GOTO.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.01.2017, 13:52
Цитата Сообщение от echs Посмотреть сообщение
Мне кажется, что вы не до оцениваете применение
кратных циклов в большом количестве для практики
Для какой практики? Покажите хоть одного человека(исключая студентов и школоту) кому
нужны ваши программы, какие программы и как их можно применить для чего-то полезного...
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
28.01.2017, 13:56
Цитата Сообщение от Quiet Snow Посмотреть сообщение
вешает
проц намертво
Ну это аргумент из прошлого века. Что бы повесить современный проц надо как минимум создать многопоточное приложение и одновременно загрузить все потоки. Грамотно используя многопоточность можно и циклы юзать, и одновременно решать другие задачи, если цель оправдывает средства.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.01.2017, 15:07
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ну это аргумент из прошлого века.
Это нормальный аргумент. В офисах полно говнотачек, целеронов с седьмой виндой и
гигом памяти, да и даже старее компы не списывают. Но даже если и седьмой кор,
это не повод поддерживать подход переборов и тотальный подход многопоточности.
Нужно рассчитывать на то, что прогу могут запустить на самом убогом оборудовании.
Про многоядерность говорил ещё с 2004 года - что оно тупиково, сейчас это отчётливо
видно(12 ядер да сваяли, а частота какая? И как там будет работать одноядерная прога...
знамо как, как кусок какахи...), а единственное где применяется эта самая многоядерность,
так это развесить программы по ядрам, ну или в видеокодеках, то что можно дёшево
распараллелить. В итоге люди предпочитают брать поменьше ядер и побольше частоту,
да ещё и разгоняют свои бедные процессорики, сдавая их через два-три года в БУ,
да гонимое железо нормально подолгу не работает.
Во-первых современные компы недалеко ушли по сравнению с теми же пеньками прескотами
в плане одноядерных задач и если бы не SIMD и толстые кеши, то разница была бы не сильно
очевидная, во-вторых ресурсы всегда сильно ограничены, а пользователь всегда хочет
комфорта, удобства и чтобы не было подвисаний и фризов, поэтому более интеллектуальные
подходы как правило работают лучше.

На самом деле многоядерность это штука довольно нестабильная, в плане своей концепции,
Далеко не каждую архитектуру можно нормально заточить с учётом всех факторов.
К тому же она значительно усложняет архитектуру софта.
Приведу пример, сижу, допустим поигрываю на гитарке, повесил VSTHost на одно ядро
дал ему приоритет, вдруг с бодуна касперыч или любой другой софт резко начинает
конкурентно отбирать ЦП у VST хоста, тот начинает хрипеть, т.к. сбивается вся
синхронизация (там дабл буфер флипующийся аппаратно с нотификацией) и что мне это
должно доставить наслаждение, рестартать движок каждый раз когда, либо скайп что-то
пукнет, либо анвирь полезет сканировать или обновляться(а его на ядра другие нельзя
перевесить). Также с другим софтом, под XP и семёркой(в меньшей степени но тоже есть)
чувствуется когда первое ядро забито под завязку, начинает останавливаться вся система.
Загружаешь больше 40% на всех ядрах, реалтайма уже не видать(на далеко не слабом
оборудовании при грамотном распределении софта по ядрам), проги начинают тупить,
фризить, заикаться, потому что есть такой фактор как шина данных\команд и она не резиновая
(напомню что в любой многопоточной системе всё это добро(не заточенное, т.е. код который
называют небезопасным, а его валом) по итогу хардварно сводится в последовательный процесс,
т.к. железо не может просто взять и забить на свои функции, если 4 потока захотят одновременно
без специальных средств синхронизации получить доступ к одному участку памяти, шина
данных окажется в затруднительном положении, но хардвар обязан будет такую ситуацию
обработать исходя из распределения возможностей своих конвейеров, силу боттлнека на
12 ядерном компе даже боюсь представить, там шина конечно толстенная, но боюсь она
этого не стерпит...
Самый пожалуй дерьмовый фактор - когда программа не может знать сколько ресурсов есть в
системе, т.к. на них постоянно влияют другие приложения. В таких условиях прога должна быть
либо адски заточена потреблять с каждого ядра по чуть чуть и при этом насытиться, либо
исповедовать старую проверенную временем идеологию - быть оптимизированной настолько
насколько это возможно под одно ядро, но при определённых процессах занимать и другие ядра.
Конечно этим всё не ограничивается, сейчас люди ковыряют и мелкозернистое распараллеливание,
может это в будущем и будет той целевой нишей многоядерности вкупе со всякими OpenCL и CUDA,
но сейчас многоядерность слишком неэффективна, а кодеры слишком плотно разожрались увидев
гигабайты холёной оперативы.
0
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
28.01.2017, 19:32
Как без гото переходить от одного блока к другому блоку?У меня там программа готовая весит в одной из 2 моих тем, откройте её и перепишите для меня пожалуйста без гото.Я ясно себе всё представляю и на такую простую тему разговаривать не хочу.

Добавлено через 24 минуты
Простейший способ создавать блоки использовать SLEEP 1000 чтобы сразу не пролетело без нажатия вами кнопки.
0
Эксперт по электронике
6818 / 3243 / 337
Регистрация: 28.10.2011
Сообщений: 12,654
Записей в блоге: 7
28.01.2017, 19:33
Цитата Сообщение от STAR WARS Посмотреть сообщение
Как без гото переходить от одного блока к другому блоку
Оформить блоки в виде процедур / функций и вызывать их.
0
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
28.01.2017, 19:46
Впереди идущие данные должны быть в программе уничтожены.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
29.01.2017, 01:43
Цитата Сообщение от STAR WARS Посмотреть сообщение
Простейший способ создавать блоки использовать SLEEP 1000 чтобы сразу не пролетело без нажатия вами кнопки.
Цитата Сообщение от STAR WARS Посмотреть сообщение
Впереди идущие данные должны быть в программе уничтожены.
Вы на форум пошутить пришли?
Какие блоки через SLEEP?
Какие "Впереди идущие данные"?

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

Поэтому для этой задачи лучше использовать логику на защёлках. Внутри процедур
переходы допустимы, но в почти 100% случаев как раз внутри хорошо оформленных процедур
они и не нужны. Исключение - это обработчики ошибок.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
29.01.2017, 09:30
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Исключение - это обработчики ошибок
Либо очистка каких-либо данных при выходе из процедуры дабы не делать многоэтажные блоки IF.
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
29.01.2017, 13:47
Реальная программа с оператором GOTO
конечно я могу написать и без оператора GOTO, но
кода будет несколько больше
(данная программа вычисляет и распечатывает на экран
простые числа от 5 до 97)
Это тот случай где GOTO делает программу проще и яснее!!

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
CLS
 
FOR p = 5 TO 100 STEP 2
   dm = SQR(p) + .5
 
   FOR d = 3 TO dm STEP 2
      IF p MOD d = 0 THEN GOTO 2017
   NEXT d
   PRINT p
 
2017
NEXT p
END
0
Эксперт по электронике
6818 / 3243 / 337
Регистрация: 28.10.2011
Сообщений: 12,654
Записей в блоге: 7
29.01.2017, 14:45
Del
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
29.01.2017, 16:53  [ТС]
Цитата Сообщение от echs Посмотреть сообщение
Реальная программа с оператором GOTO
конечно я могу написать и без оператора GOTO, но
кода будет несколько больше
(данная программа вычисляет и распечатывает на экран
простые числа от 5 до 97)
Это тот случай где GOTO делает программу проще и яснее!!
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
FOR p = 5 TO 100 STEP 2
 dm = SQR(p) + .5
FOR d = 3 TO dm STEP 2
 IF p MOD d = 0 THEN GOTO 2017
 NEXT d
 PRINT p
2017
NEXT p
END
а вот без GOTO
QBasic/QuickBASIC
1
2
3
4
5
6
7
FOR i = 5 TO 97
f = 0
FOR j = 2 TO i - 1
IF i MOD j = 0 THEN f = 1
NEXT
IF f = 0 THEN PRINT i;
NEXT
Ну и где проще и яснее?
0
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
29.01.2017, 17:01
В математике бывает плюс и минус не использовать гото это всё равно что из математики удалить минус.Процедуры,функции,подпрограммы увеличивают делая вставку в программу это как в математике знак плюс а гото выключение части программы это как знак минус.
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
29.01.2017, 23:20  [ТС]
Цитата Сообщение от STAR WARS Посмотреть сообщение
В математике бывает плюс и минус не использовать гото это всё равно что из математики удалить минус.Процедуры,функции,подпрограммы увеличивают делая вставку в программу это как в математике знак плюс а гото выключение части программы это как знак минус.
В математике кроме плюса и минуса есть ещё знак дырбыдыр. Он на хрен никому не нужен, и нормальные математики прекрасно без него обходятся. Но есть сдвинутые по фазе математики, которые не могут жить без дырбыдыра, они и сами его пихают везде, где ни попадя, и другим навязывают...
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
30.01.2017, 09:45
Мне кажется, что можно подвести некоторые итоги.
Итак, я представляю лагерь сторонников GOTO.

ОБВИНЕНИЕ: GOTO усложняет понимание программы

1. ОДИН оператор GOTO не превратит программу в
головоломку, так что Один GOTO для программы вполне
приемлем.

2. Оператор GOTO целесообразно применять для выхода
из сложных конструкций.

3. Оператор GOTO должен быть выше своей метки

4. Метка должна быть чётко видна и занимать целую строку

примечание
если соблюдать эти правила, то GOTO внесёт Смысл в
Вашу бессмысленную жизнь!!

(впрочем есть люди, у которых аллергия на GOTO и выше
сказанное к ним не относится)
1
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
30.01.2017, 10:01  [ТС]
Цитата Сообщение от echs Посмотреть сообщение
1. ОДИН оператор GOTO не превратит программу в
головоломку, так что Один GOTO для программы вполне
приемлем.
Это смотря куда идёт отсыл.
Цитата Сообщение от echs Посмотреть сообщение
2. Оператор GOTO целесообразно применять для выхода
из сложных конструкций.
Выше Я Вам привёл ответ на Ваш вопрос как обойтись без GOTO. В итоге программа стала проще и выход нашёлся...
Цитата Сообщение от echs Посмотреть сообщение
3. Оператор GOTO должен быть выше своей метки
4. Метка должна быть чётко видна и занимать целую строку
А зачем все эти сложности, если можно вообще без GOTO?

PS Лет 20 я программировал на Бейсике и написал за свою жизнь столько операторов GOTO, сколько Вам во сне присниться не может. Это трудности роста. Когда Вы изучите какой-нибудь нормальный язык, Вы забудете GOTO навсегда и будете (как и я) с улыбкой вспоминать свои доводы в его защиту.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
30.01.2017, 10:31
Цитата Сообщение от кот Бегемот Посмотреть сообщение
А зачем все эти сложности, если можно вообще без GOTO?
К примеру такой реальный код:
Visual Basic
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
Public Function CreateIPicturePngFromMemory( _
                ByVal pData As Long, _
                ByVal lSize As Long) As IPicture
    Dim hMem            As Long
    Dim pLocData        As Long
    Dim pIStream        As IUnknown
    Dim tGdipSI         As GdiplusStartupInput
    Dim lGdipToken      As Long
    Dim hGdipImg        As Long
    Dim hDib            As Long
    Dim rc              As RECT
    Dim bI              As BITMAPINFO
    Dim hdc             As Long
    Dim pBitsData       As Long
    Dim bmpData         As BitmapData
    Dim IID_IPicture    As Guid
    Dim picDesc         As PICTDESC
    Dim pIPicture       As IPicture
 
    tGdipSI.GdiplusVersion = 1
    
    If GdiplusStartup(lGdipToken, tGdipSI) Then Exit Function
    
    hMem = GlobalAlloc(GMEM_MOVEABLE, lSize)
    If hMem = 0 Then GoTo CleanUp
    
    pLocData = GlobalLock(hMem)
    If pLocData = 0 Then GoTo CleanUp
    
    memcpy ByVal pLocData, ByVal pData, lSize
    
    GlobalUnlock hMem
    
    If CreateStreamOnHGlobal(hMem, True, pIStream) Then GoTo CleanUp
    If GdipLoadImageFromStream(pIStream, hGdipImg) Then GoTo CleanUp
    If GdipGetImageWidth(hGdipImg, rc.Right) Then GoTo CleanUp
    If GdipGetImageHeight(hGdipImg, rc.Bottom) Then GoTo CleanUp
    
    With bI.bmiHeader
    
        .biBitCount = 32
        .biHeight = -rc.Bottom
        .biWidth = rc.Right
        .biPlanes = 1
        .biSize = Len(bI.bmiHeader)
        
    End With
    
    hdc = GetDC(0)
    If hdc = 0 Then GoTo CleanUp
    
    hDib = CreateDIBSection(hdc, bI, 0, bmpData.scan0, 0, 0)
    If hDib = 0 Then GoTo CleanUp
    
    With bmpData
    
        .Height = rc.Bottom
        .Width = rc.Right
        .PixelFormat = PixelFormat32bppPARGB
        .stride = .Width * 4
    
    End With
    
    If GdipBitmapLockBits(hGdipImg, rc, ImageLockModeUserInputBuf Or _
                          ImageLockModeRead, PixelFormat32bppPARGB, bmpData) Then GoTo CleanUp
    If GdipBitmapUnlockBits(hGdipImg, bmpData) Then GoTo CleanUp
    
    IIDFromString StrPtr("{7BF80980-BF32-101A-8BBB-00AA00300CAB}"), IID_IPicture
    
    picDesc.cbSizeofstruct = Len(picDesc)
    picDesc.hbmp = hDib
    picDesc.picType = vbPicTypeBitmap
    
    If OleCreatePictureIndirect(picDesc, IID_IPicture, True, pIPicture) Then GoTo CleanUp
 
    If Not ModifyIPicture(pIPicture) Then GoTo CleanUp
    
    Set CreateIPicturePngFromMemory = pIPicture
    
CleanUp:
    
    If hdc Then ReleaseDC 0, hdc
    If hGdipImg Then GdipDisposeImage hGdipImg
    
    If Not pIStream Is Nothing Then
        Set pIStream = Nothing
    Else
        GlobalFree hMem
    End If
    
    If CreateIPicturePngFromMemory Is Nothing Then
    
        If hDib Then DeleteObject hDib
        
    End If
    
    GdiplusShutdown lGdipToken
    
End Function
Метка CleanUp здесь - очистка всех ресурсов. Этот код можно записать вложенными конструкциями If/EndIf:
Visual Basic
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
Public Function CreateIPicturePngFromMemory( _
                ByVal pData As Long, _
                ByVal lSize As Long) As IPicture
    Dim hMem            As Long
    Dim pLocData        As Long
    Dim pIStream        As IUnknown
    Dim tGdipSI         As GdiplusStartupInput
    Dim lGdipToken      As Long
    Dim hGdipImg        As Long
    Dim hDib            As Long
    Dim rc              As RECT
    Dim bI              As BITMAPINFO
    Dim hdc             As Long
    Dim pBitsData       As Long
    Dim bmpData         As BitmapData
    Dim IID_IPicture    As Guid
    Dim picDesc         As PICTDESC
    Dim pIPicture       As IPicture
 
    tGdipSI.GdiplusVersion = 1
    
    If GdiplusStartup(lGdipToken, tGdipSI) Then Exit Function
    
    hMem = GlobalAlloc(GMEM_MOVEABLE, lSize)
    If hMem = 0 Then
        
        pLocData = GlobalLock(hMem)
        If pLocData Then
        
            memcpy ByVal pLocData, ByVal pData, lSize
            
            GlobalUnlock hMem
            
            If CreateStreamOnHGlobal(hMem, True, pIStream) = 0 Then
                If GdipLoadImageFromStream(pIStream, hGdipImg) = 0 Then
                    If GdipGetImageWidth(hGdipImg, rc.Right) = 0 Then
                        If GdipGetImageHeight(hGdipImg, rc.Bottom) = 0 Then
            
                            With bI.bmiHeader
                            
                                .biBitCount = 32
                                .biHeight = -rc.Bottom
                                .biWidth = rc.Right
                                .biPlanes = 1
                                .biSize = Len(bI.bmiHeader)
                                
                            End With
                            
                            hdc = GetDC(0)
                            If hdc Then
                            
                                hDib = CreateDIBSection(hdc, bI, 0, bmpData.scan0, 0, 0)
                                
                                If hDib Then
                                    
                                    With bmpData
                                    
                                        .Height = rc.Bottom
                                        .Width = rc.Right
                                        .PixelFormat = PixelFormat32bppPARGB
                                        .stride = .Width * 4
                                    
                                    End With
                                    
                                    If GdipBitmapLockBits(hGdipImg, rc, ImageLockModeUserInputBuf Or _
                                                          ImageLockModeRead, PixelFormat32bppPARGB, bmpData) = 0 Then
                                        If GdipBitmapUnlockBits(hGdipImg, bmpData) = 0 Then
                                            
                                            IIDFromString StrPtr("{7BF80980-BF32-101A-8BBB-00AA00300CAB}"), IID_IPicture
                                            
                                            picDesc.cbSizeofstruct = Len(picDesc)
                                            picDesc.hbmp = hDib
                                            picDesc.picType = vbPicTypeBitmap
                                            
                                            If OleCreatePictureIndirect(picDesc, IID_IPicture, True, pIPicture) = 0 Then
                                                If ModifyIPicture(pIPicture) Then
                                                    Set CreateIPicturePngFromMemory = pIPicture
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        End If
    End If
 
    If hdc Then ReleaseDC 0, hdc
    If hGdipImg Then GdipDisposeImage hGdipImg
    
    If Not pIStream Is Nothing Then
        Set pIStream = Nothing
    Else
        GlobalFree hMem
    End If
    
    If CreateIPicturePngFromMemory Is Nothing Then
    
        If hDib Then DeleteObject hDib
        
    End If
    
    GdiplusShutdown lGdipToken
    
End Function
Но для меня этот способ выглядит более громоздким (у меня последние строчки даже не помещаются в область окна), поэтому для очистки ресурсов я использую GoTo. Второй момент это то что при добавлении каких-либо ресурсов в код я могу также просто сделать освобождение ресурсов просто прыгнув на CleanUp. К примеру в C++ можно обернуть это в конструкцию try/catch, но по производительности это гораздо медленней goto. Вот кстати тоже хороший пример - https://msdn.microsoft.com/en-... s.85).aspx там тоже использование goto намного повышает чтаемость года, нежели это было бы сделано посредством вложенных условий.
2
 Аватар для CoderHuligan
1753 / 1018 / 257
Регистрация: 30.06.2015
Сообщений: 5,130
Записей в блоге: 56
30.01.2017, 12:30
Цитата Сообщение от кот Бегемот Посмотреть сообщение
Выше Я Вам привёл ответ на Ваш вопрос как обойтись без GOTO. В итоге программа стала проще и выход нашёлся...
Стал ли он более эффективен?
Цитата Сообщение от кот Бегемот Посмотреть сообщение
Ну и где проще и яснее?
Там, где нет флагов.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2017, 12:30
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru