Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];

Вниз

Оптимизация кода.   Найти похожие ветки 

 
zamkom   (2004-02-04 16:27) [0]

Господа мастера, есть код:
label lala;
begin
If a=b then
begin
..........
If c=s then
begin
Goto lala
end;
..........
end;
lala : Конец процедуры;
end;


Скажите пожалуйста никак нельзя обойтись без метки lala;


 
h0use   (2004-02-04 16:29) [1]

Можно, в втоем случае, где метка в конце, можнол Goto заменить на Exit;


 
Sandman25   (2004-02-04 16:31) [2]

if c <>s then
...


 
zamkom   (2004-02-04 16:32) [3]

Не Exit не подойдет, конец не всей процедуры а только конструкции
If a=b then
begin
.........
end;


 
h0use   (2004-02-04 16:43) [4]


> zamkom ©

Ничего подобного, Exit является выходом из процедуры, а не из конструкции.


 
h0use   (2004-02-04 16:44) [5]

Вот собственно выдержка из хелпа:
"In Delphi, the Exit procedure immediately passes control away from the current procedure. If the current procedure is the main program, Exit causes the program to terminate."


 
zamkom   (2004-02-04 16:45) [6]

Вот я и говорю, что мне надо выйти из конструкции, а не из процедуры.


 
Семен Сорокин   (2004-02-04 16:46) [7]

zamkom © (04.02.04 16:45) [6]
запихай конструкцию в процедуру


 
Плохиш   (2004-02-04 16:47) [8]

>zamkom © (04.02.04 16:45) [6]
Так ответ Sandman25 © (04.02.04 16:31) [2] не устраивает?


 
Плохиш   (2004-02-04 16:49) [9]


> Семен Сорокин © (04.02.04 16:46) [7]
> zamkom © (04.02.04 16:45) [6]
> запихай конструкцию в процедуру

Так и будем на каждый чих процедуры городить ;-))


 
Anatoly Podgoretsky   (2004-02-04 16:51) [10]

Не может не устраивать, поскольку

lala : Конец процедуры;
end;


 
Clift   (2004-02-04 16:56) [11]

begin
If a=b then
begin
while c<>s do
begin
.............
end;
end;
end;


 
h0use   (2004-02-04 16:57) [12]


> zamkom © (04.02.04 16:45) [6]

Тогда пиши понятней, я же читаю твой комментарий по поводу конца процедуры и пишу тебе ответ на приведенный тобой текст. Вообще при правильном сравнении переменных практически на 99% удается обойтись без goto, приведи нормальную процедуру целиком и там уже посмотрим что можно сделать


 
Тимохов   (2004-02-04 16:59) [13]

Хоть и считаю себя не ламером, често не знал, что в дельфи есть goto :)))

До этого как-то всегда обходился без него...


 
Семен Сорокин   (2004-02-04 17:02) [14]

Плохиш (04.02.04 16:49) [9]
Так и будем на каждый чих процедуры городить ;-))

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


 
Sandman25   (2004-02-04 17:03) [15]

Иногда действительно лучше оставить goto.


 
Erik   (2004-02-04 17:26) [16]

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


 
PVOzerski   (2004-02-04 17:26) [17]

Goto оправдывает себя, IMHO, только для выходов из вложенных циклов. В случаях блоков if then else обычно можно просто поменять последовательность проверок, где-то сделать из else if или наоборот и т.д. Такое впечатление у меня сложилось после переносов алгоритмов из бейсика на паскаль.


 
Тимохов   (2004-02-04 17:26) [18]


> Еще при работе с критическими секчиями надо, больше неиспользую.

Там-то зачем?


 
WebErr   (2004-02-04 17:47) [19]

Параграф 1 славного Borland запрещает всякое использование goto программерам, под угрозой понизить их до статуса "ламмер". Уж лучше сделать процедуру на повторяющийся где-то код, хотя и это не всегда оптимальнейшее решение, чем ставить хотя бы одно goto! Само упоминание goto на этом форуме следует считать неприличным и оскорбительным!!! Больше не услышите "это слово" от меня!


 
Алхимик   (2004-02-05 03:22) [20]

Насчёт использования/не использования GOTO - религиозный это вопрос. Если с ним код читабельнее - то почему нет?


 
Alexander666   (2004-02-05 09:43) [21]

Я иногда даже его использую... но очень редко


 
[lamer]Barmaglot   (2004-02-05 09:49) [22]

Break?

The Break procedure causes the flow of control to exit a for, while, or repeat statement and continue at the next statement following the loop statement.


 
SPIRIT   (2004-02-05 09:53) [23]

Использовал один раз, за что приношу свои искренние извинения. Впредь больше так делать не буду .... Клянусь !!!!


 
Johnmen   (2004-02-05 10:04) [24]

>WebErr © (04.02.04 17:47) [19]

Твой пост от незнания всех аспектов программирования.

>Алхимик © (05.02.04 03:22) [20]

Религия тут совсем непричем.

