Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.28;
Скачать: CL | DM;

Вниз

Что делает 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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.021 c
1-91263
Незнайка
2003-04-17 02:04
2003.04.28
Принцип прорисовки компанента во время выполнения


14-91541
Till
2003-04-11 14:46
2003.04.28
Чето не пойму почему нет установочного пакета?!


14-91528
passm
2003-04-10 17:07
2003.04.28
Windows XP & LPT1 привелегии пользователей ??


4-91586
}{enon
2003-03-01 16:18
2003.04.28
Проблемы с хуком


7-91568
Maks
2003-03-10 22:35
2003.04.28
Сканер