Форум: "Основная";
Текущий архив: 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.009 c