Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор goto, Забыл как пользоваться 
:(
    Опции темы
bartram
  Дата 6.10.2004, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: нет
Всего: 29



Забыл как пользоватся оператооом goto, помогите вспомнить? rolleyes.gif


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
Alex
Дата 6.10.2004, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 162



А позволь спросить, ЗАЧЕМ??? qstn.gif


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
p0s0l
Дата 6.10.2004, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Код
label metka1;
...
begin
 goto metka1;

metka1:
 ...
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
bartram
Дата 6.10.2004, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: нет
Всего: 29



Цитата(Alex @ 6.10.2004, 15:51)
А позволь спросить, ЗАЧЕМ???

А ты что не знаешь зачем он используется...?



--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
p0s0l
Дата 6.10.2004, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



bartram, просто всегда можно обойтись без goto.
Я лично вообще им не пользуюсь. ИМХО, это некрасиво...



--------------------
С уважением, г-н Посол.
PM   Вверх
bartram
Дата 6.10.2004, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: нет
Всего: 29



Цитата(p0s0l @ 6.10.2004, 16:35)
bartram, просто всегда можно обойтись без goto. Я лично вообще им не пользуюсь. ИМХО, это некрасиво...

Можешь предложить альтернативу?


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
Garabar
Дата 6.10.2004, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 15.9.2004

Репутация: нет
Всего: 1



Цитата
Можешь предложить альтернативу?

Ууу... приведи пример где без него не обайтись biggrin.gif
PM MAIL   Вверх
p0s0l
Дата 6.10.2004, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Приведи конкрентый код, где ты используешь goto, и попробуем сделать без goto...



--------------------
С уважением, г-н Посол.
PM   Вверх
Garabar
Дата 6.10.2004, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 15.9.2004

Репутация: нет
Всего: 1



Цитата
Приведи конкрентый код, где ты используешь goto, и попробуем сделать без goto...

Спорим на ящик пива не приведёт))))
PM MAIL   Вверх
Akina
Дата 6.10.2004, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Garabar
Цитата
Спорим на ящик пива не приведёт

на Дельфах, пожалуй, нет... на Барсике - запросто biggrin.gif


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Garabar
Дата 6.10.2004, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 15.9.2004

Репутация: нет
Всего: 1




[/quote]на Дельфах, пожалуй, нет... на Барсике - запросто [quote]
Ну мы же добропорядочные форумисты))) не забываем тему форума))))
PM MAIL   Вверх
p0s0l
Дата 6.10.2004, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



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



--------------------
С уважением, г-н Посол.
PM   Вверх
Pakshin A. S.
Дата 6.10.2004, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Давайте ваш код! С циклами While & Repeat всё можно решить и без break, exit и меток!!!
PM   Вверх
Alex
Дата 6.10.2004, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 162



я бы сказал так писать как угодно, но только не с использованием goto


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Pakshin A. S.
Дата 6.10.2004, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Когда меня учили, мне говорили: забудь про метки и GoTo!
PM   Вверх
Girder
Дата 7.10.2004, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Цитата
Когда меня учили, мне говорили: забудь про метки и GoTo!
Тут дело вот в чем: очень часто люди освоив что либо, перестают в последствии восполнять знания в этом вопросе.
Лично я не вижу ни чего плохого в использовании Goto в последних версия компилятора, единственное что плохо: читабельность кода ухудшается и можно запутать компилятор в генерации оптимального кода.
Рассмотрим примеры:
-Компилятор "запутался" smile.gif
Код
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
label i_Zero,i_NoZero;
begin
i:=100;
Caption:='';
if i<>0 then goto i_NoZero else goto i_Zero;
i_NoZero:
Caption:=IntToStr(i);
i_Zero:
end;
Если посмотреть мнемонику скомпилированного кода - увидем два перехода (т.е. один лишний!)
Код
test esi,esi
jz +$02
jmp +$14
Т.е. не есть гуд!
-Компилятор справился smile.gif
Код
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
label i_Zero,i_NoZero;
begin
i:=100;
Caption:='';
if i=0 then goto i_Zero else goto i_NoZero;
i_NoZero:
Caption:=IntToStr(i);
i_Zero:
end;
Если посмотреть мнемонику этого кода - увидем один переход! Компилятор справился smile.gif
Код
test esi,esi
jz +$14

-Код без Goto
Код
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
i:=100;
Caption:='';
if i<>0 then
 begin
  Caption:=IntToStr(i);
 end;