>SPIRIT © (05.02.04 09:53) [23]

Не стоит зарекаться. Тем более что безсознательный отказ от гото есть признак "большого" ума...


 
SPIRIT   (2004-02-05 10:08) [25]

мне еще на первом курсе в университете преподаватель говорил:"Использование ГОТО служит дурным тоном у програмистов!"


 
Johnmen   (2004-02-05 10:10) [26]

>SPIRIT © (05.02.04 10:08) [25]

Смотря про каких программистов, в какой области, мы говорим.


 
PVOzerski   (2004-02-05 10:50) [27]

Вот пример, когда я нахожу Goto оправданным:
for i:=1 to 1000 do
for j:=1 to 1000 do
if x[i,j]="Найденный долгожданный элемент массива!!!" then
begin
MyProcedure(i,j);
goto 1;
end;
1:
Здесь эта конструкция мне кажется наиболее простой и, в то же время, достаточно читабельной.


 
[lamer]Barmaglot   (2004-02-05 10:52) [28]

??????????????

for i:=1 to 1000 do
for j:=1 to 1000 do
if x[i,j]="Найденный долгожданный элемент массива!!!" then
begin
MyProcedure(i,j);
break;
end;

А так не проще????


 
AKul   (2004-02-05 10:55) [29]


> [lamer]Barmaglot © (05.02.04 10:52) [28]

Это break из внутреннего цикла....


 
PVOzerski   (2004-02-05 10:57) [30]

А не проще: по этому break"у вывалишься из цикла со счетчиком j, но останешься дальше крутиться по i (если не понятно, 2-я строчка в моем примере - не повторенная по недоразумению 1-я). К тому же,
break идейно мало чем отличается от goto.


 
Verg   (2004-02-05 10:59) [31]

Как вариант (один из):

procedure Proc;
............
...........//часть процедуры до циклов
try
for i:=1 to 1000 do
for j:=1 to 1000 do
if x[i,j]="Найденный долгожданный элемент массива!!!" then
begin
MyProcedure(i,j);
exit;
end;
finally
//Часть процедуры после циклов
end;
end;


 
PVOzerski   (2004-02-05 11:06) [32]

2[31]:
а try-то зачем? По exit"у ты вылетишь из процедуры Proc всё равно, разве что в MyProcedure исключение сгенерить...
Или завести булеву переменную, во внутреннем цикле менять, скажем, false на true по нахождении долгожданного элемента, а во внешнем цикле этот флаг проверять, и если что, то break. Вот только всё это ни читабельности, ни эффективности коду не прибавит, IMHO. Скорее, наоборот.


 
Плохиш   (2004-02-05 11:10) [33]

>PVOzerski © (05.02.04 11:06) [32]

при exit выполняются все внешнии finaly end блоки.


 
Verg   (2004-02-05 11:12) [34]


> а try-то зачем? По exit"у ты вылетишь из процедуры Proc
> всё равно, разве что в MyProcedure исключение сгенерить...


Нет. Секция finally выполнится в любом случае. Каким бы способом не был покинут блок try - будь то исключение, break или exit.

На то он и finally.


 
PVOzerski   (2004-02-05 11:20) [35]

>Нет. Секция finally выполнится в любом случае. Каким бы способом не был покинут блок try - будь
Проверил, признаю свою неправоту в данном случае. Буду иметь в виду на будущее (до сих пор такими конструкциями не пользовался). Хотя в цикле блоки try (но не циклы внутри блоков try) заметно тормозят программы - по наблюдениям.


 
TUser   (2004-02-05 11:21) [36]

label lala;
begin
If a=b then
begin
.......... // первое тра-ля-ля
If c=s then
begin
.... // здесь, наверное, тоже тра-ля-ля
// иначе мы бы написали просто if c<>s
Goto lala
end;
.......... // второе тра-ля-ля
end;
lala : Конец процедуры;
end;

|
|
\ /
|

if a=b then begin
.......... // первое тра-ля-ля
if c=s then begin
... // наверное тра-ля-ля
end else begin
.... // второе тра-ля-ля
end;
end;
// здесь была lala


 
nejest   (2004-02-05 11:30) [37]

>SPIRIT © (05.02.04 10:08) [25]
>мне еще на первом курсе в университете преподаватель >говорил:"Использование ГОТО служит дурным тоном у програмистов!"
этому учат даже в техникумах.
p.s. если человек разрабатывает с начала алгоритмы, а потом пишет по нему программу, то Goto ему в программе не получится поставить.


 
Verg   (2004-02-05 11:33) [38]


> PVOzerski © (05.02.04 11:20) [35]
> Хотя в цикле блоки try (но не циклы внутри блоков try) заметно
> тормозят программы - по наблюдениям.


Да, конечно тормозят, т.к. вход в блок try - это определнные действия.

Я просто предложил один из вариантов, которым частенько пользуюсь сам.

GetMem(A, 1000);
try

