Форум » [x]Harbour » Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка" » Ответить

Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка"

Sergy: Добрый день, уважаемые коллеги. Большое спасибо за море справочной информации по переходу, но нужно ещё пнуть меня в нужном направлении. Итак, установил Harbour 3.0 + BCC 5.5.1 ==>> 3.2.0 +minGW скомпилировал и запустил традиционный "Hello, world!" Дело перешло к проекту, из-за которого собственно и речь. Компилируется что через hbmk2, что самим харбором - без ошибок, всего с парой предупреждений, что меня немало удивило. Возникли ошибки на этапе линковки: [more]Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external '_HB_FUN_ENVPARAM' referenced from D:\HB\TRADE100.OBJ Error: Unresolved external '_HB_FUN_INKEYTRAP' referenced from D:\HB\TRADE226.OBJ Error: Unresolved external '_HB_FUN_DISKFREE' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_DISKTOTAL' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_BIOSDATE' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONTICK' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_FT_IAMIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_TRAPANYKEY' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_KEYSEND' referenced from D:\HB\TRADE200.OBJ 1) Так понимаю, это ошибки из-за того, что не находятся некоторые функции из активно используемых CT3/Nanforum Toolkit ? Что делать с ними ? Отказываться ? Или есть заменители ? Error: Unresolved external '_HB_FUN_STACKFREE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCTOT' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCTOT' referenced from D:\HB\TRADE200.OBJ 2) Это - ошибки из-за вызовов встроенных в Blinker функций, без них легко обойтись в принципе... Error: Unresolved external '_HB_FUN_STRNUM2ARRAY' referenced from D:\HB\TRADE208.OBJ Error: Unresolved external '_HB_FUN_CMJS_EXTRACTPARAMS' referenced from D:\HB\TRADE206.OBJ Error: Unresolved external '_HB_FUN_SELECTSTOCKS' referenced from D:\HB\TRADE220.OBJ Error: Unresolved external '_HB_FUN_APPLYSERTCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYCARGOCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYPRICECHAGES' referenced from D:\HB\TRADE221.OBJ 3) А вот это - самое странное - это мои функции, причем некоторые из них вызываются многократно из других модулей. Например ApplyCargoChanges является STATIC в самом модуле TRADE221 - почему линковщик ее не видит, наряду с парой Apply... других ? SelectStocks активно используется в других модулях - но там линкер почему-то ошибок не видит... [/more] Help, please - что делать и куды бечь ?

Ответов - 285, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

petr707: примеры, нужно затачивать под себя =================test_bcc.hbp=== # -platform=win -compiler=bcc #-inc -info -trace #further link options -W3 -es2 #-mt # compile options #-m #-n #-es0 -w0 #-b # libs -liphlpapi -lxhb -lhbxpp -lhbmzip -lvfw32 -lhbwin -lhbct -lhbrtl -lhbvm -lhbnf #-llibpng -lhbtip -lhbmisc -std -gtwvt -prgflag=-D_HBMK_ -DIN_NET -DHARB3 -ldflag=-aa -nohbc #-run #source TEST.PRG ... ===============test_m3.hbp== # -platform=win -compiler=mingw #-inc -info -trace #--hbinfo -quiet -oTEST_m3.EXE -workdir=C:\temp #further link options #-W3 #-es2 #-mt -ldflag=-Wl,--allow-multiple-definition # compile options #-m #-n #-es0 -w0 #-b # libs ....

Sergy: Я вот чего думаю - может придумать какой-нить "стресс-тест", который позволит по максимуму нагрузить подсистему Harbour/С и выяснить - в чем проблема? Может дело в железе/памяти/системных ошибках на конкретной машине? У кого-нить есть опыт построения подобных вещей? Первая мысль - построить массив на пару миллионов записей (учесть свободную память перед этим, разумеется) и погонять как следует по нему: сложить/вычесть/посчитать контрольные суммы... Может таблицу какую сгородить и прокрутить ее по сети...

Pasha: Сергей, ну вкратце расскажите, решена ли проблема со сваливанием программы ? Помогли советы в harbour users list ? Насколько я понял, после внесения правок в реестр (обычный трюк для клиппера) проблема исчезла ? Или это только в тестах ?


