我试图在TCL中建立一个测试框架,该框架将允许我通过TCP套接字在远程设备上执行脚本化测试。已经存在一个Visual Basic界面,在Ubuntu中使用SWIG,我正在重用它调用的C函数来构建一个共享库,该库将作为TCL的扩展。
通过C远程过程调用控制设备。我能够使用SWIG封装往返于TCL的复杂结构,以包装调用这些RPC的函数。 SWIG甚至会给我访问器函数,以允许我创建指向这些结构的指针,然后将它们输入RPC函数中。但是,当我想创建一个指向原语或单个数据元素的指针时,我陷入了困境。在这种情况下,SWIG不创建访问器功能。例如,RPC函数可能具有以下形式的原型:
rpc_testDefaults ( testDefaults_t, *testDefaults, dataValid_t, *validStatus );
这里的
*testDefaults
是指向复杂结构的指针,并且SWIG生成形式为new_testDefaults_t
,delete_testDefaults_t
,testDefaults_t_firstElement_set
,testDefaults_t_firstElement_get
等的访问器函数。*validStatus
是指向单个数据元素(uint32_t)的指针,但不生成访问器函数。我的界面文件的格式为:
// rpcTest.i
%module rpcTest
%include <stdint.h>
%{
#include "header.h"
}%
%include "header.h"
我的header.h定义了
testDefaults_t
和dataValid_t
的类型。理想情况下,我可以在SWIG接口文件中包含一个标志或其他内容,从创建访问器的角度来看,该文件将告诉SWIG将所有指针与结构相同。
通过将
*validStatus
的typedef定义为单个元素结构(可以为我提供常规的访问器功能),或者使用cpointer.i并在接口文件中定义类型,我已经能够访问dataValid_t
中的数据。这给了我一组不同的访问器功能。我宁愿不必走这两种路线,因为在完整的api中,此问题会发生数百次,但可能会发生变化。我也可以使用类型映射并将指针分配为输出来工作,但是我再次感到这增加了乏味的代码,我希望使用同一组访问器函数来管理此数据。因此,有没有一种方法可以自动检测这些指针并为它们提供访问器功能,而不必编写数百行常规冗余代码?
任何帮助深表感谢。
最佳答案
最终我找到了解决方案:%pointer_functions(dataValid_t,validStatus)
为称为有效状态的单条数据生成new_,delete _,_ assign和_value函数。我认为这仅适用于结构。每当遇到此问题时,我都必须这样做,但比修改源代码更好。