Тут циклы всякие, ветвления, if-ы, но в любой момент
можно сделать exit без утечки памяти.
Кроме того защита от утечек памяти при исключениях.
И, кстати, от желания сделать goto за пределы try-finally тоже :))
finally
FreeMem(A);
end;


 
anatolyk   (2004-02-06 13:02) [39]

Введи var Flag: Boolean;
while not flag do begin
...
end;

там, где надо сделай его = True, да и в любом месте цикла проверь - если тру, тогда break.

Надеюсь, правильно понял вопрос.


 
Владислав   (2004-02-06 14:22) [40]

PVOzerski © (05.02.04 10:50) [27]

"for i:=1 to 1000 do
for j:=1 to 1000 do
if x[i,j]="Найденный долгожданный элемент массива!!!" then
begin
MyProcedure(i,j);
goto 1;
end;
1:"


Дык все ж просто ;)

procedure Test;
var
i: Integer;
j: Integer;
LFound: Boolean;
begin
for i := 1 to 1000 do
begin
for j := 1 to 1000 do
begin
LFound := x[i,j] = "Найденный долгожданный элемент массива!!!";
if LFound then
Break
end;
if LFound then
Break
end;
// прочие действия
end;


 
Владислав   (2004-02-06 14:25) [41]

А это автору ;)

begin
repeat
if a = b then
begin
//..........
if c = s then
begin
Break
end;
//..........
end
until True
end;


 
Плохиш   (2004-02-06 14:34) [42]

>Владислав © (06.02.04 14:25) [41]

Интересно, а если c <> s так и будем в цикле крутиться?


 
Владислав   (2004-02-06 14:36) [43]

> Плохиш (06.02.04 14:34) [42]

Не, не будем.


 
Владислав   (2004-02-06 14:37) [44]

RTFM


 
Плохиш   (2004-02-06 14:38) [45]

>Владислав © (06.02.04 14:36) [43]

> Не, не будем.

И в каком месте Вашего кода об этом написано?


 
Владислав   (2004-02-06 14:38) [46]

Repeat statements
When expression returns True, the repeat statement terminates


 
Плохиш   (2004-02-06 14:41) [47]

>Владислав © (06.02.04 14:38) [46]
Опс... :-)

repeat
until true;

Более глупое использование цикла repeat трудно придумать 8-)


 
Владислав   (2004-02-06 14:43) [48]

Ага :)
Только если между циклами огромное количество кода и нет комментариев, такой код читается не намного лучше goto :)


 
Verg   (2004-02-06 14:46) [49]


>
> Плохиш (06.02.04 14:41) [47]
> >Владислав © (06.02.04 14:38) [46]
> Опс... :-)
>
> repeat
> until true;
>
> Более глупое использование цикла repeat трудно придумать
> 8-)


Зря так думаешь. Это нормальный ход.
Кстати, довольно распространенный.


 
Плохиш   (2004-02-06 14:47) [50]

>Verg © (06.02.04 14:46) [49]

С until true или until false ?


 
Verg   (2004-02-06 14:52) [51]


> Плохиш (06.02.04 14:47) [50]
> >Verg © (06.02.04 14:46) [49]
>
> С until true или until false ?


И тот и другой.
и
repeat .... break ... until true;

тоже.

Оптимизатор и камня на камне не оставит от самого такого цикла, а break свою ф-цию нормально выполнит.


 
Verg   (2004-02-06 14:56) [52]


> Плохиш (06.02.04 14:47) [50]


Вот смотри, например.

begin
If a=b then
begin
GetMem(чего-нибудь)
try
..........
If c=s then
begin
Goto lala
end;
..................
...................
finally
FreeMem(Того же);
end;
..........
end;
lala:;

Вот. Эта конструкция вообще на этапе компиляции не проканает.
А с repeat-until true И break вместо goto будет все "пучком". Красиво и надежно.


 
Skier   (2004-02-06 15:00) [53]


> Скажите пожалуйста никак нельзя обойтись без метки lala;

Без меток всегда можно обойтись.


 
Sandman25   (2004-02-06 15:37) [54]

Навеяло [53].
От каких еще штук можно избавиться?
От for помогает while.
От while помогает repeat until с предварительным if.
От repeat помогает while с предварительным копированием тела цикла.
От if без else помогает
while () do
begin
...
break;
end;
От if c else можно избавиться с помощью меток.
while () do
begin
// then
goto A;
end;
// else
A:
Только от присвоения не могу избавиться. Хотя, наверное, можно применить какой-нибудь FillChar или Move :)



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.008 c
1-53550
Speed
2004-02-05 13:12
2004.02.17
Алгоритм


14-53769
RealRascal
2004-01-22 16:37
2004.02.17
Про сканеры и цифровые мыльницы.


7-53794
beglec
2003-11-30 23:01
2004.02.17
Возможно ли получить более подробную информацию ?


1-53641
h0use
2004-02-06 15:46
2004.02.17
Как в компоненет создавать about?


3-53431
Avreliy
2004-01-28 14:07
2004.02.17
Округление в FireBird





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский