![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Exit [D7]
Цукор 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;