On-line: PSP, Мирослав, гостей 0. Всего: 2 [подробнее..]
АвторСообщение



Пост N: 6
Зарегистрирован: 05.11.14
ссылка на сообщение  Отправлено: 06.11.14 11:30. Заголовок: harbour: init procedure не работает ?


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 13 [только новые]





Пост N: 185
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 06.11.14 12:05. Заголовок: VitalClip Возьмите л..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 7
Зарегистрирован: 05.11.14
ссылка на сообщение  Отправлено: 06.11.14 12:36. Заголовок: Так что это даст ? Я..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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



Спасибо: 1 
ПрофильЦитата Ответить



Пост 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


Такой код - Работает ! И это очень странно ...


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 429
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 06.11.14 16:55. Заголовок: Dima, там QUIT нигде..


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



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 4246
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.11.14 17:00. Заголовок: Sergy пишет: Dima, ..


Sergy пишет:

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


Хгде ? ;)

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 430
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 06.11.14 17:03. Заголовок: Dima пишет: Хгде ? ..


Dima пишет:

 цитата:
Хгде ? ;)



В теле INIT процедуры.
Иначе непонятно, с чего-бы "NEVER see" получился...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 4247
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.11.14 18:20. Заголовок: VitalClip А можете ..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 998
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 06.11.14 18:39. Заголовок: Sergy пишет: В теле..


Sergy пишет:

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


Ну, какбэ, к процедуре Main() обращения нет. На RETURN всё заканчивается.

Спасибо: 0 
ПрофильЦитата Ответить



Пост 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() с соблюдением правильного порядка.


Спасибо: 0 
ПрофильЦитата Ответить





Пост 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" не получится....

Спасибо: 0 
ПрофильЦитата Ответить





Пост 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. А вот очередность вызовов среди нескольких модулей - ЕМНИП, изначально не гарантировалась никогда.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 10
Зарегистрирован: 05.11.14
ссылка на сообщение  Отправлено: 10.11.14 11:31. Заголовок: Как всегда в точку !..


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 235
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет