Форум » [x]Harbour » Помогите советом начинающему... » Ответить

Помогите советом начинающему...

Urri: Тут вот надумал переползти на xHarbour. Возникла следующая проблема: имена всех функций и подпрограмм дополняются префиксом HB_FUN_. А можно ли этого избежать так, чтобы остались родные, начальные имена. У меня весь софт построен на скриптах, в которых уже стоят вызовы функций и процедур по привычным, родным именам. И перелопатить везде в 5000 текстовых файлах-скриптах вызовы функций и поменять на новые - задача крайне утомительная с непонятной перспективой на успех.

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

Петр: Urri пишет: Переполз на Harbour. ... Но тут вот новая-старая проблема: невозможно прочитать состояние клавиатуры... kbdstat() и hb_gtInfo(GTI_KBDSHIFTS) выдают значение 128 и на нажатие CTRL/ALT/SHIFT не реагируют. hb_gtInfo(GTI_KBDSHIFTS) - это вроде бы не из Harbour. Следующий код вполне сносно работает и я не вижу здесь больших проблем (тестировал XP SP3) [pre2]#include "hbgtinfo.ch" PROCEDURE main( ... ) local kbdShifts // DO WHILE inkey( 0 ) <> 27 kbdShifts := hb_gtInfo(HB_GTI_KBDSHIFTS) ? kbdShifts ? iif( hb_bitAnd( kbdShifts, HB_GTI_KBD_SHIFT) == 0, "", "Shift pressed" ) ? iif( hb_bitAnd( kbdShifts, HB_GTI_KBD_ALT) == 0, "", "Alt pressed" ) ? iif( hb_bitAnd( kbdShifts, HB_GTI_KBD_CTRL) == 0, "", "Control pressed" ) ENDDO DO WHILE inkey( 0 ) <> 27 kbdShifts := kbdstat() ? kbdShifts ? iif( hb_bitAnd( kbdShifts, 1 ) == 0, "", "Shift pressed" ) ? iif( hb_bitAnd( kbdShifts, 8 ) == 0, "", "Alt pressed" ) ? iif( hb_bitAnd( kbdShifts, 4 ) == 0, "", "Control pressed" ) ENDDO // RETURN [/pre2]

Urri: Петр пишет: Следующий код вполне сносно работает и я не вижу здесь больших проблем (тестировал XP SP3) Взял предложенный текст без единого исправления, протестировал на Harbour в XP SP2 - не работает. Этот же пример на xHarbour - работает. При создании исполняемого модуля для Harbour пользовался таким .bat файлом. Может там что-то не так, иначе совершенно непонятно, почему у Петра работает а у меня не работает. @echo off setlocal md objx @set path=%path%;g:\rab\ @set path=%path%;G:\PROC\BCC55\Bin\ @set HB_INSTALL=g:\proc\harbour @set HB_BIN_INSTALL=%HB_INSTALL%\bin @set HB_LIB_INSTALL=%HB_INSTALL%\lib @set HB_INC_INSTALL=%HB_INSTALL%\include @set HB_BCC_INSTALL=g:\proc\bcc55 @set HB_BCC_BIN_INSTALL=%HB_BCC_INSTALL%\bin @set HB_BCC_LIB_INSTALL=%HB_BCC_INSTALL%\lib @set HB_BCC_INC_INSTALL=%HB_BCC_INSTALL%\include %HB_BIN_INSTALL%\harbour main -n -q0 -gc -i%HB_INC_INSTALL% %HARBOURFLAGS% -oobjx\ -m /dHarbour @set HB_LIBLIST=gtwin.lib hbcpage.lib hbdebug.lib hbct.lib hbvm.lib hbrtl.lib hbwhat.lib hblang.lib hbrdd.lib hbmacro.lib hbpp.lib rddfpt.lib rddntx.lib rddcdx.lib hbhsx.lib hbsix.lib hbcommon.lib hbpcre.lib hbzlib.lib rddads.lib ace32.lib %HB_USER_LIBS% %HB_BCC_BIN_INSTALL%\bcc32 -O2 -d -c -oobjx\main.obj %CFLAGS% -I%HB_BCC_INC_INSTALL% -I%HB_INC_INSTALL% -L%HB_BCC_LIB_INSTALL% -L%HB_LIB_INSTALL% objx\main.c %HB_LIBLIST% %HB_BCC_BIN_INSTALL%\bcc32 -O2 -d -emain %CFLAGS% -nobjx\ -I%HB_BCC_INC_INSTALL% -I%HB_INC_INSTALL% -L%HB_BCC_LIB_INSTALL% -L%HB_LIB_INSTALL% objx\main.c %HB_LIBLIST% copy objx\main.exe . main.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 //F:120 //swappath:'c:\' //temppath:'c:\' endlocal

