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

Вниз

Exit   Найти похожие ветки 

 
Цукор 5   (2005-09-21 01:56) [0]

Предположим имеется такой вот сабж :

function MyLOL:Integer;
begin
...
 if условие then
 begin
   Result:=1;
   Exit;
 end else
 begin
   Result:=2;
   Exit;
 end;
end;


таких вот  begin Result:=1; Exit;end приличное кол-во. Я же хочу их вынести в ф-цию.Типа Exit_(I:Integer) но сабж не получатся ибо команда Exit не выполняется для основного кода. Можно ли как-нибудь выйти из этого положения???


 
Quattro ©   (2005-09-21 02:27) [1]

а зачем здесь Exit??
begin
  Result:=1;
  Exit;
если условие не выполняется ,дело дальше не пойдёт.....


 
Джо ©   (2005-09-21 02:36) [2]


> Можно ли как-нибудь выйти из этого положения???

возбудить исключение.


 
Quattro ©   (2005-09-21 03:53) [3]

йопт..хотел сказать если выполняется условие


 
Внук ©   (2005-09-21 09:04) [4]

>>Можно ли как-нибудь выйти из этого положения???
 Можно. Не пользоваться Exit,goto,break,continue,halt и т.д., искуственно прерывающих выполнение блока, а проектировать приложение тщательнее. Имхо.


 
evvcom ©   (2005-09-21 09:30) [5]

И еще совет.

> Result:=1;

гораздо нагляднее будет

const
 MyLOL_RES_OK = 0;
 MyLOL_RES_<смысловой идентификатор 1> = 1;
 MyLOL_RES_<смысловой идентификатор 2> = 2;

...
 Result := MyLOL_RES_OK;
...
 Result := MyLOL_RES_<смысловой идентификатор 1>;
// и т.д.


 
Leonid Troyanovsky ©   (2005-09-21 10:52) [6]


> Внук ©   (21.09.05 09:04) [4]
> >>Можно ли как-нибудь выйти из этого положения???
>  Можно. Не пользоваться Exit,goto,break,continue,halt и


Хотел бы я увидеть приложение, обходящееся без, скажем, break.
Видимо, оно должно обходиться и без for.

--
Regards, LVT.


 
umbra ©   (2005-09-21 10:53) [7]

Я так понял, что есть много последовательных (не вложенных) ифов и желательно выйти из функции как только Result-у будет что-то присвоено. Чтобы сократить количество проверок можно сделать что-то вроде:

function MyLOL:Integer;
var
Assigned: Boolean;
begin
Assigned := false;
...
if условие then
begin
  Result:=1;
 Assigned: = true;
 end else
begin
  Result:=2;
 Assigned: = true;
end;
if Assigned then exit;
end;


 
Leonid Troyanovsky ©   (2005-09-21 11:04) [8]


> Цукор 5   (21.09.05 01:56)  

> function MyLOL:Integer;
> begin
> ...
>  if условие then
>  begin
>    Result:=1;
>    Exit;



Можно, например, так:


function GetConditionIndex(..): Longint;

 function SetVal(var x: Longint; const v: Longint ): Boolean;
 begin
   x := v;
   Result := True;
 end;

begin
  if SetVal(Result, 0) and условие1 then Exit;
  if SetVal(Result, 1) and условие2 then Exit;
  ..
  Result := -1;
end;


--
Regards, LVT.


 
Плохиш ©   (2005-09-21 11:10) [9]


> Цукор 5   (21.09.05 01:56)

Всё зависит от алгоритма.
А в приведённом примере exit лишнее.


 
Внук ©   (2005-09-21 11:40) [10]

>>Хотел бы я увидеть приложение, обходящееся без, скажем, break.
 Сколько платишь? За одно приложение? :)))


 
Anatoly Podgoretsky ©   (2005-09-21 11:46) [11]

И второй вопрос, сколько приложений готов купить?


 
Leonid Troyanovsky ©   (2005-09-21 12:17) [12]


