c/c++语言开发共享swig-php包装器使用指针,c代码是一个数组

我正在使用SWIG生成一个调用’c’共享库的PHP扩展。 除了下面的情况,我能够让大多数事情发挥作用……

在我的’c’代码中,我声明了一个函数(请注意结构和函数名称已被更改以保护无辜者):

int getAllThePortInfo(EthernetPort *ports); 

在这种情况下,参数端口实际上是EthernetPort结构的数组。 在另一个’c’程序中,我可以这样称呼它……

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

这很好用。 然后我运行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致命错误:在getAllThePortInfo的参数1中输入错误。 预计SWIGTYPE_p_EthernetPort

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

PHP中有什么我可以做的吗? 分配一块内存,我可以用作存储多个结构的空间?

SWIG我能做些什么来让我的包装更好地理解我的意图吗?

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

    carrays.i确实得到了我的问题的答案…

    在SWIG界面文件中,我有以下几行……

     %include  %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),允许我为我的一些常见数据提供单一位置。 我喜欢。 ?

    干杯。

    @DoranKatt,您的解决方案也适用于我,只需一个小调整。 我不得不改变swig文件中的顺序:

     %include  %include "my_lib.h" %array_functions(EthernetPort, ethernetPortArray); 

    使用原始顺序,我发现它生成的代码没有编译,因为数组函数引用了稍后在“my_lib.h”中包含的类型。 当然,我的代码使用了不同的名称和类型,但为了清楚起见,我保留了原始作者的免费精选名字大全。

    感谢您发布原始问题和答案。 这让我脱离了洞。 我在swig文档中找不到任何相关内容。

      以上就是c/c++开发分享swig-php包装器使用指针,c代码是一个数组相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/522317.html

      (0)
      上一篇 2020年12月9日
      下一篇 2020年12月9日

      精彩推荐