Петр: Urri пишет: При создании исполняемого модуля для Harbour пользовался таким .bat файлом. Может там что-то не так, иначе совершенно непонятно, почему у Петра работает а у меня не работает Угу, а какой вы версией Harbour пользуетесь. К примеру у меня harbour.exe -build 2>info.txt info.txt Harbour 2.0.0beta2 (Rev. 11555) Copyright (c) 1999-2009, http://www.harbour-project.org/ Harbour Build Info --------------------------- Version: Harbour 2.0.0beta2 (Rev. 11555) Compiler: Borland C++ 5.5.1 (32-bit) Platform: Windows XP 5.1.2600 Service Pack 3 PCode version: 0.2 ChangeLog last entry: 2009-06-27 20:47 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) ChangeLog ID: ChangeLog 11555 2009-06-28 03:59:59Z vouchcac Built on: Jun 28 2009 11:57:43 Extra Harbour compiler options: -l Extra C compiler options: -DHB_LEGACY_OFF -DHB_GC_AUTO -DHB_HVM_ALL -DSQLITE3_LIB -DSQLITE_ENABLE_COLUMN_METADATA Build options: Language options: (Clipper 5.3) (Clipper 5.x undoc) (Xbase++) (Flagship) ---------------------------


Urri: Вот что у меня про версию пишет G:\PROC\Harbour\bin>harbour.exe -build > aaa.txt Harbour 1.0.1 Intl. (Rev. 9429) Copyright (c) 1999-2008, http://www.harbour-project.org/ Harbour Build Info --------------------------- Version: Harbour 1.0.1 Intl. (Rev. 9429) PCode version: 0.2 Compiler: Borland C++ 5.5.1 (32 bit) Platform: Windows XP 5.1.2600 Service Pack 2 Built on: Sep 17 2008 20:08:58 Last ChangeLog entry: 2008-09-17 18:04 UTC+0200 Viktor Szakats (harbour.01 syenar hu) ChangeLog SVN version: ChangeLog 9429 2008-09-17 16:07:27Z vszakats Extra Harbour compiler switches: -l Extra C compiler switches: -OS -Ov -Oi -Oc -tWM Other build settings: (C mode) Clipper 5.3b compatible extensions: yes Clipper 5.2e/5.3b compatible undocumented: yes Clipper 5.2e/5.3b strict compatibility: no Xbase++ compatible extensions: yes FlagShip compatible extensions: yes Visual Objects compatible extensions: no FoxPro compatible extensions: no dBase compatible extensions: no CLIP compatible extensions: no Non-portable Harbour extensions: no Profiler: off Memory tracing and statistics: off Maximum symbol name length: 63 ---------------------------

Петр: Urri пишет: Built on: Sep 17 2008 20:08:58 Last ChangeLog entry: 2008-09-17 18:04 UTC+0200 Viktor Szakats (harbour.01 syenar hu) Ищите что-нибудь после 2008-12-19 12:56 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * harbour/source/rtl/gtwin/gtwin.c ! Fixed HB_GTI_KBDSHIFTS not working in console mode.

Urri: И где же его искать такой, чтобы работал и без глюков. Вот предлагали у Григория взять последнюю сборку, так она выдает неразрешенные ссылки, которые неясно где искать, и много библиотек он не включил в свою сборку, например для работы с ADS. Прийдется похоже срочно осваивать CVS и там продираться сквозь дебри. А это такая потеря времени... Разберусь со временем конечно. А сейчас может кто поделится нормальной рабочей версией Harbour?

alkresin: Думаю, что официальный релиз 2.0 выйдет очень скоро. Пока можете скачивать http://harbour-project.org/harbour-nightly.zip - формируемый каждую ночь пакет со свежайшими, только из печки, исходниками. Но тут могут быть и глюки - живой процесс все-таки. В частности, сегодня качать не советую - были сообщения об ошибке в RDD.

PSP: alkresin пишет: Пока можете скачивать http://harbour-project.org/harbour-nightly.zip - формируемый каждую ночь пакет со свежайшими, только из печки, исходниками. Добавлю: в корне архива есть файл INSTALL, в котором описано, как собрать Harbour. Удачи.

