Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.041 c
14-1127469588
ilya39
2005-09-23 13:59
2005.10.16
VS .Net 2002


3-1125404549
KSK
2005-08-30 16:22
2005.10.16
Обновление ADODataset


4-1124265334
Warlock
2005-08-17 11:55
2005.10.16
Копирование в службе и права доступа


14-1127507786
Ученик чародея
2005-09-24 00:36
2005.10.16
Он был хакером.


14-1127818421
Monk
2005-09-27 14:53
2005.10.16
InfoPower





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский