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

Вниз

Что делает Halt?   Найти похожие ветки 

 
Giemgo   (2003-04-13 13:07) [0]

В своей программе использую процедуру (функцию?) Halt для выхода. Но нигде не могу найти ее описание! Что она делает и откуда берется ?


 
OxOTHuK   (2003-04-13 13:32) [1]

ХаЛЬТ(1) - выход из процедуры. в то время как ЕХ1Т - выход из цикла. ну или что-то в этом роде


 
Song   (2003-04-13 13:36) [2]

Initiates abnormal termination of a program.

Unit

System

Category

flow control routines

procedure Halt [ ( Exitcode: Integer) ];

Description

Halt performs an abnormal termination of a program and returns to the operating system. To perform a normal termination of a Delphi VCL non-console application, call Application.Terminate. Exitcode is an optional expression that specifies an exit code for the program


 
Anatoly Podgoretsky   (2003-04-13 13:43) [3]

Не может быть, я набрал эти четыре буквы и оказался в теме справки.
Может тебе надо переинсталлировать Дельфи?
Может ты отказался от установки хелпа, он не ставится в обязательном порядке, тольео по желанию, но без него тяжело программировать, неужели ты держишь в уме десятки тысяч функций, сотни тысяч констант и типов?


 
PaRL.   (2003-04-13 14:03) [4]


> ХаЛЬТ(1) - выход из процедуры. в то время как ЕХ1Т - выход
> из цикла. ну или что-то в этом роде


Ну ничего себе что-то в этом роде.
Exit - выход из процедуры.


 
Giemgo   (2003-04-13 14:52) [5]

В справке действительно нашел. Но я имел в виду немного другое: мне бы посмотреть, что делает эта процедура, то есть ее код. И вроде как кода то нету. Что мне показалось странным. Откуда же Дельфи берет ее ?


 
NA   (2003-04-13 15:04) [6]


> > ХаЛЬТ(1) - выход из процедуры. в то время как ЕХ1Т - выход
> > из цикла. ну или что-то в этом роде
> Ну ничего себе что-то в этом роде.
> Exit - выход из процедуры


Более того. Указанный параметр (1) не только не обязан быть единицей, но ВООБЩЕ является необязательным.
Цифра, переданая halt, просто возвращается системе в качестве кода завершения. Создайте для примера bat-файл типа

@echo off
runmyprogram.exe
if ERRORLEVEL 0 echo ErrorLevel is - 0 - !
if ERRORLEVEL 1 echo ErrorLevel is - 1 - !
if ERRORLEVEL 2 echo ErrorLevel is - 2 - !
if ERRORLEVEL 3 echo ErrorLevel is - 3 - !
if ERRORLEVEL 4 echo ErrorLevel is - 4 - !
if ERRORLEVEL 5 echo ErrorLevel is - 5 - !
if ERRORLEVEL 6 echo ErrorLevel is - 6 - !
if ERRORLEVEL 7 echo ErrorLevel is - 7 - !
if ERRORLEVEL 8 echo ErrorLevel is - 8 - !

Ну и так далеее :))))

Можно оптимизировать код вызовом типа
echo %ERRORLEVEL%
или
echo %%ERRORLEVEL%

Точно не помню - поэкспериментируйте :))




 
sniknik   (2003-04-13 15:07) [7]

Giemgo (13.04.03 14:52)
пишеш в программе Halt(); нажимаеш Ctrl и наводиш мышку на него, нажимаеш попадаеш в модуль где она описана и на описание (если это возможно). дальше смотриш/ищеш, код будет
procedure _Halt;
begin
ExitCode := Code;
_Halt0;
end;
ну и тд. -> (в Halt0)


 
sniknik   (2003-04-13 15:12) [8]

NA © (13.04.03 15:04)
врядли такие эксперименты (с бат файлом) к чему нибудь приведут с виндовой прогой на дельфи это не дос где на всех одно окружение.


 
Anatoly Podgoretsky   (2003-04-13 15:19) [9]

Giemgo (13.04.03 14:52)
Исходные тексты находятся в папке {Delphi}\Source\Rtl тоже желательно установить, но в отличии от справки не так важно.


 
NA   (2003-04-13 15:22) [10]

По-моему, я ВООБЩЕ не упоминаю о Дельфи, или мне кажется?
Мне казалось, мы обсуждаем HALT, доступную в Паскале ЛЮБОЙ ВЕРСИИ.

Хорошо, "спешиално для джем" привожу справку из Дельфи:
Unit

System

Category

Flow control routines
Halt initiates abnormal termination of a program.

procedure Halt [ ( Exitcode: Integer) ];

Description

The Halt procedure performs an abnormal termination of a program and returns to the operating system. To perform a normal termination of Delphi VCL non-console application, call Application.Terminate. Exitcode is an optional expression that specifies an exit code for the program.

Example

begin

if 1 = 1 then
begin
if 2 = 2 then
begin
if 3 = 3 then
begin
Halt(1); { Halt right here! }
end;
end;
end;
Canvas.TextOut(10, 10, "This will not be executed");
end;


Спасибо за внимание.


 
Giemgo   (2003-04-13 15:24) [11]

пишеш в программе Halt(); нажимаеш Ctrl и наводиш мышку на него

sniknik, да я в курсе, что в дельфе есть appbrowser


 
NA   (2003-04-13 15:28) [12]

Удалено модератором
Примечание: Личная переписка


 
Giemgo   (2003-04-13 15:30) [13]

Ладно, тема закрывается, я все понял.

Anatoly Podgoretsky, спасибо !

Хотя в общем любопытно было бы узнать. А в самой Дельфе где хранится откомпилированный {Delphi}\Source\Rtl ? В каких файлах ?


 
Anatoly Podgoretsky   (2003-04-13 15:49) [14]

Это полный путь, {Delphi} заменяешь на путь в который ты уснановил Дельфи, выше по уровню находятся и другие исходные файлы по разным частям системы, набор папок зависит от версии Дельфи.
Комбинация {Delphi} это макрос, используется и в среде для абстактного указания базового пути.


 
Giemgo   (2003-04-13 16:02) [15]

Anatoly Podgoretsky, что вы ! Я понял, где находятся исходники. Вопрос был в другом. А где эти откомпилированные исходники ? Как они называются ? Или это вся delphi ? Исходника Delphi32.exe, допустим, там же нету ?


 
Giemgo   (2003-04-13 16:25) [16]

Anatoly Podgoretsky, так и не нашел в {Delphi}\Source\Rtl реализацию процедуры Halt


 
AlexKniga   (2003-04-13 17:40) [17]

2 Giemgo (13.04.03 16:25)
Смотри {Delphi}\Source\Rtl\Sys\halt.asm и увидишь:


; PROCEDURE _Halt( exitCode: Longint );

_Halt PROC

XOR EDX,EDX
MOV ErrorAddr,EDX
JMP Terminate

_Halt ENDP


 
Anatoly Podgoretsky   (2003-04-13 17:49) [18]

Тебе уже дважды привели ее код, думаешь из головы взяли?
Вся дельфи лежит по пути {Delphi}\Source
Научись пользоваться контексноым поисков Windows, раз уж полез в исходники, то тебе без него не обойтись.
Hint: Win+F

AlexKniga © (13.04.03 17:40)
В Д6 это лежит по другому пути {Delphi}\Source\Rtl\Sys\Sustem.pas, возможно в Д7 в другом сесте.


 
Giemgo   (2003-04-13 18:08) [19]

Anatoly Podgoretsky, спасибо за совет - я уже дано научился пользоваться поиском.

Я просто искал процедуру Halt, а вы мне приводите везде _Halt


 
NA   (2003-04-13 20:57) [20]

Тяжелый случай. Как с PChar"ами и initialization в "dpr на чистом API".

Хелпы надо читать, и слушать собеседников - иногда попадаются неглупые люди :)))


 
Giemgo   (2003-04-13 22:11) [21]

NA, а ты можешь указать, где лежит реализация процедуры Halt ?


 
Вован   (2003-04-13 23:30) [22]

Halt(ExitCode) возвращает управление операционной системе и пере
дает ей код завершения ExitCode.


 
Giemgo   (2003-04-14 11:38) [23]

Вован, спасибо :)))))))))))))))


 
Giemgo   (2003-04-14 17:36) [24]

Блин. Может кто-нибудь пожалеет меня и скажет все таки где есть описание процедуру Halt (а не _Halt) !


 
LEON   (2003-04-14 22:58) [25]

декомпилируй компилятор, там найдёшь :)

НЕТУ ЕГО! НЕТУ!
>

