Форум » [x]Harbour » error C2223: выражение слева от "->item" должно указывать на структуру или объединение » Ответить

error C2223: выражение слева от "->item" должно указывать на структуру или объединение

tnsr2: Добрый день. В чем может быть проблема? Ошибка в коде #pragma BEGINDUMP #include "hbapi.h" #include "hbapiitm.h" HB_FUNC( INC ) { PHB_ITEM pItem = hb_param( 1, HB_IT_INTEGER ); pItem->item.asInteger.value++; hb_retni( 0 ); } #pragma ENDDUMP

Ответов - 11

Pasha: В Харборе внутренности HB_ITEM доступны только для модулей vm при сборке самого харбора См в hbapi.h: #ifdef _HB_API_INTERNAL_ ... В программах предусмотрен только доступ через функции семейств hb_itemGet*, hb_itemPut* и им подобным

Pasha: Собрать такую функцию можно, сделав ее не в модуле prg, а в модуле c: #include "hbvmint.h" #include "hbapi.h" #include "hbapiitm.h" HB_FUNC( INC ) { PHB_ITEM pItem = hb_param( 1, HB_IT_INTEGER ); pItem->item.asInteger.value++; hb_retni( 0 ); }

tnsr2: Добрый день. Павел, спасибо за развернутый ответ. Я бы не догадался сделать отдельный файл. Получилось скомпилировать. Но вызов функции не меняет значение переданное по ссылке. //---------- INC(@x) ?x //---------- В чем проблема?


Pasha: Сделал тест: proc main Local i := 0 ? i Inc(@i) ? i retu Результат: 0 1 Вроде меняет

Pasha: Если не использовать доступ к внутренним структурам, функцию можно сделать так: HB_FUNC( INC ) { PHB_ITEM pItem = hb_param( 1, HB_IT_INTEGER ); if( pItem && HB_ISBYREF( 1 ) ) hb_storni( hb_itemGetNI( pItem ) + 1, 1 ); hb_ret(); }

tnsr2: Да, все работает. Извиняюсь не тот exe запустил. Не буду плодить темы. Еще пару вопросов. Озадачился как получить значение как в Java Integer.MAX_VALUE. Решил тупо перебором. Сделал цикл ---------------- x:=0 DO WHILE .T. ?x x++ ENDDO ---------------- Но после 9000 начинает тормозить. Сделал ---------------- FOR i:=1 TO 100000 ?i NEXT ---------------- те же тормоза. Поэтому решил проверить может присвоение тормозит, но INC не решил проблему. Вот как получить Integer.MAX_VALUE? И почему тормозит цикл?

Pasha: Так в харборе в hbdefs.h определены различные #define вроде ULONG_MAX, ULONGLONG_MAX Проблема в том, что они из prg-кода недоступны Можно просто сделать свой модуль вроде lim.ch со соответсвующими определениями Правда они будут разными для 32-битной и 64-битной архитектуры В любом случае цикл здесь не нужен

tnsr2: А почему тормозит цикл по 9000?

tnsr2: после 9000

Pasha: Тормозит не цикл, а вывод на консоль, т.е. операция ?i Цикл без вывода выполняется мгновенно

tnsr2: Спасибо.



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