> Внук ©   (21.09.05 11:40) [10]
> >>Хотел бы я увидеть приложение, обходящееся без, скажем,
>  break.
>  Сколько платишь? За одно приложение? :)))


 Чего уж там одно :)  
 40% от реализации, как техническому директору, ну и ключ от квартиры.

> Anatoly Podgoretsky ©   (21.09.05 11:46) [11]
> И второй вопрос, сколько приложений готов купить?

 Пудов этак 5 or 6.

--
Regards, LVT.


 
evvcom ©   (2005-09-21 14:04) [13]

Поддержу Леонида и тоже не соглашусь с Внуком по поводу неиспользования break, exit, continue. По goto согласен, halt вообще никогда не использовал.
Почему break, exit, continue "искусственно" прерывают выполнение цикла/подпрограммы? Посмотрев на асм-код все выглядит очень даже логично. Да и придуманы они были именно для этого и ожидаются вполне логичные действия.
Вот с goto действительно можно послать (или по крайней мере попытаться послать) дальнейшее выполнение программы в нелогичные места. Асм-код различных случаев не смотрел, может, конечно, и там выглядит все очень корректно, но goto я действительно не люблю.


 
Leonid Troyanovsky ©   (2005-09-21 14:54) [14]


> evvcom ©   (21.09.05 14:04) [13]
> Поддержу Леонида и тоже не соглашусь с Внуком по поводу
> неиспользования break, exit, continue. По goto согласен,
>  halt вообще никогда не использовал.


Я, конечно, рад, что не одинок, но.
Exit, Halt, грешен, пользовал. Про goto могу сказать, что, IMHO,
в "структурном программировании" осуждались лишь ссылки назад
(потому, как в распечатках с трудом находились).
Хотя, нужды в оном использовании никогда не возникало.
Как, собс-но, и continue (не могу оное никак осуждать).

--
Regards, LVT.


 
GuAV ©   (2005-09-21 20:38) [15]

evvcom ©   (21.09.05 14:04) [13]

> Вот с goto действительно можно послать (или по крайней
> мере попытаться послать) дальнейшее выполнение
> программы в нелогичные места.


goto + F1

Never jump into a loop or other structured statement, since this can have unpredictable effects.

По сабжу - именно так и писать, как в [0].

По Exit,goto,break,continue,halt - не вижу причин не использовать.


 
Цукор5   (2005-09-21 21:22) [16]

Ребята,не вижу ответа.
Или он в [15] "именно так и писать, как в [0]."?

Напомню,хотелось бы сделать так :

...
if условие then Exit_(1)
else Exit_(2);
...


 
Цукор5   (2005-09-21 21:28) [17]

2 Цукор5   (21.09.05 21:22) [16]
Вернее так :

if условие then Result:=Exit_(1)
else Result:=Exit_(2);


где Exit_(I:Integer):Integer;

function  Exit_(I:Integer):Integer;
begin
 Result:=I;
 Exit; // но нужно,что бы он выполнился в верхней ф-ции. Т.е. чтобы был выход из ф-ции MyLOL
end;


 
Плохиш ©   (2005-09-21 21:33) [18]

Занялся бы чтением книжек для начинающих.


 
Zeqfreed ©   (2005-09-21 22:05) [19]

Цукор5   (21.09.05 21:28) [17]
procedure ExitPrevious();
begin
//Полезный код

asm
 add      esp, 4;
end;
end;

procedure Foo();
begin
ShowMessage("begin");
ExitPrevious();
ShowMessage("end?");
end;


Только это, конечно, не дело..


 
Цукор5   (2005-09-21 22:14) [20]

>Занялся бы чтением книжек для начинающих.
Каких??? Я так думаю,что сабж реализовать вообще невозможно.
З.Ы.Я не начинающий ;)


 
GuAV ©   (2005-09-21 22:17) [21]

Наверное, из-за отсутствия вопроса ?


> Можно ли как-нибудь выйти из этого положения???

- не вопрос, т.к. не указано чем это положение не устраивает.

Ещё в [1] сказано, что [0] вообще Exit ничего не делает. Т.е. чтобы проблема стала понятно из кода, видимо придётся его переписать.

Если хочется написать [0] короче, можно писать вообще так:
const Rslt: array[Boolean] of Integer = (2, 1);
begin
 Result := Rslt[условие];
end;


 
GuAV ©   (2005-09-21 22:21) [22]

Zeqfreed ©   (21.09.05 22:05) [19]
Только это, конечно, не дело..


Разумеется.
Состояние стека зависит от реализации Foo(); , поэтому ExitPrevious(); не подойдёт в общем случае. При достаточно сложной Foo; будет отслеживать как она будет использовать стек, и ошибки неизбежны.

Для выхода из "далее чем одной" функции существуют исключения, например, исключение, поднимаемое процедурой abort.


 
Цукор5   (2005-09-22 02:10) [23]

> не вопрос, т.к. не указано чем это положение не устраивает.
Поясню...Есть библиотека,которая заточена под работу с периферийным у-вом.Соответственно,устройство не всегда отвечает правильно.При ошибочном ответе либо таймауте мне нужно в некой ф-ции вернуть результат ошибки.В данный момент все работает,но меня пугает обьем кода(таких вот begin Result:=значение; Exit;end; великое множество). Я пытаюсь сократить код,т.е. сделать его более читабельным.Пока все ;)

2 GuAV ©   (21.09.05 22:17) [21]
Не подходит ибо нет Exit

2 GuAV ©   (21.09.05 22:21) [22]
На счет abort спасибо.Завтра проверю.


 
Джо ©   (2005-09-22 02:39) [24]


>  [16] Цукор5   (21.09.05 21:22)
> Ребята,не вижу ответа.

Я тебе еще в [2] написал: "возбудить исключение". Читать нужно ответы, а не только вопросы задавать. :-&


 
Leonid Troyanovsky ©   (2005-09-22 11:36) [25]


> Цукор5   (22.09.05 02:10) [23]

>  Exit;end; великое множество). Я пытаюсь сократить код,т.
> е. сделать его более читабельным.Пока все ;)


Самый понятный, IMHO, вариант, когда условия оформлены функциями:

type
 TParam = ..

 TCf = function (const param: TParam): Boolean;

function f0 (const param: TParam): Boolean; // условие 1
begin
 Result := ..;
end;

function f1 (const param: TParam): Boolean; // условие 2
begin
 Result := ..;
end;
..

function GetIndex(const f: array of TCf; const param: TParam): Longint;
var
 i: Longint;
begin
 for i := 0 to High(f) do
   if f[i](p) then
     begin
       Result := i;
       Exit;
     end;
 Result := -1;
end;

 Т.е., GetIndex([f0, f1, ..], param)

--
Regards, LVT.


 
evvcom ©   (2005-09-22 12:32) [26]


> GuAV ©   (21.09.05 20:38) [15]
>
> goto + F1
>
> Never jump into a loop or other structured statement, since
> this can have unpredictable effects.

Спасибо, конечно, за такую подсказку, сам бы я никогда не догадался :). Я предполагал нечто такое, когда писал [13], поэтому и приписал "или по крайней мере попытаться послать". В любом случае goto никогда не пользовал и не собираюсь. Всегда легко справляюсь без него. Отсюда и догадки только о поведении компилятора в подобных случаях.
Без Exit тоже можно, но более многоэтажными тогда if-ы получаются, а с Exit код довольно наглядным и понятным получается. Имхо.



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

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

Наверх




Память: 0.54 MB
Время: 0.047 c
6-1118477015
Shizuku
2005-06-11 12:03
2005.10.16
AutoUpdate


2-1126686038
JTAG
2005-09-14 12:20
2005.10.16
Про tray


4-1124177888
_alex_
2005-08-16 11:38
2005.10.16
Обои


2-1127214444
FBI Agent
2005-09-20 15:07
2005.10.16
Print DBGrid


4-1124213393
SuperMatser
2005-08-16 21:29
2005.10.16
Кто нить работал с GetBKcolor? ничего не получается!!!!!!!!!!!!!!