Форум » [x]Harbour » hash » Ответить

hash

Pasha: Что-то запутался я в трех соснах Компилирую с Harbour SVN простейшую программу: func main local h := { => } //hb_HAutoAdd(h, .t.) h:test := 'test' return nil Получаю ошибку: no exported variable TEST Почему ? AUTOADD для хэш по умолчанию включен. Да и если я его задаю напрямую, тоже не помогает. Но если я добавляю строку: #include "xhb.ch" и подлинковываю библиотеку xhb.lib, пример волшебным образом начинает работать. Почему - непонятно. Функции для хэш при этом не переопределяются (смотрю ppo), init процедур вробе бы нет. А xhb.lib мне не нужна. Что я делаю не так (ц) ? И как починить хэш ?

Ответов - 8

alkresin: xhb-diff.txt: xHarbour allows to access items in hash array using OOP interface. hVal[ "ABC" ] := 100 can be alternatively written as hVal:ABC := 100. Using OOP interface is slower then [] operator but it works for all indexes which are valid upper case [x]Harbour identifiers. By default Harbour core code does not give such functionality but it has strong enough OOP API to allow adding such extension without touching core code even by user at .prg level. It was implemented in Harbour in XHB.LIB.

a_sidorov: Попробуй h['test']:='test' или h[hname]:=hdata если переменные

Pasha: Понятно, спасибо. А как сделать, чтобы Harbour понимал синтаксис h:test := 'test' добавление xhb.ch ведь помогает. если я добавляю #pragma -ks+ то этот оператор все равно не работает Что еще может быть такого в xhb.ch ?


AlexMyr: Pasha пишет: h:test := 'test' может быть так: h["test"] := 'test' Przemek в файле xhb-diff.txt написал, что доступ к элементам осуществляется с помощью оператора []. ... опоздал.

Pasha: Да, но Harbour при указании xhb.ch отрабатывает и синтаскис h:test := 'test' Вопрос: как это достигается ? Функции вроде бы не перекрываются. Я подозреваю оператор #pragma, но он не помогает

AlexMyr: Паша, почитай xharbour/doc/hash.txt, может поможет понять разницу, вот кусок: * XHARBOUR OBJECT MESSAGE COMPATIBILITY * ===================================== * * To make programs that used TAssociativeArray() compatible with new hashes, * a basic compatibility layer has been developed. Hashes can intercept * certain "object messages" invoked with the colon (:) operator.

alkresin: Pasha пишет: Вопрос: как это достигается ? Перегрузкой операторов. По-видимому, вот этоn код из contrib/xhb все и делает: xhbcomp.prg: CREATE CLASS Hash INHERIT __HBHash FUNCTION _Hash OPTIONAL INHERIT HBHash ON ERROR FUNCTION XHB_HASHERROR() xhbmsgs.c: HB_FUNC( XHB_HASHERROR )

Pasha: Понятно, спасибо



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