gpt4 book ai didi

php - swig-php 包装器使用指针,c 代码是一个数组

转载 作者:行者123 更新时间:2023-11-30 16:03:02 25 4
gpt4 key购买 nike

我正在使用 SWIG 生成调用“c”共享库的 PHP 扩展。除了以下情况之外,我能够使大多数事情正常工作......

在我的“c”代码中,我将函数声明为(请注意,结构和函数名称已更改以保护无辜者):

int getAllThePortInfo(EthernetPort *ports);

在这种情况下,参数ports实际上是一个EthernetPort结构数组。在另一个“c”程序中,我可以这样调用它......

EthernetPort ports[4];
int rval = getAllThePortInfo(ports);
<etc>
<etc>

这很好用。然后我运行 SWIG,生成我的共享库,一切都构建良好。我得到了可以调用的 php 代码...

$ports = new_ethernetport();
$rval = getAllThePortInfo($ports);

这会导致 PHP 抛出以下错误:php:free():无效指针:0x099cb610

所以,我尝试做一些事情......

$ports = array(new_ethernetport(), new_ethernetport(), new_ethernetport(), new_ethernetport());
$rval = getAllThePortInfo($ports);

但是后来 PHP 提示了......PHP fatal error :getAllThePortInfo 的参数 1 中键入错误。预期为 SWIGTYPE_p_EthernetPort

我认为正在发生的事情是 PHP(和 SWIG)不区分指针和数组,并且在包装器中,它正在考虑“指向单个结构的指针”,而实际上,它是一个结构数组。

我可以用 PHP 做些什么吗?分配一 block 内存,我可以将其用作存储多个结构的空间?

我可以使用 SWIG 做些什么来让我的包装器更好地理解我的意图吗?

我真的很感激任何建议。谢谢。

最佳答案

carrays.i 确实掌握了我问题的答案...

在 SWIG 接口(interface)文件中,我有以下几行...

%include <carrays.i>
%array_functions(EthernetPort, ethernetPortArray);
%include "my_lib.h"

“my_lib.h”包含EthernetPort结构的typedef,以及函数声明...

#define NUM_ETHERNET_PORTS 4

typedef struct {
int number;
mode_t mode;
} EthernetPort;

int getAllThePortInfo(EthernetPort *ports);

运行 SWIG 并构建共享库 my_lib.so 后,我可以使用以下 PHP 代码...

$ports = new_ethernetPortArray(NUM_ETHERNET_PORTS);
$rval = getAllThePortInfo($ports);

$port0 = ethernetPortArray_getitem($ports, 0);
$pnum = ethernetport_number_get($port1);
$pmode = ethernetport_mode_get($port1);

// port1 port2 port3 etc etc

delete_ethernetPortArray($ports);

PHP 函数 new_ethernetPortArrayethernetPortArray_getitemethernetport_number_getethernetport_mode_getdelete_ethernetPortArray都是 SWIG 基于 .i 文件创建的。

SWIG 带来的另一个好处是在我的 php 代码中使用 #define(例如 NUM_ETHERNET_PORTS),让我可以将一些常用数据放在一个位置。我喜欢。 :-)

干杯。

关于php - swig-php 包装器使用指针,c 代码是一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4504727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com