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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор goto, Забыл как пользоваться 
:(
    Опции темы
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   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

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

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


 




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


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

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