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

Вниз

Из локальной функции прервать основную   Найти похожие ветки 

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

Наверх





Память: 0.48 MB
Время: 0.006 c
4-20364
3223(jab)
2003-04-29 10:35
2003.07.07
Работа с GetFullPathName()


14-20213
Maksss
2003-06-22 07:07
2003.07.07
нюк


3-20011
M126
2003-06-15 12:23
2003.07.07
Запрос на поиск


1-20067
Chery
2003-06-24 19:23
2003.07.07
Считать с txt файла только строку с указанным номером ?


14-20279
ewgeny
2003-06-20 11:20
2003.07.07
Интеграция кассовой программы с 1С Предприятием





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский