Форум » [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: Спасибо.
полная версия страницы