end;
Сгенерированный код полностью эквивалентен второму примеру, как говорится без комментариев. Т.е. во втором примере использование Goto не ухудшил скомпилированный код!

PS: В более ранних версиях компилятор был не такой "умный" smile.gif (когда он по умнел - уже не помню) . И не надо забывать что язык высокого уровня - это "абстракция". В реальности будут и переходы и все такое, вопрос в другом - на сколько это будет оптимально, для предсказаний ветвлений! Ну и на последок: при работе с портами очень часто необходимо добавлять "переходы-заглушки"(без комментариев).

Это сообщение отредактировал(а) Girder - 7.10.2004, 09:56


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
bartram
  Дата 7.10.2004, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: нет
Всего: 29



Цитата(Girder @ 7.10.2004, 09:54)
Цитата
Когда меня учили, мне говорили: забудь про метки и GoTo!
Тут дело вот в чем: очень часто люди освоив что либо, перестают в последствии восполнять знания в этом вопросе.
Лично я не вижу ни чего плохого в использовании Goto в последних версия компилятора, единственное что плохо: читабельность кода ухудшается и можно запутать компилятор в генерации оптимального кода.
Рассмотрим примеры:
-Компилятор "запутался" smile.gif
Код
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
label i_Zero,i_NoZero;
begin
i:=100;
Caption:='';
if i<>0 then goto i_NoZero else goto i_Zero;
i_NoZero:
Caption:=IntToStr(i);
i_Zero:
end;
Если посмотреть мнемонику скомпилированного кода - увидем два перехода (т.е. один лишний!)
Код
test esi,esi
jz +$02
jmp +$14
Т.е. не есть гуд!
-Компилятор справился smile.gif
Код
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
label i_Zero,i_NoZero;
begin
i:=100;
Caption:='';
if i=0 then goto i_Zero else goto i_NoZero;
i_NoZero:
Caption:=IntToStr(i);
i_Zero:
end;
Если посмотреть мнемонику этого кода - увидем один переход! Компилятор справился smile.gif
Код
test esi,esi
jz +$14

-Код без Goto
Код
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
i:=100;
Caption:='';
if i<>0 then
 begin
  Caption:=IntToStr(i);
 end;
end;
Сгенерированный код полностью эквивалентен второму примеру, как говорится без комментариев. Т.е. во втором примере использование Goto не ухудшил скомпилированный код!

PS: В более ранних версиях компилятор был не такой "умный" smile.gif (когда он по умнел - уже не помню) . И не надо забывать что язык высокого уровня - это "абстракция". В реальности будут и переходы и все такое, вопрос в другом - на сколько это будет оптимально, для предсказаний ветвлений! Ну и на последок: при работе с портами очень часто необходимо добавлять "переходы-заглушки"(без комментариев).

Вот, вот именно это я и имел ввиду! А вы тут зачем go to без него можно обойтись! Свой пример попозже напишу...


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
EKoshelev
Дата 8.10.2004, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



А когда меня учили (я тогда ещё на спектруме программировал и ессно не знал что такое уайл и репит-антил). Дак вот тот человек в очень корректной форме нам хотел сказать, что goto в своих прогах используют только самые распоследние "№"%:?;%"№ и #$%#@... Я конечно ни на чего не намекаю... adv/54.gif


bartram
Давай пиши свой код с готами или алгоритм кидай. Я готов спорить на миллиард ящиков пива adv/76.gif, что любую хрень можно без готов написать.

Это сообщение отредактировал(а) EKoshelev - 8.10.2004, 08:30


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Zzz
Дата 8.10.2004, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 21.2.2003
Где: Мурманск

Репутация: 1
Всего: 5



Цитата(EKoshelev @ 8.10.2004, 00:22)
bartram
Давай пиши свой код с готами или алгоритм кидай. Я готов спорить на миллиард ящиков пива adv/76.gif, что любую хрень можно без готов написать.

Ну давай:

Сделать бесконечную (зацикливающуюся) программу на языке Паскаль без использования asm-вставок, циклов. Программа заносит в 300 порт "1". Программа носит учебный характер.

Мой пример
Код

l1 : port[$300]:=1;
goto l1;


smile.gif))))))))))

Ваш пример:

Это сообщение отредактировал(а) Zzz - 8.10.2004, 09:04


