我试图从Python脚本中调用C方法,但在调用将char**array作为参数输出的方法时遇到了一个问题。
C层中的方法如下所示helper.c
文件:
//This method takes filename as input and oNames as output
extern C int GetNames(char* iFilename, char** oNames)
{
int oNumNames, oStatus;
/*io* pIo = GetIoInstance();*/
std::vector<EString> names;
CreateIoInstance(iFilename);
oStatus = pIo->get_names(names);
oNumNames = (int)names.size();
for (int ii = 0; ii < oNumNames; ii++)
{
strcpy(oNames[ii], names[ii].c_str());
}
return 0;
}
请帮助我从python脚本调用此方法
from ctypes import *
dll = CDLL('D:\\python\\working.dll')
dll.GetNames = dll.GetNames
dll.GetNames.argtypes = (c_char_p, POINTER(c_char_p))
dll.GetStageNames.restype = c_int
filename = "in.h5"
def GetNames(filename):
ostagenames = POINTER(c_char_p)
err = dll.GetStageNames(filename, ostagenames)
return err, ostagenames.value
我简化了函数,将重点放在
char**
参数上。在编写示例函数时,它假定内存已预分配,但没有接口指示用于输出的数组大小或数组中的单个字符串。在本例中,内存预分配给一个3元素数组,每个字符串最多20个字符,但实际上,用户必须预分配足够长的字符串,以便在实际情况下保存返回值test.cpp:
test.py:
输出:
如果您可以随意更改API,那么动态分配内存以便以后可以释放它会使其更加灵活。这是一个非常丑陋的字符***,但它的工作:
test.cpp:
test.py:
输出:
相关问题 更多 >
编程相关推荐