Форум » [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

Dima: Sergy пишет: символы CHR(16) заменяются на "?" и соотв. выводятся назад уже не в виде треугольников, а в виде знаков вопроса. Простой и понятный исходник сюда. У себя такого не наблюдал. PS GTWVT

Pasha: Sergy пишет: А может быть какая-нибудь петрушка с SAVESCREEN / RESTSCREEN ? Совершенно непонятно, в чем заключается ваша проблема. Разве трудно сделать простейшие тесты, чтобы проверить, как работает кодовая страница в rdd, вроде такого: REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) dbCreate('aa', {{'CC','C',1,0}},, .t., 'aa',, 'RU866') for i := 0 to 255 aa->(dbAppend()) aa->CC := Chr(i) next и посмотреть на выходной файл ? Да и протестировать savescreen/restscreen ? @ 0,0 say chr(16) cc := SaveScreen(0,0,0,0) RestScreen(0,2,0,2,cc)

petr707: Нет никакой перекодировки и треугольника уже нет Просто в используемом Вами шрифте на этом месте другое изображение. Есть стандартноая утилита Windows TableMap ( Пуск\Все программы\Служебные\Таблица символов) Если треугольник сильно нужен, можно создать свой шрифт.


Sergy: Все эти выкладки конечно здорово, но факт остается фактом... :( По поводу шрифта - тестировал Lucida Console. Эффект повторяется 1:1. 900 вызовов проходят нормально, а один - корявится. Поэтому пока не могу создать тест... Такая вот петрушка.

Pasha: Так огласите наконец-то, что за факт. Все телепаты в отпуске. Сначала вы говорили что-то перекодировку в use, потом про savescreen. Трудно отвечать на незаданный вопрос, а разгадывать шарады не хочется.

Sergy: Pasha пишет: Так огласите наконец-то, что за факт. Все телепаты в отпуске. Сначала вы говорили что-то перекодировку в use, потом про savescreen. Трудно отвечать на незаданный вопрос, а разгадывать шарады не хочется. Есть функция SaveConsole(), которая делает SAVESCREEN и кладет его в локальную DBF таблицу, чтобы не расходовать память. Ровно в одном месте программы в таблицу стали попадать символы "?" вместо CHR(16). И соотв. при восстановлении экрана в RestConsole() происходит RESTSCREEN(0,0,MAXROW(),MAXCOL(), console->buffer) Ровно в одном месте программы. Первая мысль была на USE ... CODEPAGE. Спросил, знающий человек быстро откликнулся (за что ему спасибо), проверил - не помогло. Стал копать дальше. Оказывается, SAVESCREEN именно в этом месте программы возвращает "испорченные" коды. Которые попадают в таблицу и USE уже ни причем - он пишет в таблицу то, что ему вернул SAVESCREEN(). Во всей программе все работает как нужно. В этом, одном, единственном месте, написанном на чистом Clipper безо всяких наворотов - такая вот петрушка... Поэтому, собственно, пока единственный вопрос - были ли у кого-нить на Harbour проблемы с SAVESCREEN() / RESTSCREEN() или нет.

PSP: Я никогда, даже во времена работы с Клиппером, не сохранял экраны в dbf. Просто делал сохранение в массив, выполнявший роль стека LIFO (last in first out). Даже с Клиппером память ни разу не исчерпалась.

Dima: PSP пишет: Я никогда, даже во времена работы с Клиппером, не сохранял экраны в dbf. +1

petr707: символы "?" ( это картинка) вместо CHR(16) ( а это - число,байт,...) Либо - символы "?" вместо символа "x" , либо CHR(n) вместо CHR(16) Сохраняейте в бинарный файл (типа TXT) и смотрите содержимое любым Hex-вьюером(editor)

Sergy: PSP пишет: Я никогда, даже во времена работы с Клиппером, не сохранял экраны в dbf. Просто делал сохранение в массив, выполнявший роль стека LIFO (last in first out). Даже с Клиппером память ни разу не исчерпалась. Выключить эту опцию сегодня - дело трех строчек кода. Наверное так и сделаю. Но это пока не решает этого мелкого вопросика, о котором речь. petr707 пишет: символы "?" ( это картинка) вместо CHR(16) ( а это - число,байт,...) Либо - символы "?" вместо символа "x" , либо CHR(n) вместо CHR(16) Сохраняейте в бинарный файл (типа TXT) и смотрите содержимое любым Hex-вьюером(editor) Символ CHR(16) - это такой треугольник, который изображает, что данный пункт имеет вложенное подменю. Например: "Документы >" при выборе этого пункта вызывается меню с документами. После SAVESCREEN/RESTSCREEN получается так: "Документы ?" т.е. вместо CHR(16) получается CHR(63) - как раз выяснилось из сравнения слитых в txt результатов SAVESCREEN() Надеюсь, что понятно объяснил.

PSP: А какой тип поля в dbf?

Pasha: Символ CHR(16) - это такой треугольник, который изображает, что данный пункт имеет вложенное подменю. Например: "Документы >" при выборе этого пункта вызывается меню с документами. Я точно также отмечаю меню с подменю символом Chr(16), и тоже использую при этом savescreen/restscreen. Правда, сохраняю все в структурах типа стек. Проблем не возникало.

Sergy: PSP пишет: А какой тип поля в dbf? CHAR, с размером ширина*высота экрана * 2 (для атрибутов) Pasha пишет: Я точно также отмечаю меню с подменю символом Chr(16), и тоже использую при этом savescreen/restscreen. Правда, сохраняю все в структурах типа стек. Проблем не возникало. Сейчас стало совершенно понятно, что структуры точно не причем. RESTSCREEN() возвращает вместо треугольника знак вопроса.

AlexMyr: Sergy пишет: RESTSCREEN() возвращает вместо треугольника знак вопроса. Самодостаточный пример в студию, как говорится.

Dima: Sergy А вот так будут BAD ? ;) [pre2] proc main local csave local csave1 local i cls for i=1 to 10000 @ 10,10 say chr(16) color "gr+/r" csave:=savescreen(10,10,10,10) if left(csave,1)#chr(16) ? "Bad Savescreen " wait endif @ 10,10 say " " color "n/n" restscreen(10,10,10,10,csave) csave1:=savescreen(10,10,10,10) if left(csave1,1)#chr(16) ? "Bad Restscreen" wait endif next return [/pre2]

