Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.021 c
8-53661
M@D
2003-10-17 10:39
2004.02.17
TMediaPlayer и 320 kbps 44 kHz файл.


1-53445
Manulo
2004-02-09 15:20
2004.02.17
Потоки


7-53783
Rentgen
2003-12-02 07:06
2004.02.17
Свойства ярлыков


3-53420
rozhkova_i
2004-01-26 09:39
2004.02.17
internal gds software consistency check


1-53578
Norfolk
2004-02-07 12:19
2004.02.17
Генератор случайных чисел