Urri: Добрый день уважаемые. Или я такой невезучий или как почтенное сообщество работает с Harbour'ами и радуется? Что-то кол-во неожиданностей в работе этих продуктов начинает раздражать. Очередная мрачная история приключилась. При работе с xHarbour возникли осложнения при вызове SQL запросов. AlKresin участвовал в изучении проблемы и давал рекомендации (я выкладывал здесь самодостаточный пример, который почему-то работал то 28, то 22 раза в зависимости от вызываемого запроса). Результатом нашей дискуссии стало то, что я переполз на Harbour. Рассмотренный с AlKresin пример заработал без проблем. Я переделал много программ, т.к. вдруг выяснилось расхождение в работе обоих Harbour'ов для элементов массивов в макроподстановках и строковых переменных. Плюс куча всего еще... Наконец заработало весьма прилично. Давай же пробовать SQL - работает. Только вот мой сотрудник увидел, что не работает SQL запрос с русскими литералами в тексте запроса. Фигня, подумал я. При помощи Pasha эту проблему решили, сейчас за пару минут вылечим ситуацию. Аккуратненько заменил одну строку, в которой отменяется перекодировка из OEM в ANSI (так как мне Pasha текст этой строки дал). Обрадовался... Но что-то дернуло проверить результат на том заработавшем примере, с которым мы работали с AlKresin, в котором даже не было русских букв в запросе. И оказалось, что запрос в цикле работает всего 44 раза, а затем программа с криком об ошибке вылетает на обыкновенном операторе присваивания строковой переменной текста запроса (т.е. примерно как и xHarbour). Убираю корректировку из исходника библиотеки RDDADS - все работает, обратно добавляю - 44 раза радости и полный аут. Ну и что теперь с этим делать??? Подскажите, гуру? При таком неожиданном возникновении проблем на ровном месте стрёмно всех своих юзеров пересаживать на Harbour. Тут пока трое работают в отладочно-боевом режиме - так постоянные непонятки выползают. А 150 человек - это меня живьём съедят. Не допустите, пожалуйста, может и я на что сгожусь сообществу Клиппер-Харбористов.

alkresin: Я переделал много программ, т.к. вдруг выяснилось расхождение в работе обоих Harbour'ов для элементов массивов в макроподстановках и строковых переменных. Что именно неправильно работает в Harbour ? Приведите пример - если поведение действительно отличается от Клипперовского, я обращусь с этим в Harbour developers mail list. Убираю корректировку из исходника библиотеки RDDADS - все работает, обратно добавляю - 44 раза радости и полный аут. Ну и что теперь с этим делать??? Пример - на стол.

Urri: alkresin пишет: Что именно неправильно работает в Harbour ? Приведите пример - если поведение действительно отличается от Клипперовского, я обращусь с этим в Harbour developers mail list. Вот пожалуйста пример. *-------------------------------------- procedure main s='9876543210' private arr[10] for i=1 to 10 arr[ i]=s && Работает в Клиппере, но в xHarbour и в Наrbour не работает && arr[ i]=substr(s,1,len(s)) && Работает в xHarbour, но в Наrbour не работает && arr[ i]=substr(s+' ',1,len(s)) && Работает в Наrbour next ? 1,arr[1] ? 2,arr[2] ? 3,arr[3] ? arr[1]=mid(@arr[1],1,10,'0123456789') ? 1,arr[1] ? 2,arr[2] ? 3,arr[3] ? r='s' && Работает в Клиппере, xHarbour, Harbour &r+='*' ? s,r r='arr[1]' && Работает в Клиппере, xHarbour. В Harbour не работает &r+='*' ? arr[1],r inkey(100) quit #pragma BEGINDUMP #include "G:\PROC\C\Harbour\my.h" #include "G:\PROC\C\Harbour\extend.h" #include "G:\PROC\C\Harbour\extend.api" CLIPPER HB_FUN_MID() { /* par1 - исх.строка par2 - начальная позиция par3 - сколько символов par4 - чем заменить */ char *str1=_parc(1),*str2=_parc(4); register int k=_parni(2)-1,l=_parni(3),j=0; register int m=_parclen(1),n=_parclen(4); switch (l) { case 0: break; case -1: /* if (n==1) while (k<m) str1[k++]=str2[0]; else */ while ((k<m)&&(j<n)) str1[k++]=str2[j++]; break; default: l+=k; /* if (n==1) while (k<l) str1[k++]=str2[0]; else */ while ((k<l)&&(j<n)) str1[k++]=str2[j++]; break; }; _retclen(str1,m); }; #pragma ENDDUMP Ф-ция MID используется в Клиппере лет 18, еще в те светлые времена, когда начинался PC бум, но компы были неторопливые и приходилось экономить мгновения процессорного времени. Поэтому к этой ф-ции обращение идет в первом параметре с использованием @ (т.е. by ref) для корректировки строки без создания ее копии. Этот прием нашел и другие очень значительные в моей работе применения. А в Харборах, наверное из-за промежуточного С, всем элементам массива присваивается одна и та же ссылка (на область памяти) на строку S (из примера), тогда как в Клиппере это не так). При переходе на xHarbour пока об этом сообразил - утомился. Пытался надурить С и записал такое хитрое выражение substr(s,1,len(s)). Сработало!!! При переходе на Harbour надеялся, что такой мой трюк сработает и здесь. Дудки... Harbour оказался дюже умный и такие вещи не позволил мне делать. Пришлось еще более исхитриться и писать substr(s+' ',1,len(s)). Но пока до этого после xHarbour'а додумался - трижды утомился. А макроподстановка для элемента массива и использования += (а также для -= и ++, -- (для числовых)) выдает синтаксическую ошибку в Harbour, тогда как в Клиппере работает много лет и в Xharbour работает.

