Форум » [x]Harbour » передача параметров и типы данных в функцию C » Ответить

передача параметров и типы данных в функцию C

MIKHAIL: Нужно в функцию на С передать много параметров, которые в самой функции оформлены в структуру, а так же получить обратно ответ из функции в соответствии с этой структурой. структура в С имеет вид : apartment1.owner = "Денис"; //заполняем данные о владельце и т.д. apartment1.city = "Симферополь"; apartment1.amountRooms = 5; apartment1.price = 150000; .... и т.д. до 20 значений. Передача их как именных параметров неудобно и трудоемко. Оптимально было бы передать хэш массив, созданный по аналогу со структурой: apartment1[owner]:= "Денис" apartment1[city]:= "Симферополь" apartment1[amountRooms]:= 5 apartment1[price]:= 150000 ..... И так же его вернуть из функции, с теми же ключами, но новыми значениями Подскажите кто знает, как передать и вернуть хэш массив из функции C

Ответов - 9

alkresin: Передать и вернуть хэш-массив нетрудно. Чтобы получить, например: PHB_ITEM pHash = hb_param( 1, HB_IT_ANY ); Произвести необходимые действия немного сложнее, но вполне возможно. Для этого существует "The Hash tables API (C level)", src/vm/hashes.c. Чтобы получить значение по ключу, например, можно использовать PHB_ITEM hb_hashGetCItemPtr( PHB_ITEM pHash, const char * pszKey ) здесь pHash - тот, что получили с помошью hb_param(), pszKey - ключ. Возвращаемое значение имеет тип PHB_ITEM, т.е., число или строку из него надо извлечь с помощью, соответственно, long hb_itemGetNL( PHB_ITEM pItem ) или const char * hb_itemGetCPtr( PHB_ITEM pItem ) эти и многие другие функции для работы с PHB_ITEM находятся в src/vm/itemapi.c.

Pasha: Проще передавать не хеш, а регулярный массив, аналог позиционных параметров. C_Func({cOwner, cCity, 5, ...}) [pre]HB_FUNC( C_FUNC ) { PHB_ITEM pArray = hb_param( 1, HB_IT_ARRAY ); apartment1.owner = hb_arrayGetCPtr(pArray, 1); //заполняем данные о владельце и т.д. apartment1.city = hb_arrayGetCPtr(pArray, 2); apartment1.amountRooms = hb_arrayGetCPtr(pArray, 3); ... // возврат значений hb_arraySetC(pArray, 1, apartment1.owner); hb_arraySetC(pArray, 2, apartment1.city); hb_arraySetNI(pArray, 3, apartment1.amountRooms); ... } [/pre]

MIKHAIL: А как вернуть массив ? Подсмотрел где то : hb_itemRelease( hb_itemReturn( pArray) ); использую наугад, так как описания нету при сборке выдает ошибку : Warning W8065 d:\\magazin\\magazin.prg 16349: Call to function 'hb_itemReturn' with no prototype in function HB_FUN_ARCUS Warning W8065 d:\\magazin\\magazin.prg 16349: Call to function 'hb_itemRelease' with no prototype in function HB_FUN_ARCUS


Pasha: Заходим в папку harbour\include, ищем текст hb_itemreturn. Находим в hb_apiitm.h Добавляем в текст программы: #include "hb_apiitm.h"

MIKHAIL: Pasha пишет: Добавляем в текст программы: #include "hb_apiitm.h" это ведь нужно вставлять в раздел после #pragma BEGINDUMP правильно ? У меня почему то пишет при сборке не может открыть этот файл, я уже и в папку с программой его скопировал и атрибуты проверил, что может быть ? Error E2209 d:\\magazin\\magazin.prg 16224: Unable to open include file 'hb_apiitm.h'

nick_mi: Pasha пишет: #include "hb_apiitm.h" У меня Harbour 3.2.0dev (r1408221241) и есть #include "hbapiitm.h" (без символа подчеркивания) У меня устаревший Harbour?

Pasha: Нет, это у меня опечатка. Конечно hbapiitm.h

MIKHAIL: nick_mi пишет: без символа подчеркивания Точно все собралась но при вызове самой функции почему то вылетает ошибка: Ошибка BASE/1001 Undefined function: ARCUS Вызвано из:ARCUS(0) в чем может быть дело ?

Pasha: Сделайте в prg: request arcus



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