Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.012 c
1-20097
Brain Force
2003-06-24 15:19
2003.07.07
Помогите разобраться со StringGrid


3-19973
M126
2003-06-12 17:00
2003.07.07
Как сделать вычисления в edit?


14-20310
frack
2003-06-21 09:42
2003.07.07
Работа с TreeView


14-20200
pet
2003-06-20 19:08
2003.07.07
kylix


3-19957
werr
2003-06-10 14:37
2003.07.07
Как переиндескировать?