从在C层进行内存分配的python脚本float *数组传递把C方法
问题说明
我试图从Python脚本调用C方法,C方法调用又将C 方法调用。我正在使用malloc()在getResults()方法内部分配数组。现在的问题是如何在python脚本中将参数传递给float * oresults,该脚本的内存分配发生在C层内。
这是io.c
I am trying to call C methods from Python script, C method calls inturn the C method. I am allocating array inside the getResults() method using malloc(). Now the issue is how to pass the arguments to float* oresults in python script whose memory allocation takes place inside the C layer. This is io.c
int getResults(char* iFilename, char* iStagename, int iStateidCnt,
int* Stateids, int iEntityIdCount, int* iEntityids, char* iEntityType,
char* iVariablegroup, char* ivariable, int *oRescount,
float* oResults)
{
int Status, i;
EString etype(iEntityType), stagename(iStagename);
EString vargroup(iVariablegroup);
std::vector<ERF_INT> entity_ids;
std::vector<ERF_INT> stateids;
std::vector<ERF_FLOAT> results;
_CopyIntArrayIntoVector(iStateidCnt, Stateids, stateids);
_CopyIntArrayIntoVector(iEntityIdCount, iEntityids, entity_ids);
CreateIoInstance(iFilename, iStagename);
ioData pIodata = CreateIoDataInstance();
if (iEntityIdCount <= 0)
pIodata.setWholeSection(true);
else
{
pIodata.setWholeSection(false);
pIodata.setEntityList(entity_ids);
}
pIodata.setStateList(stateids);
pIodata.setType(etype);
pIodata.setVariableGroup(iVariablegroup);
pIodata.setVariable(ivariable);
//This is C method
Status = pIo->get_results(pIodata, results);
*oRescount = results.size();
//allocation for oresults whose size > 2
oResults = (float*)malloc(results.size() * sizeof(float));
_CopyVectorIntoDoubleArray(results, oResults);
return Status;
}
test.py
from ctypes import *
import os, sys
dll = CDLL('D:\\erf_utils_python\\erf_utils_io.dll')
dll.getresults.argtypes = (c_char_p,c_char_p,c_int,POINTER(c_int),c_int,POINTER(c_int),c_char_p,
c_char_p,c_char_p,POINTER(c_int),POINTER(c_float))
dll.getresults.restype = c_int
def make_array(ctype,arr):
return len(arr),(ctype * len(arr))(*arr)
def getresults(filename,stagename,sids,eids,entitytype,groups,variables):
if(len(sids)>0):
stateidcount,stateids = make_array(c_int,sids)
if(len(eids)>0):
entityidcount,entityid = make_array(c_int,eids)
oresultlen = c_int()
float_values = POINTER(c_float)
err = dll.getresults(filename,stagename,stateidcount,stateids,entityidcount,entityid,
entitytype,groups,variables,byref(oresultlen), byref(float_values))
return err,oresultlen.value, float_values
filename = b'D:\\inputfile.h5'
stagename = b"post"
stateids = [2]
stateidcount = 1
entityidcount = 1
entityid = [1]
entitytype = b"test"
variablecount = 1
variablegroup = b"testdata"
variable = b"next"
err,oreslen,ores = getresults(filename,stagename,stateids,entityid,entitytype,variablegroup,variable)
TypeError:byref()参数必须是ctypes实例,而不是
'_ctypes.PyCPointerType'这是我在运行$ b时遇到的错误$ b脚本。我对如何为float
*参数在脚本中发送结果感到困惑。
TypeError: byref() argument must be a ctypes instance, not '_ctypes.PyCPointerType' this is the error I get when I run the script. I am little confused on how to send argument for float *oresults in script.
正确答案
在C 代码中,签名 int getResults(...,float * oResults)
无法将分配的指针传达回调用方。这行
In the C code, the signature int getResults(..., float* oResults)
isn't able to communicate the allocated pointer back to the caller. The line
oResults = (float*)malloc(results.size() * sizeof(float));
在getResults中本地设置 oResults
指针,而不会影响调用者。为了输出指针,您必须返回
或使用指针到指针参数: int getResults(...,float * * oResults)
。
sets the oResults
pointer locally within getResults, without affecting the caller. In order to output a pointer, you must either return
it or use a pointer-to-pointer argument: int getResults(..., float** oResults)
.
在Python代码中,我对ctypes不熟悉,但它看起来像 float_values = POINTER(c_float)
是个问题。 POINTER(c_float)
创建一个Python type 作为浮动指针。您希望 POINTER(c_float)()
创建此类指针的实例(最初为空)。
In the Python code, I'm not familiar with ctypes but it looks like float_values = POINTER(c_float)
is a problem. POINTER(c_float)
creates a Python type for a pointer to float. You'd want POINTER(c_float)()
to make an instance of such a pointer (which is initially null).
ctypes有关指针的文档:
https://docs.python.org/ 3 / library / ctypes.html#pointers
ctypes documentation on pointers: https://docs.python.org/3/library/ctypes.html#pointers
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /reply/detail/tanhcgabch
-
YouTube API 不能在 iOS (iPhone/iPad) 工作,但在桌面浏览器工作正常?
it1352 07-30 -
iPhone,一张图像叠加到另一张图像上以创建要保存的新图像?(水印)
it1352 07-17 -
保持在后台运行的 iPhone 应用程序完全可操作
it1352 07-25 -
使用 iPhone 进行移动设备管理
it1352 07-23 -
在android同时打开手电筒和前置摄像头
it1352 09-28 -
扫描 NFC 标签时是否可以启动应用程序?
it1352 08-02 -
检查邮件是否发送成功
it1352 07-25 -
Android微调工具-删除当前选择
it1352 06-20 -
希伯来语的空格句子标记化错误
it1352 06-22 -
Android App 和三星 Galaxy S4 不兼容
it1352 07-20