--------------------
Бесполезной громоздкой надстройкой является Windows от Майкрософт. Она занимает 1Мб памяти диска и рассчитана на использование устройства типа мышь.

"ЭВМ в инженерной практике" М. 1989г.
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 8.10.2004, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Код

begin
port[$300]:=1;
Exec('C:\MyProg.exe') {Точно не помню, но суть запуск exe-файла}
end.

biggrin.gif
Добавлено @ 13:00
Цитата(Zzz @ 8.10.2004, 10:03)
без использования asm-вставок, циклов.

А что, прямо так и задано?! omg.gif

Это сообщение отредактировал(а) Pakshin A. S. - 8.10.2004, 12:59
PM   Вверх
EKoshelev
Дата 8.10.2004, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Zzz

A чё вот так нельзя?

Код

while true do port[$300]:=1

Добавлено @ 14:47
А чё-то это, блин, да... Я не понял, что значит без циклов? Чё ещё за условие такое имбицильное?


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Girder
Дата 8.10.2004, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



p0s0l спасибо... что перенес этот топик в этот раздел - где ему самое место!

PS: Большая просьба - bartram-а не обижать в последствии!

Ну... у кого какие мнения?

Это сообщение отредактировал(а) Girder - 8.10.2004, 19:27


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
chipset
Дата 8.10.2004, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 4
Всего: 165



Цитата
без использования asm-вставок, циклов.

Это надуманная задача и непрактичная.
я видел примеры где без goto обойтись.. точно, но не помню где
в некоторых случаях оно действительно помогает, если надо быстро выпрыгнуть за пару скобок без громадины исключений и.т.д..

Добавлено @ 19:39
Всё ИМХО


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
MacTep
Дата 8.10.2004, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Мне сказали, что goto - это дурной тон программирования. Метки используются только в ассемблере, а это уже совсем другая история! smile.gif


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Sun
Дата 8.10.2004, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 3
Всего: 48





--------------------
Account removed
PM MAIL   Вверх
Pakshin A. S.
Дата 9.10.2004, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Цитата(Zzz @ 8.10.2004, 10:03)
без использования asm-вставок, циклов

Цитата(Girder @ 8.10.2004, 20:26)
Ну... у кого какие мнения?

Цитата(Pakshin @ 8.10.2004, 13:56)
begin
port[$300]:=1;
Exec('C:\MyProg.exe') {Точно не помню, но суть запуск exe-файла}
end.

Код

procedure Port1;
begin
port[$300]:=1;
Port1
end;

begin
Port1
end.


Вот два примера решения задачи без использования asm и циклов!
PM   Вверх
p0s0l
Дата 9.10.2004, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Только стек-то не резиновый...



--------------------
С уважением, г-н Посол.
PM   Вверх
Pakshin A. S.
Дата 9.10.2004, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Sorry, не понял... sad.gif
PM   Вверх
p0s0l
Дата 9.10.2004, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Во втором случае у тебя рекурсивная процедура.
При каждом вызове в стек будет заносится адрес возврата...


--------------------
С уважением, г-н Посол.
PM   Вверх
Dr.Death
Дата 9.10.2004, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 950
Регистрация: 15.7.2003
Где: Волгоград

Репутация: нет
Всего: 1



Pakshin A. S.
При вызове процедуры у тебя заноситься в стэк адрес, откуда был вызвана она, при завершении он изымается и делается return на то место, откуда была вызвана процедура. А в твоем случае получается, что никогда не будет возвращение, все время запись в стэк. А стэк у нас ограничен в размерах.


--------------------
Жизнь коротка, чтобы быть в ней слабым.© Арнольд Шварцнеггер
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 10.10.2004, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Хотя, признаться, есть исключение...Если прога скомпилирована для реального режима, то при переполнении стека ничего не произойдёт критичного, т.к. никакой проверки в этом режиме не происходит: просто когда в стек занесут 64кб данных, заполнение пойдёт заново...



--------------------
С уважением, г-н Посол.
PM   Вверх
Pakshin A. S.
Дата 10.10.2004, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



А как насчет этого:
Код

begin
port[$300]:=1;
Exec('C:\MyProg.exe') {Точно не помню, но суть запуск exe-файла}
end.

PM   Вверх
Girder
Дата 10.10.2004, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Pakshin A. S. приведу два примера, но без goto.

1)
Код
if (R=0)or(R2=0) then
begin
 ...
end;

2)
Код
if (R and R2)=0 then
begin
 ...
