Главная страница
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;



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

Текущий архив: 2004.02.17;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.022 c
1-53512
JediMaster
2004-02-05 17:02
2004.02.17
Поиск слова


3-53387
АМБ
2004-01-27 11:44
2004.02.17
индикатор DBGrid


1-53604
Talla2k
2004-02-07 18:07
2004.02.17
OLE


1-53510
pomashok
2004-02-05 19:53
2004.02.17
Подключение компонента


1-53488
Юрий Федоров
2004-02-05 21:02
2004.02.17
Работа в Word