AlexMyr: Pasha пишет: Может дело в железе/памяти/системных ошибках на конкретной машине? Если проблема в этом, то были б "синие екраны смерти виндовс", плюс к этому создаются дампы памяти, по к-м можно узнать причину. Т.к. вылетала эта прога написанная на clippere, то проблема в коде, как уже было сказано в harbour users list исходников никто не видит и потому все работают в этом случае телепатами. Как я понимаю исходных кодов много, и то что все это завелось под harbour, то это большой плюс harbour-у, а код надо пересмотреть, оптимизировать, лишнее убрать, и т.д...

Sergy: Pasha пишет: Сергей, ну вкратце расскажите, решена ли проблема со сваливанием программы ? Помогли советы в harbour users list ? Насколько я понял, после внесения правок в реестр (обычный трюк для клиппера) проблема исчезла ? Или это только в тестах ? Спасибо, что не остались равнодушны. Сегодня под вечер три раза сработала вот эта мышеловка: [pre2] FUNC Main() ... some inits BEGIN SEQUENCE MainMenu() RECOVER OutReportLog("Unexpected break in the sequence catched") END SEQUENCE ExitProgram() RETURN // Main() [/pre2] Теперь вот сижу, ломаю голову, как понять, откуда она вызвана. Получается, что ProcStack() в RECOVER блоке уже ничего не показывает. Посмотрел - в std.ch нет команды переопределения BREAK <x>, например, на функцию Break(x). У меня в некоторых местах есть, к примеру, BREAK 1, BREAK 2 и потом - RECOVER USING nValue. Хочу сделать что-то наподобие #command BREAK <x> => OutReportLog("Break call"+ProcStack(,,TRUE,CRLF)) ; Break(<x>) Но не уверен в синтаксисе... hbmk2 завис на компиляции одного из *.prg файлов после внесения таких изменений в общий для всего проекта *.ch ...

Sergy: AlexMyr пишет: Если проблема в этом, то были б "синие екраны смерти виндовс", плюс к этому создаются дампы памяти, по к-м можно узнать причину. Т.к. вылетала эта прога написанная на clippere, то проблема в коде, как уже было сказано в harbour users list исходников никто не видит и потому все работают в этом случае телепатами. Как я понимаю исходных кодов много, и то что все это завелось под harbour, то это большой плюс harbour-у, а код надо пересмотреть, оптимизировать, лишнее убрать, и т.д... А чего толку от 2.5 мегабайт исходников? Я их сам 15 лет уже вижу практически каждый день, почти всё наизусть помню - а у меня на рабочем месте ни разу!!! за все время такого вылета не было... Да и на половине рабочих мест предприятия - тоже.

AlexMyr: Sergy пишет: А чего толку от 2.5 мегабайт исходников? Ну да, че толку, винда ж глючит, а она у вас лицензионная?

Sergy: AlexMyr пишет: Ну да, че толку, винда ж глючит, а она у вас лицензионная? Честно говоря, не очень понял связи.

AlexMyr: Sergy пишет: Честно говоря, не очень понял связи. Вы говорите о вылетах своей проги и не придаете никакого значения исходникам Sergy пишет: А чего толку от 2.5 мегабайт исходников? принимая их за валидный и оптимальный код. За эти дни можно было уже в каждую ф-ю и процедуру вначале и в конце вписать "начало работы такой-то func", "конец работы такой-то func" все вывести в лог файл и каждый день парсить его на предмет аномалий. Я говорю о том, что вы один на один со своей проблемой, давая только куски кода, где все вроде нормально, а в общем контексте имете то, что имете, и об этом говорили в user list.

Dima: AlexMyr пишет: и об этом говорили в user list Ссылку напомни плиз

