Текущий архив: 2003.07.07;
Скачать: CL | DM;
ВнизИз локальной функции прервать основную Найти похожие ветки
← →
Gamar (2003-06-25 09:27) [0]Как из локальной функции (процедуры) прервать основную функцию или процедуру (аналогично Exit, не Abort)?
← →
pasha676 (2003-06-25 09:33) [1]Смотря что именно нужно. Самое простое решение - возвращаемое значение функции, которое сравнивается в основной функции и там уже вылетает.
← →
Palladin (2003-06-25 09:33) [2]никак
← →
mrcat (2003-06-25 09:34) [3]>Gamar © (25.06.03 09:27)
imho, менять логику приложения надо.
← →
TsvIlya (2003-06-25 09:40) [4]Если я правильно понял, то, по моему, сделать точно так, как ты хочешь нельзя. Лично я в таких случаях поступаю так. Включаю в прочедуру (функцию) булевую переменную, которая в зависимости от того, надо прерывать осн. процедуру (функцию) или нет, принимает различные значения, и пишу так:
Процедура( .. ( var) <БУЛ._ПЕРЕМЕННАЯ> .. );
if <БУЛ._ПЕРЕМЕННАЯ> then Exit;
или
if Функция( .. ) then Exit;
← →
Gamar (2003-06-25 09:44) [5]В общем я хотел прервать основную функцию и возвратить значение одной функций, что бы не делать блок begin...end
if a = 0 then
begin
Result := False;
Exit;
end;
вместо этого хотел
if a = 0 then DoExit(False);
где DoExit - локальная функция, которая возвращает результат
основной False и завершает ее.
Как это сделать?
← →
Palladin (2003-06-25 09:56) [6]сказал же уже, никак
не поленись
if a=0 then
begin
result:=false;
exit;
end;
другое дело если ты идешь по последовательности действий и утебя может несколько таких условий встретится, то имеет смысл сделать таким образом
begin
result:=false;
if a=0 then exit;
if b<>34 then exit;
if ICantCalcThis(a,b+a,b*a) then exit;
result:=true;
end;
← →
Gamar (2003-06-25 10:08) [7]И с указателями на основную функцию никак не получится?
← →
SVM (Perm) (2003-06-25 10:29) [8]Теоретически - на ассемблере можно просто восстановить стек и выполнить возврат (сразу из основной).
← →
Palladin (2003-06-25 10:33) [9]вот именно, изврат на асме.
стек ты просто так не восстановишь, подфункция должна знать что туда пихает функция более верхнего уровня...
← →
Юрий Федоров (2003-06-25 10:33) [10]Для этого и существует abort и прочие исключения
← →
oomneeq (2003-06-25 11:17) [11]Эксепшены для этого и сусчествуют
Примерно так:
type EBelowException=class(Exception)
end;
function Above:boolean;
begin
...
try
Result:=Below;
except
On E:EBelowException do begin
..
Result:=false;
end
...
end
...
end;
function Below:boolean;
begin
...
if SomethingWrong then raise EBelowException.Create("");
...
Result:=true;
end;
← →
Ihor Osov'yak (2003-06-25 11:40) [12]2 oomneeq © (25.06.03 11:17)
Эксепшены существуют не полько для этого.. Но можно использовать и для этого ..
← →
oomneeq (2003-06-25 12:49) [13]>Ihor Osov"yak ©
Благодарю за разрешение использовать эксепшены для этого :-)
← →
Gamar (2003-06-25 14:26) [14]Не совсем ясно как реализавать C-функцию return (та что возвращает результат и завершает функцию одновременно)
← →
Юрий Федоров (2003-06-25 14:41) [15]>>Gamar © (25.06.03 14:26)
Прямо так, как в C не получится, не знаю, можно ли это считать недостатком паскаля... Но ты спрашивал, как завершить не только вложенную, но и вызываемую процедуру - это несколько разные вещи
← →
Gamar (2003-06-25 17:40) [16]В общем задача такова - как завершить функцию и передать ей значение однной функцией - как в С (return Value)?
← →
Smithson (2003-06-25 17:47) [17]Никак.
В Delphi только двумя командами. Кстати, и в С и в Pascal они сводятся к
mov ax, Return
ret
← →
Gamar (2003-06-25 17:55) [18]Жаль, в общем неудобно. Недочет Паскалю...
← →
VMcL (2003-06-25 18:13) [19]>Gamar © (25.06.03 17:55)
>Жаль, в общем неудобно. Недочет Паскалю...
С этим бы я ещё поспорил. Зато есть (в Delphi) зарезервированная переменная Result, к которой можно обращаться с различными целями (чтение, вызов методов класса и т. п.)
Неплохой этому пример: Dialogs.CreateMessageDialog.
← →
Gamar (2003-06-25 19:41) [20]Да, это верно, но наличие Return сделало бы код более коротким...
Страницы: 1 вся ветка
Текущий архив: 2003.07.07;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.006 c