end;

В чем разница и если она? ответь... просто интересно лично твое мнение.

Забыл добавить smile.gif :
-вариант 1: R и R2 - есть бит;
-вариант 2: R и R2 - размерностью больше чем один бит.

Это сообщение отредактировал(а) Girder - 11.10.2004, 02:09


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Chingachguk
Дата 10.10.2004, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Girder

Прими мое уважение за хороший анализ целесообразности применения goto. Большинство людей где-то услышали эту "аксиому" - типа goto это ацтой и повторяют это не задумываясь - а собственно почему ?

Насчет задачи, где goto может быть нужен: табличные переходы. Это относится к тем, кто пишет switch с парой сотен условий.




--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
NightGoblin
Дата 11.10.2004, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



А, по-моему, если кто-то по ночам зажигает звезды, значит, это кому-нибудь нужно...

Или goto просто забыли убрать из C++ за ненадобностью?...

Согласен, читаемость он ухудшает. Согласен, почти всегда без него можно обойтись. Но иногда (подчеркиваю - иногда, даже редко) возникают такие ситуации, что писать "кошерный" код без единого goto оборачивается существенной потерей производительности. Да и читаемость ухудшить можно и без всяких goto - неужели вам не попадались программы, нечитаемые из-за одного только форматирования?
Добавлено @ 06:00
Zzz, извини, но я поддержу тех, кто сказал, что это надуманная и ненужная задача. Зачем кому-то понадобилось делать что-то без циклов?... Думаю, все же полезнее будет обсудить использование goto в реальных ситуациях...



--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
gray_k
Дата 11.10.2004, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22





--------------------
С уважением.
Gray.
PM MAIL   Вверх
Girder
Дата 11.10.2004, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



ИМХО:
- Хорошо сказано!
Цитата
Оператор GOTO не плох сам по себе, а плох в неподходящем месте



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Sail
Дата 19.10.2004, 20:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Гото иногда все-таки стоит использовать, например, когда надо брейкнуться сразу из 2х вложенных циклов.
Пусть надо найти в 2Д-массиве индексы первого нулевого элемента.
Имхо следующий код с гото читабельнее:

Код


var a:array[0..99,0..99]of integer;
i,j:integer;

...

for i:=0 to 99 do
   for j:=0 to 99 do begin
       if a[i,j]=0 then goto bre;
   end;
bre:

  Вверх
Sun
Дата 20.10.2004, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 3
Всего: 48



Цитата(Sail @ 19.10.2004, 17:53)
Гото иногда все-таки стоит использовать, например, когда надо брейкнуться сразу из 2х вложенных циклов.

В Java в таких случаях я просто ставлю return, для выхода из функции.


--------------------
Account removed
PM MAIL   Вверх
Pakshin A. S.
Дата 20.10.2004, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Цитата(Sail @ 19.10.2004, 21:53)
Гото иногда все-таки стоит использовать, например, когда надо брейкнуться сразу из 2х вложенных циклов.
Пусть надо найти в 2Д-массиве индексы первого нулевого элемента.
Имхо следующий код с гото читабельнее:


Код


Код
var a:array[0..99,0..99]of integer;
i,j:integer;

...

for i:=0 to 99 do
for j:=0 to 99 do begin
  if a[i,j]=0 then goto bre;
end;
bre:


:D :) :D Классический вариант!!!

Код

var
a: array of integer;
i,j:integer;
begin
<...>
i:=0;
j:=0;
while (a[i,j]<>0) and (i<=Len_i) do
 begin
  while (a[i,j]<>0) and (j<=Len_j) do
   inc(j);
  if a[i,j]<>0
   then
    inc(i);
 end;
end;

А где тут Label & GoTo :D
PM   Вверх
Chingachguk
Дата 20.10.2004, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
А где тут Label & GoTo


Не знаю, но ошибка тут точно есть :)


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 20.10.2004, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Точно! :stena
Не дописал
Код
<>0
then
 begin
  inc(i);
  j:=0;
 end

PM   Вверх
Дрон
Дата 20.10.2004, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 93



Pakshin A. S.
В твоём коде аж три проверки a[i,j]<>0, а в коде с goto только одна.
Как же быть с быстродействием проги? :)
Добавлено @ 22:47
Да и действительно, с goto текст кода гораздо читабельнее и компактней (в этом примере с массивом, а не вообще :) ).

ЗЫ: Сам я goto не использовал уже года два :)