{ Predefined constants, types, procedures, }
{ Writeln) do not have actual declarations.}
{ Instead they are built into the compiler }
{ and are treated as if they were declared }
{ at the beginning of the System unit. }


а лучше посмотри Application.Terminate();







 
Giemgo   (2003-04-14 23:31) [26]

Так если его нету, почему мне все говорят, что тебе код приводили ?

И вообще, если вся Дельфи в {Delphi}\Source\ как же его нету ?


 
Song   (2003-04-15 00:00) [27]

2Giemgo (14.04.03 23:31)
Слушай, чтобы тебе понятней было: а ты знаешь такую процедуру _Halt?


 
Sha   (2003-04-15 00:04) [28]

2Giemgo (14.04.03 23:31)
И, вообще, плохо помогаете, да?

Давай меняться. Попробуй сам доказать нам, что:
Halt() - это _Halt0 из System.pas,
а Halt(i) - это _Halt из System.pas.


А мы все кричать станем: "Плохо доказал! Нестрого!!!"


 
Palladin   (2003-04-15 00:13) [29]


> Giemgo (14.04.03 23:31)

ну мужик ты трудный..

по дойди до halt при исполнении программы и нажми Ctrl-Alt-C

и увидишь ты свой halt и даже поймешь что он _Halt и пройдешься по нему клавишей F7


 
Giemgo   (2003-04-15 15:55) [30]

Обращаюсь к тем людям, которые помогать не хотят, а просто хотят посмеяться надо мной - не пишите сюда ничего, пожалуйста.

Я честно пытаюсь разобраться. Мне сказали, что код Halt лежит в {Delphi}\Source\ . Я его там не нашел. Пошли насмешки, мол ты и тупой. Хотя где находится код HALT до СИХ ПОР никто не сказал.
Отлично. Потом LEON написал "НЕТУ ЕГО! НЕТУ!". Так вы определитесь.

а ты знаешь такую процедуру _Halt?

Да, ее описание есть в System.pas

Попробуй сам доказать нам, что:
Halt() - это _Halt0 из System.pas


Я не собираюсь этого доказывать. Если это тоже самое, то почему тогда не вызывается _halt0 ?

по дойди до halt при исполнении программы и нажми Ctrl-Alt-C

и увидишь ты свой halt и даже поймешь что он _Halt и пройдешься по нему клавишей F7


Ну не знаю как у тебя, а у меня вызывается Halt0, описание которой также нету. Да даже если б и было. Вопрос то в другом. Откуда компилятор берет процедуру Halt ? Она где-то уже в скомпилированном виде лежит ? И он ее просто подставляет ?


 
Sha   (2003-04-15 16:31) [31]

>Giemgo (15.04.03 15:55)
>Halt() - это _Halt0 из System.pas Я не собираюсь этого доказывать.
Жаль, было бы интересно. В первую очередь, тебе.

>Откуда компилятор берет процедуру Halt ?
Из System.pas

>Она где-то уже в скомпилированном виде лежит ?
Лежит в System.dcu

>И он ее просто подставляет ?
Да


 
DiamondShark   (2003-04-15 18:03) [32]

Giemgo (15.04.03 15:55)

Да нету её. Точно так же как нету текста процедур writeln, readln.
Compiler magic называется.

Почему _Halt и _Halt0? Дык, две версии. С параметром и без.
Вот кусок из system.pas


procedure _Halt0;
var
P: procedure;
begin

if InitContext.DLLInitState = 0 then
while ExitProc <> nil do
begin
@P := ExitProc;
ExitProc := nil;
P;
end;

{ If there was some kind of runtime error, alert the user }

if ErrorAddr <> nil then
begin
MakeErrorMessage;
if IsConsole then
WriteLn(PChar(@runErrMsg))
else if not NoErrMsg then
MessageBox(0, runErrMsg, errCaption, 0);
ErrorAddr := nil;
end;

{ This loop exists because we might be nested in PackageLoad calls when }
{ Halt got called. We need to unwind these contexts. }

while True do
begin

{ If we are a library, and we are starting up fine, there are no units to finalize }

if (InitContext.DLLInitState = 2) and (ExitCode = 0) then
InitContext.InitCount := 0;

{ Undo any unit initializations accomplished so far }

FInitUnits;

if (InitContext.DLLInitState <= 1) or (ExitCode <> 0) then
if InitContext.Module <> nil then
with InitContext do
begin
UnregisterModule(Module);
if Module.ResInstance <> Module.Instance then
FreeLibrary(Module.ResInstance);
end;

