Автор | Сообщение |
|
| |
Пост N: 278
Зарегистрирован: 05.10.06
|
|
Отправлено: 05.10.20 09:10. Заголовок: передача параметров и типы данных в функцию C
Нужно в функцию на С передать много параметров, которые в самой функции оформлены в структуру, а так же получить обратно ответ из функции в соответствии с этой структурой. структура в С имеет вид : apartment1.owner = "Денис"; //заполняем данные о владельце и т.д. apartment1.city = "Симферополь"; apartment1.amountRooms = 5; apartment1.price = 150000; .... и т.д. до 20 значений. Передача их как именных параметров неудобно и трудоемко. Оптимально было бы передать хэш массив, созданный по аналогу со структурой: apartment1[owner]:= "Денис" apartment1[city]:= "Симферополь" apartment1[amountRooms]:= 5 apartment1[price]:= 150000 ..... И так же его вернуть из функции, с теми же ключами, но новыми значениями Подскажите кто знает, как передать и вернуть хэш массив из функции C
|
|
|
Ответов - 9
[только новые]
|
|
|
| moderator
|
Пост N: 1432
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.10.20 09:30. Заголовок: Передать и вернуть х..
Передать и вернуть хэш-массив нетрудно. Чтобы получить, например: 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.
|
|
|
|
| Администратор
|
Пост N: 3976
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.10.20 09:50. Заголовок: Проще передавать не ..
Проще передавать не хеш, а регулярный массив, аналог позиционных параметров. C_Func({cOwner, cCity, 5, ...}) 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); ... }
|
|
|
|
| |
Пост N: 280
Зарегистрирован: 05.10.06
|
|
Отправлено: 08.10.20 10:48. Заголовок: А как вернуть массив..
А как вернуть массив ? Подсмотрел где то : цитата: | 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 |
|
|
|
|
|
| Администратор
|
Пост N: 3979
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.10.20 11:54. Заголовок: Заходим в папку harb..
Заходим в папку harbour\include, ищем текст hb_itemreturn. Находим в hb_apiitm.h Добавляем в текст программы: #include "hb_apiitm.h"
|
|
|
|
| |
Пост N: 281
Зарегистрирован: 05.10.06
|
|
Отправлено: 08.10.20 12:34. Заголовок: Pasha пишет: Добавл..
Pasha пишет: цитата: | Добавляем в текст программы: #include "hb_apiitm.h" |
| это ведь нужно вставлять в раздел после #pragma BEGINDUMP правильно ? У меня почему то пишет при сборке не может открыть этот файл, я уже и в папку с программой его скопировал и атрибуты проверил, что может быть ? цитата: | Error E2209 d:\\magazin\\magazin.prg 16224: Unable to open include file 'hb_apiitm.h' |
|
|
|
|
|
| |
Пост N: 229
Зарегистрирован: 19.05.05
|
|
Отправлено: 08.10.20 12:59. Заголовок: Pasha пишет: #inclu..
Pasha пишет: У меня Harbour 3.2.0dev (r1408221241) и есть #include "hbapiitm.h" (без символа подчеркивания) У меня устаревший Harbour?
|
|
|
|
| Администратор
|
Пост N: 3980
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.10.20 13:11. Заголовок: Нет, это у меня опеч..
Нет, это у меня опечатка. Конечно hbapiitm.h
|
|
|
|
| |
Пост N: 282
Зарегистрирован: 05.10.06
|
|
Отправлено: 08.10.20 13:12. Заголовок: nick_mi пишет: без ..
nick_mi пишет: цитата: | без символа подчеркивания |
| Точно все собралась но при вызове самой функции почему то вылетает ошибка: цитата: | Ошибка BASE/1001 Undefined function: ARCUS Вызвано из:ARCUS(0) |
| в чем может быть дело ?
|
|
|
|
| Администратор
|
Пост N: 3981
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.10.20 13:35. Заголовок: Сделайте в prg: req..
Сделайте в prg: request arcus
|
|
|
|