Sergy: AlexMyr пишет: Самодостаточный пример в студию, как говорится. Если-бы было все так просто... Из нескольких сотен вызовов SAVESCREEN/RESTSCREEN все работает ровно. Заковыка только в одном-единственном. Может еще где есть в программе - там вызовов десятки, если не сотни разбросаны. Ведь все происходит довольно быстро: SAVESCREEN - диалог - RESTSCREEN и практически сразу идет перепрорисовка меню. Заметить сложно. Пока вычислил один, но совершенно точно - врет... Либо глюк. Dima пишет: Sergy А вот так будут BAD ? Вечером смогу ответить.

PSP: Sergy пишет: Заковыка только в одном-единственном Пошагово выполнить программу. Может там действительно перед выполнением savescreen() знаки вопроса на экране.

Sergy: Dima пишет: Sergy А вот так будут BAD ? Не очень понял смысла кода (память/видеоадаптер проверялся что-ли...), но ни одной надписи "Bad savescreen" не получил.

Dima: Sergy Думаю где то твой косяк , просто подумай где он. У меня тоже при переводе программы на Harbour c Сlipper был глюк который не мог долго поймать. Психовал даже маленько ;) Но поймал. PS на форуме таких примеров при "переводе" достаточно, о якобы глюках Harbour.

Sergy: PSP пишет: Пошагово выполнить программу. Так и сделал. И акуел, если честно: [pre2] FUNC Main() LOCAL i,sx,cBuffer1,cBuffer2 REQUEST HB_LANG_RU866 REQUEST HB_CODEPAGE_RU866 HB_LANGSELECT("RU866") HB_CDPSELECT("RU866") CLEAR SCREEN sx:="" FOR i:=1 TO 30 sx += CHR(i) NEXT i @ 10,10 SAY sx cBuffer1 := SAVESCREEN(0,0,MAXROW(),MAXCOL()) INKEY(0) RUN("dir >nul") // Проблема оказалась тут... cBuffer2 := SAVESCREEN(0,0,MAXROW(),MAXCOL()) RESTSCREEN(0,0,MAXROW(),MAXCOL(),cBuffer2) @ 12,10 SAY "Two screens are " + IIF(cBuffer1 == cBuffer2,"EQUAL","DIFFERENT") INKEY(0) RETURN [/pre2] Загвоздка оказалась в команде RUN. Как она может повлиять на SAVESCREEN() - ума не приложу.



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