UnsetExceptionHandler;

if InitContext.DllInitState = 1 then
InitContext.ExitProcessTLS;

if InitContext.DllInitState <> 0 then
ExitDll;

if InitContext.OuterContext = nil then
ExitProcess(ExitCode);

InitContext := InitContext.OuterContext^
end;

asm
db "Portions Copyright (c) 1983,99 Borland",0
end;

end;


procedure _Halt;
asm
MOV ExitCode,EAX
JMP _Halt0
end;


 
Giemgo   (2003-04-15 19:14) [33]

DiamondShark, я понимаю почему writeln не описана.Потому что ее не опишешь языком object pascal. Так а почему не описана Halt ? И почему бы в system.pas не написать код Halt, не _Halt ?!

>Откуда компилятор берет процедуру Halt ?
Из System.pas


?! Как это так, если ее там нету...


 
Serginio   (2003-04-15 19:24) [34]

Первое апреля уже даааавно прошло.


 
ddenisv   (2003-04-15 19:41) [35]

Мне особо понравилось вот-это перл:


ХаЛЬТ(1) - выход из процедуры. в то время как ЕХ1Т - выход из цикла. ну или что-то в этом роде


Вопрос к OxOTHuK: А что, делает break?


 
LEON   (2003-04-15 23:38) [36]


> >Giemgo (15.04.03 15:55)
>Halt() - это _Halt0 из System.pas Я не собираюсь этого доказывать.
>Жаль, было бы интересно. В первую очередь, тебе.

>Откуда компилятор берет процедуру Halt ?
>Из System.pas

>Она где-то уже в скомпилированном виде лежит ?
>Лежит в System.dcu

>И он ее просто подставляет ?
>Да

А как тогда ВОТ ЭТО понимать?


unit System; { Predefined constants, types, procedures, }
{ and functions (such as True, Integer, or }
{ Writeln) do not have actual declarations.}
{ Instead they are built into the compiler }
{ and are treated as if they were declared }
{ at the beginning of the System unit. }


 
Anatoly Podgoretsky   (2003-04-15 23:56) [37]

Вот так и понимай, не имеют действительной декларации, но трактуются, так, как если бы они были объявлены. Тут в действие вступает, так нызваемая Compiler Magic. Компилятор знает, что с этим делать.


 
Giemgo   (2003-04-16 00:10) [38]

Serginio (15.04.03 19:24)
Первое апреля уже даааавно прошло.


Прошу выражаться по теме. Большинство людей, думаю, в курсе какое сегодня число.

Так. Все таки кто-нибудь знает где хранится код процедуры Halt ?


 
Anatoly Podgoretsky   (2003-04-16 00:40) [39]

System.pas/halt.asm в зависимости от версии, но только не процедуры HALT, а набора процедур, вызовом которых управляет компилятор, на стадии компиляциию


 
NA   (2003-04-16 09:37) [40]


> ddenisv (15.04.03 19:41)
> Мне особо понравилось вот-это перл:

Он тут и не такое написал в какой-то теме с неделю назад.


> Giemgo (16.04.03 00:10)
> Так. Все таки кто-нибудь знает где хранится код процедуры
> Halt ?

Честно говоря, не очень понимаю, зачем ты так глубоко пытаешься в это укопаться ;) - но, думаю, в любом случае вполне достаточно проанализировать код, получаемый при компиляции. Задай halt без параметра, задай с параметром - и получишь оба варианта в готовом виде.

Т.е., код процедуры halt действительно фактически хранится в виде этих двух процедур. А список резервированных слов и реакция компилятора на их появление в исходном коде - это несколько другая вещч. Это не обязано - да и не может быть описано - средствами компилируемого языка.



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.008 c
8-91410
pavel_ak
2003-01-24 20:46
2003.04.28
Что-нибудь типа кнопок в DelphiX


6-91444
West Morgan
2003-03-05 15:12
2003.04.28
socket : asynchronous socket error 10061


7-91565
Ал
2003-03-11 14:21
2003.04.28
Можно и нужно ли устанавливать screensaver в папку c: Windows?


4-91581
!Eraser
2003-02-28 10:10
2003.04.28
Ослежка реестра и файлов


6-91430
Ocean
2003-03-04 12:14
2003.04.28
IdPOP31: как получить attachment?





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