Форум: "Основная";
Текущий архив: 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