Автор | Сообщение |
|
| Администратор
|
Пост N: 2614
Зарегистрирован: 23.05.05
|
|
Отправлено: 17.12.12 11:30. Заголовок: hash
Что-то запутался я в трех соснах Компилирую с 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
[только новые]
|
|
|
| moderator
|
Пост N: 498
Зарегистрирован: 06.07.06
|
|
Отправлено: 17.12.12 12:23. Заголовок: xhb-diff.txt: xHarbo..
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. |
|
|
|
|
|
| |
Пост N: 23
Зарегистрирован: 07.06.08
|
|
Отправлено: 17.12.12 12:25. Заголовок: Попробуй h:='tes..
Попробуй h['test']:='test' или h[hname]:=hdata если переменные
|
|
|
|
| Администратор
|
Пост N: 2615
Зарегистрирован: 23.05.05
|
|
Отправлено: 17.12.12 12:31. Заголовок: Понятно, спасибо. А ..
Понятно, спасибо. А как сделать, чтобы Harbour понимал синтаксис h:test := 'test' добавление xhb.ch ведь помогает. если я добавляю #pragma -ks+ то этот оператор все равно не работает Что еще может быть такого в xhb.ch ?
|
|
|
|
| |
Пост N: 685
Зарегистрирован: 11.06.10
|
|
Отправлено: 17.12.12 12:31. Заголовок: Pasha пишет: h:test..
Pasha пишет: может быть так: h["test"] := 'test' Przemek в файле xhb-diff.txt написал, что доступ к элементам осуществляется с помощью оператора []. ... опоздал.
|
|
|
|
| Администратор
|
Пост N: 2616
Зарегистрирован: 23.05.05
|
|
Отправлено: 17.12.12 12:39. Заголовок: Да, но Harbour при у..
Да, но Harbour при указании xhb.ch отрабатывает и синтаскис h:test := 'test' Вопрос: как это достигается ? Функции вроде бы не перекрываются. Я подозреваю оператор #pragma, но он не помогает
|
|
|
|
| |
Пост N: 686
Зарегистрирован: 11.06.10
|
|
Отправлено: 17.12.12 12:49. Заголовок: Паша, почитай xharbo..
Паша, почитай 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.
|
|
|
|
| moderator
|
Пост N: 499
Зарегистрирован: 06.07.06
|
|
Отправлено: 17.12.12 13:22. Заголовок: Pasha пишет: Вопрос..
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 )
|
|
|
|
| Администратор
|
Пост N: 2617
Зарегистрирован: 23.05.05
|
|
Отправлено: 17.12.12 13:29. Заголовок: Понятно, спасибо..
Понятно, спасибо
|
|
|
|