Sergy: AlexMyr пишет: принимая их за валидный и оптимальный код. За эти дни можно было уже в каждую ф-ю и процедуру вначале и в конце вписать "начало работы такой-то func", "конец работы такой-то func" все вывести в лог файл и каждый день парсить его на предмет аномалий. Я говорю о том, что вы один на один со своей проблемой, давая только куски кода, где все вроде нормально, а в общем контексте имете то, что имете, и об этом говорили в user list. Честно говоря, не понимаю, с чего Вы так решили. Вовсе не считаю свой код валидным и оптимальным. Ищу ошибку. Сложную. По поводу "вставить в каждую функцию трассировку" - возможно и дойдет до этого, куда деваться? Пока хочу разобраться с этой болячкой путем наименьшего затрагивания исходников. Поскольку в 99.999% нажатий на кнопки клавиатуры все происходит так, как положено. И по-хорошему, можно было-бы забить на 2-3 вылета в день. Раньше вылетало чаще. Ну подумаешь, делов-то... Но я так не могу. Спасибо за поддержку в любом случае.

AlexMyr: Sergy пишет: И по-хорошему, можно было-бы забить на 2-3 вылета в день. Раньше вылетало чаще. Ну подумаешь, делов-то... Не хочу Вас обидеть, но у юзеров должны быть крепкие нервы в такой ситуации на протяжении 15 лет.

AlexMyr: Dima пишет: Ссылку напомни плиз пересмотрю user list, покажу, но там прямо так не сказано.

AlexMyr: AlexMyr пишет: Dima пишет: цитата: Ссылку напомни плиз пересмотрю user list, покажу, но там прямо так не сказано. Вот продолжение темы https://groups.google.com/forum/#!topic/harbour-users/zTxmANrh2oU

Pasha: Sergy пишет: Сегодня под вечер три раза сработала вот эта мышеловка: Скорее всего это не наш загадочный случай, а обычная ошибка, которую поймал обрработчик. Можно немного видоизменить код: recover using oErr и в протокол выдавать параметры oErr, чтобы было понятно, что это за зверь.

Sergy: Pasha пишет: Скорее всего это не наш загадочный случай, а обычная ошибка, которую поймал обрработчик. Можно немного видоизменить код: recover using oErr и в протокол выдавать параметры oErr, чтобы было понятно, что это за зверь. А если это обычный BREAK, не завернутый в BEGIN SEQUENCE ... RECOVER ... END? Таких команд в тексте много, но все они предназначены для обработки критических ситуаций с таблицами, дисками и тп... Вчера полночи просматривал исходники - вроде все ровно... Пока сделал так: #command BREAK [<x>] => BreakList(<x>) BreakList() выведет стек вызовов включая себя самого и вызовет стандартный Break(x). В случае перехвата в Main() - будет нормальный ExitProgram. Поставил там-же еще Alert() с требованием вызвать админа или программера. В тексте программы сейчас включен отладчик, сырцы на флэшке. Если буду на месте в этот момент - надеюсь поймать. Спасибо.

Pasha: Для анализа ошибок открытия файла в протокол можно выдавать значение hb_osError(). Это код ошибки последней операции, который дает windows.

Sergy: Решил двинуться дальше, в сторону подключения мыши к изначально "клавиатурной" программе. Не то, чтобы очень нужно, но задают вопросы "а с планшета можно" ? Говорю - "можно, но неудобно, тк экранная клавиатура терминального клиента занимает пол-экрана". Но какие-то шаги в этом направлении пора делать... Практически все "окна" в программе рисуются "виртуально" при помощи @ a,b,c,d BOX ..., устанавливаются "временные" относительные координаты от начала текущего окна и осуществляется SAY ... GET. Мне нужно сделать так, чтобы при нажатии мышью за пределами определенного прямоугольника в буфер клавиатуры попала команда Esc, соотв. выбранный отчет/операция будут отменены. Подскажите пожалуйста - в каком направлении двигаться для адаптирования программы под мышь? Спасибо.

Sergy: И еще вопрос: перешел на GTWVT. Какие шрифты для работы с ним кто использует? Кроме "стандартных" Courier и Lucida Console разумеется. Очень хочется сделать похожим на вот это: Для себя "нашел" ещё удачными Consolas и Andale Mono. Какие вообще требования к шрифтам, которые можно подключить к GTWVT? Так понимаю, что шрифт должен быть OpenType и Unicode ? Может быть, где-то есть готовый список ?

SergKis: Sergy пишет:для адаптирования программы под мышь в каталоге test\mouse.prg, и поищи mouse в test\*.prg для начала.



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