Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Exit [D7]


Страницы:   1 2

Цукор 5 ©   (2005-09-21 01:56:00) 

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

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 не выполняется для основного кода. Можно ли как-нибудь выйти из этого положения???


evvcom   (2005-09-22 12:32:00) [1]


> 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 код довольно наглядным и понятным получается. Имхо.


Leonid Troyanovsky   (2005-09-22 11:36:00) [2]


> Цукор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.


Джо   (2005-09-22 02:39:00) [3]


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

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


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

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

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

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


GuAV   (2005-09-21 22:21:00) [5]

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


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

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


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

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


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

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

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

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


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

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


Zeqfreed   (2005-09-21 22:05:00) [8]

Цукор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;


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


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

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


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

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;


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

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

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

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


GuAV   (2005-09-21 20:38:00) [12]

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 - не вижу причин не использовать.


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


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


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

--
Regards, LVT.


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

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


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


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


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

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

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

--
Regards, LVT.


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

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


Внук   (2005-09-21 11:40:00) [17]

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


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


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

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


Leonid Troyanovsky   (2005-09-21 11:04:00) [19]


> Цукор 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.


umbra   (2005-09-21 10:53:00) [20]

Я так понял, что есть много последовательных (не вложенных) ифов и желательно выйти из функции как только 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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо