Форум: "Начинающим";
Текущий архив: 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.042 c