Это сообщение отредактировал(а) Дрон - 20.10.2004, 22:48


--------------------
Да. Именно так.
PM   Вверх
Chingachguk
Дата 21.10.2004, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
Как же быть с быстродействием проги?


Не знаю, как с быстродействием, а я читал этот "простой пример без GOTO" минуты 3 и так и не понял логики. Хотя мне не впервой разбирать большие ассемблерные листинги...


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 21.10.2004, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Дрон

Надо же чем-то иногда жертвовать, тем более при современных скоростях...
Представь: гонимся за быстродействием, поэтому везде пизаем GoTo и т. п. -> Получаем полнейший бред при чтении, допустим одной процедуры (очень большой), т. к. тама где-то с десяток переходов по ходу действия процедуры и несколько переходов назад... ;-)
PM   Вверх
Pakshin A. S.
Дата 22.10.2004, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Код

i:=0;
j:=0;
while (a[i,j[<>0) and (i <=Max_i) and (j <= Max_j) do
begin
 inc(j);
 if j > Max_j
  then
   begin
    inc(i);
    j:=0
  end
end;

:D

Это сообщение отредактировал(а) Pakshin A. S. - 22.10.2004, 17:04
PM   Вверх
sergejzr
Дата 22.10.2004, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 7
Всего: 360



Цитата(Chingachguk @ 21.10.2004, 07:21)
а я читал этот "простой пример без GOTO" минуты 3

Дело может не в самом GOTO
В Паскале есть маленькая проблемка :)
При применении проверок итд пишется очень много слов :)
Поэтому простенькие примеры становятся трудночитабельными :)
Например если сравнить с Си:
Код
If(x=0)then  begin ....... else.........end

Это уже легче читается :)
Код
if(x){ ..... } else{.........}


Ну а на асме этот пример читается легче всего :)

Повторяю, вышесказанное относится к простеньким примерам :)


Если ваш пример на 1 КБ и в нём 5 меток и 10 GOTO, прочесть и понять его слёту практически невозможно :)

Лично я использую GOTO в маленьких функциях, строчек например на 10-20, где его работу можно конкретно проследить и понять. И всегда особенно комментирую это место.
Мне кажется, что так программировать не только можно, но и желательно из за быстродействия :)




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Girder
Дата 22.10.2004, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: нет
Всего: 155



Цитата
Как же быть с быстродействием проги? 
Проиграет 100%... код Pakshin A. S., т.к. интенсивно используются команды imul RR,RR,DD и команды вида XXX RR,[RR+RR*8] и еже с ними... при этом там будет 4 проверки(+ еще одна) :) ... в реальности. А под For будет скомпилирован совершенно другой код... :)

Это сообщение отредактировал(а) Girder - 22.10.2004, 21:59


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Zandr
Дата 1.11.2004, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 433
Регистрация: 16.7.2004
Где: Новосибирск

Репутация: нет
Всего: 13



Код

for i:=0 to 99 do
for j:=0 to 99 do begin
 if a[i,j]=0 then goto bre;
end;
bre:


Хммм... На Java, например это выглядит так:
Код

bre:
for (int i = 0; i < 100; i++)
   for (int j = 0; j < 100; j++)
       if (a[i][j] == 0) break bre;


Это сообщение отредактировал(а) Zandr - 1.11.2004, 07:31
PM MAIL   Вверх
Medved
Дата 23.12.2004, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 2
Всего: 154



Цитата(Pakshin @ 20.10.2004, 22:20)
Гото иногда все-таки стоит использовать, например, когда надо брейкнуться сразу из 2х вложенных циклов.
Пусть надо найти в 2Д-массиве индексы первого нулевого элемента.
Имхо следующий код с гото читабельнее:


Обычно для этого такой код оформляют в виде функции. Чтобы можно было выйти из вложенного цикла Return (С подобные) или Exit (Delphi)


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Ser9a
Дата 9.3.2005, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 7.3.2005

Репутация: нет
Всего: нет



Все перпода говорят что GoTo есть плохой стиль.
PM MAIL ICQ   Вверх
sergejzr
Дата 9.3.2005, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 7
Всего: 360



А раньше они говорили, что коммунизм - лучшаий строй общества.

GOTO - дело вкуса smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Secandr
Дата 9.3.2005, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Я вот даже не знаю, есть ли в php и perl`е оператор goto. А в паскале применял smile


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1207 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.