Urri: alkresin пишет: Пример - на стол. Это тот же пример, что я здесь показывал вам в моем ответе 24.06.09 в 17.15. А исправления делал так, как указывал Pasha в своем ответе 18.06.09 в 13.23. (с той лишь разницей, что тогда я пересобирал библиотеку для xHarbour, а теперь для Harbour). Мне тут рекомендовали брать последнее состояние Harbour по адресу http://harbour-project.org/harbour-nightly.zip, но что то боязно из-за сыроватости. Я то взял для попробовать, только почему-то 25% работы сделало, но на TBROWSE из библиотеки rt загибается и все. Причем брал три последних версии и в каждой такая проблема. Они там что, раздают версии не проверяя как они хоть собираться будут?

Dima: Urri пишет: arr=s && Работает в Клиппере, но в xHarbour и в Наrbour не работает Проверил в xharbour 1.2.1 (6468) работает

Dima: Urri пишет: && arr=substr(s,1,len(s)) 3 параметр можно и не задавать в данном примере

alkresin: Я то взял для попробовать, только почему-то 25% работы сделало, но на TBROWSE из библиотеки rt загибается и все. Какой работы ? Сборки Harbour или сборки вашей программы ? Как оно загибается ( какие сообщения ) ? Они там что, раздают версии не проверяя как они хоть собираться будут? Эти пакеты строятся автоматически скриптом на сервере, их, конечно, никто не проверяет - кроме тех, кто постит изменения, они , по идее, должны проверять, не сломали ли чего. Я скачивал исходники вчера и сегодня напрямую с SVN - и сам Harbour у меня нормально собирался, и программы.

Urri: Dima пишет: Какой работы ? Сборки Harbour или сборки вашей программы ? Как оно загибается ( какие сообщения ) ? Сборки Harbour... Error: public '' in module 'TBROWSE' clashes with prior module 'TBROWSE'

alkresin: arr=s && Работает в Клиппере, но в xHarbour и в Наrbour не работает && arr=substr(s,1,len(s)) && Работает в xHarbour, но в Наrbour не работает Работает это в Harbour и я не вижу ни одной причины, почему бы оно не работало. Другое дело, что потом программа вылетает на ? 1, arr[1] и в Клиипере, и в Harbour - т.к. после присвоений arr - строка, а не массив. r='arr[1]' && Работает в Клиппере, xHarbour. В Harbour не работает &r+='*' Это в Harbour действительно не работает, напишу в mail list. Ф-я Mid в таком виде,действительно, работать не будет - но это же С код, здесь полную совместимость гарантировать нельзя, многое зависит от реализации конкретного компилятора.

alkresin: Сборки Harbour... Error: public '' in module 'TBROWSE' clashes with prior module 'TBROWSE' Это что-то у вас, попробуйте сделать clean build - удалить все следы предыдущей сборки.

Urri: Dima пишет: цитата: arr=s && Работает в Клиппере, но в xHarbour и в Наrbour не работает Проверил в xharbour 1.2.1 (648) работает У меня xharbour 1.2.1 (6406). Не работает не в том смысле, что ошибку выдает, а в том смысле, что все 10 элементов массива имеют одинаковое значение, хотя я исправлял только первый элемент массива (в приведенном примере только первых три вывел на экран)

Urri: alkresin пишет: цитата: arr=s && Работает в Клиппере, но в xHarbour и в Наrbour не работает && arr=substr(s,1,len(s)) && Работает в xHarbour, но в Наrbour не работает Работает это в Harbour и я не вижу ни одной причины, почему бы оно не работало. Другое дело, что потом программа вылетает на ? 1, arr[1] и в Клиипере, и в Harbour - т.к. после присвоений arr - строка, а не массив. Ни фига себе, я не понял???!!! Копировал из проверяемого примера сюда в ответ... Извиняюсь, что ввел в заблуждение примером. При копировании пропали квадратные скобки с индексом, не понимаю почему. правильный текст в цикле такой for i=1 to 10 arr=s && Работает в Клиппере, но в xHarbour и в Наrbour не работает && arr=substr(s,1,len(s)) && Работает в xHarbour, но в Наrbour не работает && arr=substr(s+' ',1,len(s)) && Работает в Наrbour next т.е. всем элементам массива присваивается S. После этого меняем содержимое первого элемента, но при этом и содержимое остальных строк меняется так же, а этого не должно быть. Работает здесь имеется ввиду не то что вылетает, а то что потом при исправлении первого элемента остальные не портятся.



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