On-line: Andrey, гостей 3. Всего: 4 [подробнее..]
АвторСообщение





Пост 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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 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.

Спасибо: 1 
ПрофильЦитата Ответить
Администратор




Пост 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);
...

}


Спасибо: 1 
ПрофильЦитата Ответить





Пост 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



Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3979
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.10.20 11:54. Заголовок: Заходим в папку harb..


Заходим в папку harbour\include, ищем текст hb_itemreturn. Находим в hb_apiitm.h

Добавляем в текст программы:

#include "hb_apiitm.h"

Спасибо: 0 
ПрофильЦитата Ответить





Пост 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'



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 229
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 08.10.20 12:59. Заголовок: Pasha пишет: #inclu..


Pasha пишет:

 цитата:
#include "hb_apiitm.h"



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

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3980
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.10.20 13:11. Заголовок: Нет, это у меня опеч..


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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 282
Зарегистрирован: 05.10.06
ссылка на сообщение  Отправлено: 08.10.20 13:12. Заголовок: nick_mi пишет: без ..


nick_mi пишет:

 цитата:
без символа подчеркивания


Точно

все собралась но при вызове самой функции почему то вылетает ошибка:

 цитата:
Ошибка BASE/1001 Undefined function: ARCUS
Вызвано из:ARCUS(0)



в чем может быть дело ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3981
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.10.20 13:35. Заголовок: Сделайте в prg: req..


Сделайте в prg:

request arcus

Спасибо: 1 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 520
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет