Форум » [x]Harbour » harbour: init procedure не работает ? » Ответить

harbour: init procedure не работает ?

VitalClip: Откомпилиравал прогу Clipper'а выясняется что init proc MyPRG1 не вызывается самостоятельно ?! (как это было в Clipper) Нужна какая то инструкция harbour ? или это баг ?!

Ответов - 13

Softlog86: VitalClip Возьмите любой пример и посмотрите как сделать начало программы

VitalClip: Так что это даст ? Я же не заново пишу ... а переделываю под harbour то что есть ! И пытаюсь заставить полученное - заработать !

Dima: VitalClip Такой код работает ? [pre2] INIT PROCEDURE Init() ? "In Init" RETURN PROCEDURE Main() ? "Should NEVER see this message!!!" RETURN [/pre2]


VitalClip: Dima пишет: INIT PROCEDURE Init() ? "In Init" RETURN PROCEDURE Main() ? "Should NEVER see this message!!!" RETURN Такой код - Работает ! И это очень странно ...

Sergy: Dima, там QUIT нигде не потерялся ?

Dima: Sergy пишет: Dima, там QUIT нигде не потерялся ? Хгде ? ;)

Sergy: Dima пишет: Хгде ? ;) В теле INIT процедуры. Иначе непонятно, с чего-бы "NEVER see" получился...

Dima: VitalClip А можете показать не большой, самодостаточный пример в котором INIT PROCEDURE не работает ?

PSP: Sergy пишет: В теле INIT процедуры. Иначе непонятно, с чего-бы "NEVER see" получился... Ну, какбэ, к процедуре Main() обращения нет. На RETURN всё заканчивается.

VitalClip: Ок, я разобрался в чем было дело. Сразу хочу сказать что INIT PROCEDURE - РАБОТАЕТ ! Ситуация следующая: проект состоит из двух частей,- библиотеки и самой программы. Внутри библиотеки присутствуют модули(*.prg) с INIT PROCEDURE Основная программа также содержит модули(*.prg) с INIT PROCEDURE Порядок вызовов INIT PROCEDURE при котором все работает: вначале из библиотеки, затем из Основной программы. В данном случае после линковки harbour вначале вызываются INIT PROCEDURE Основной программы, и это вызывает ошибку. Пример: INIT PROCEDURE InLIBRARY() Public MyGLBPATHPRN := "..\PRN\" RETURN INIT PROCEDURE InMainPRG() Public MyGLBPRNCOPY := MyGLBPATHPRN + "COPY\" RETURN Итак если вначале вызвать InMainPRG() получим сообщение об ошибке "MyGLBPATHPRN - не определена" И в результате возникает ощущение что INIT PROCEDURE - "не работает" ! При линковке в Clipper такой проблемы не наблюдается, видимо потому, что правильный порядок вызова соблюдается. Решение: INIT PROCEDURE оформил как PROCEDURE; и вызвал их явно вначале Main() с соблюдением правильного порядка.

Sergy: PSP пишет: Ну, какбэ, к процедуре Main() обращения нет. На RETURN всё заканчивается. Очень редко в программах на Harbour можно увидеть прямой вызов Main(). Но тем не менее, при этом недоразумении они как-то работают... И "как-бэ" этот конкретный пример работает именно так, как ему и положено: D:\HB_TEST>hbmk2 init_test.prg Harbour 3.2.0dev (r1410051440) Copyright (c) 1999-2014, http://harbour-project.org/ Compiling 'init_test.prg'... Lines 11, Functions/Procedures 2 Generating C source output to 'C:\Temp\hbmk_70rz0b.dir\init_test.c'... Done. D:\HB_TEST>init_test.exe In Init Should NEVER see this message!!! Вот поэтому и возник вопрос. Либо в init процедуре должен быть QUIT, либо "NEVER see" не получится....

Sergy: VitalClip пишет: Ок, я разобрался в чем было дело. Сразу хочу сказать что INIT PROCEDURE - РАБОТАЕТ ! ... Решение: INIT PROCEDURE оформил как PROCEDURE; и вызвал их явно вначале Main() с соблюдением правильного порядка. В Changelog.txt есть такое описание: [pre2]2010-06-17 13:11 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/src/vm/harbinit.prg * harbour/src/vm/runner.c * harbour/src/vm/hvm.c ! fixed the order in which HVM calls __SetHelpK() PRG function. It should be called after all INIT proc and before main application entry. * removed __SetHelpK() from thread initialization code. ! fixed the order in which INIT procedures are executed in single module - CA-Cl*pper calls INIT PROCEDUREs in the reverted order (from last to first) + added support for undocumented Clipper extension: two execution levels of INIT PROCEDUREs. When application starts CA-Cl*pper executes INIT PROCEDUREs called CLIPINIT from all linked PRG modules. Then it repeats this operation for all modules executing all other PROCEDUREs. Now Harbour and Clipper gives the same results for this code: proc main() ? PROCNAME() proc errorsys() ? PROCNAME() init proc INITPROC1() ? PROCNAME() init proc clipinit() ? PROCNAME() init proc INITPROC2() ? PROCNAME() proc __SetHelpK() ? PROCNAME() proc HELP()[/pre2] Т.е. порядок вызова INIT процедур установили в соответствии с Clipper. А вот очередность вызовов среди нескольких модулей - ЕМНИП, изначально не гарантировалась никогда.

VitalClip: Как всегда в точку ! Первыми вызываются INIT PROC из библиотеки, ошибка возникала из-за изменения порядка вызова INIT PROC основной программы. В Clipper вероятно этот порядок устанавливался согласно списку obj файлов при линковке ... И поэтому и не возникало ошибки. (в Clipper)



полная версия страницы