Автор | Сообщение |
|
| |
Пост N: 6
Зарегистрирован: 05.11.14
|
|
Отправлено: 06.11.14 11:30. Заголовок: harbour: init procedure не работает ?
Откомпилиравал прогу Clipper'а выясняется что init proc MyPRG1 не вызывается самостоятельно ?! (как это было в Clipper) Нужна какая то инструкция harbour ? или это баг ?!
|
|
|
Ответов - 13
[только новые]
|
|
|
| |
Пост N: 185
Зарегистрирован: 03.12.08
|
|
Отправлено: 06.11.14 12:05. Заголовок: VitalClip Возьмите л..
VitalClip Возьмите любой пример и посмотрите как сделать начало программы
|
|
|
|
| |
Пост N: 7
Зарегистрирован: 05.11.14
|
|
Отправлено: 06.11.14 12:36. Заголовок: Так что это даст ? Я..
Так что это даст ? Я же не заново пишу ... а переделываю под harbour то что есть ! И пытаюсь заставить полученное - заработать !
|
|
|
|
| |
Пост N: 4245
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.11.14 15:25. Заголовок: VitalClip Такой код..
VitalClip Такой код работает ? INIT PROCEDURE Init() ? "In Init" RETURN PROCEDURE Main() ? "Should NEVER see this message!!!" RETURN
|
|
|
|
| |
Пост N: 8
Зарегистрирован: 05.11.14
|
|
Отправлено: 06.11.14 16:01. Заголовок: Dima пишет: INIT P..
Dima пишет: цитата: | INIT PROCEDURE Init() ? "In Init" RETURN PROCEDURE Main() ? "Should NEVER see this message!!!" RETURN |
| Такой код - Работает ! И это очень странно ...
|
|
|
|
| |
Пост N: 429
Зарегистрирован: 08.07.06
|
|
Отправлено: 06.11.14 16:55. Заголовок: Dima, там QUIT нигде..
Dima, там QUIT нигде не потерялся ?
|
|
|
|
| |
Пост N: 4246
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.11.14 17:00. Заголовок: Sergy пишет: Dima, ..
Sergy пишет: цитата: | Dima, там QUIT нигде не потерялся ? |
| Хгде ? ;)
|
|
|
|
| |
Пост N: 430
Зарегистрирован: 08.07.06
|
|
Отправлено: 06.11.14 17:03. Заголовок: Dima пишет: Хгде ? ..
Dima пишет: В теле INIT процедуры. Иначе непонятно, с чего-бы "NEVER see" получился...
|
|
|
|
| |
Пост N: 4247
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.11.14 18:20. Заголовок: VitalClip А можете ..
VitalClip А можете показать не большой, самодостаточный пример в котором INIT PROCEDURE не работает ?
|
|
|
|
| постоянный участник
|
Пост N: 998
Зарегистрирован: 27.01.07
|
|
Отправлено: 06.11.14 18:39. Заголовок: Sergy пишет: В теле..
Sergy пишет: цитата: | В теле INIT процедуры. Иначе непонятно, с чего-бы "NEVER see" получился... |
| Ну, какбэ, к процедуре Main() обращения нет. На RETURN всё заканчивается.
|
|
|
|
| |
Пост N: 9
Зарегистрирован: 05.11.14
|
|
Отправлено: 07.11.14 11:25. Заголовок: Ок, я разобрался в ч..
Ок, я разобрался в чем было дело. Сразу хочу сказать что 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() с соблюдением правильного порядка.
|
|
|
|
| |
Пост N: 431
Зарегистрирован: 08.07.06
|
|
Отправлено: 07.11.14 18:03. Заголовок: PSP пишет: Ну, какб..
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" не получится....
|
|
|
|
|
| |
Пост N: 432
Зарегистрирован: 08.07.06
|
|
Отправлено: 07.11.14 18:16. Заголовок: VitalClip пишет: Ок..
VitalClip пишет: цитата: | Ок, я разобрался в чем было дело. Сразу хочу сказать что INIT PROCEDURE - РАБОТАЕТ ! ... Решение: INIT PROCEDURE оформил как PROCEDURE; и вызвал их явно вначале Main() с соблюдением правильного порядка. |
| В Changelog.txt есть такое описание: цитата: | 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() |
| Т.е. порядок вызова INIT процедур установили в соответствии с Clipper. А вот очередность вызовов среди нескольких модулей - ЕМНИП, изначально не гарантировалась никогда.
|
|
|
|
| |
Пост N: 10
Зарегистрирован: 05.11.14
|
|
Отправлено: 10.11.14 11:31. Заголовок: Как всегда в точку !..
Как всегда в точку ! Первыми вызываются INIT PROC из библиотеки, ошибка возникала из-за изменения порядка вызова INIT PROC основной программы. В Clipper вероятно этот порядок устанавливался согласно списку obj файлов при линковке ... И поэтому и не возникало ошибки. (в Clipper)
|
|
|
|