Python 很难从Ctypes返回浮点值 我现在正尝试编写一些C++代码的简单包装器,这样我就能够传递一些信号数据,在GPU上进行GPU操作,然后把它发送回去。目前,我已经删除了所有GPU元素,因为我很难让ctypes返回除整数以外的任何内容 我应该先说下面的话,我不确定这个决定的严重性,但是我只是设法让cType通过C++函数中的C++函数来识别C++函数。当我尝试返航的不幸遭遇持续时,我已经意识到,不管误差来源是什么,都能明确地说出来自C++的数字和来自C的数字之间的区别。我稍后会回到这一点。 extern "C" float* giveLotsZeroes(int length) { float* list2 = (float*)malloc(sizeof(float)*length); for (unsigned int i = 0; i < length; i++) list2[i] = 0; return list2; }

Python 很难从Ctypes返回浮点值 我现在正尝试编写一些C++代码的简单包装器,这样我就能够传递一些信号数据,在GPU上进行GPU操作,然后把它发送回去。目前,我已经删除了所有GPU元素,因为我很难让ctypes返回除整数以外的任何内容 我应该先说下面的话,我不确定这个决定的严重性,但是我只是设法让cType通过C++函数中的C++函数来识别C++函数。当我尝试返航的不幸遭遇持续时,我已经意识到,不管误差来源是什么,都能明确地说出来自C++的数字和来自C的数字之间的区别。我稍后会回到这一点。 extern "C" float* giveLotsZeroes(int length) { float* list2 = (float*)malloc(sizeof(float)*length); for (unsigned int i = 0; i < length; i++) list2[i] = 0; return list2; },python,c++,c,wrapper,ctypes,Python,C++,C,Wrapper,Ctypes,这很好,但是如果我用长度变量“length”替换128,用ctypes.c_float替换ctypes.c_int,python将返回一个通常介于1e8和1e10之间的整数。对于这些奇怪的结果,我也尝试返回单浮点,这产生了类似的结果,尽管人们可能会认为,由于单值函数也返回单值,所以不那么离奇。有趣的是,当我使用np.ctypeslib.ndpointer方法定义重新类型时,pythontype函数仍然声称结果是一个numpy.ndarray,但如果您将其视为一个,它会抱怨。我尝试过将此函数的re

这很好,但是如果我用长度变量“length”替换128,用ctypes.c_float替换ctypes.c_int,python将返回一个通常介于1e8和1e10之间的整数。对于这些奇怪的结果,我也尝试返回单浮点,这产生了类似的结果,尽管人们可能会认为,由于单值函数也返回单值,所以不那么离奇。有趣的是,当我使用np.ctypeslib.ndpointer方法定义重新类型时,python
type
函数仍然声称结果是一个
numpy.ndarray
,但如果您将其视为一个,它会抱怨。我尝试过将此函数的
restypes
或函数的变体定义为
ctypes.c_float*length
ctypes.POINTER(ctypes.c_float*length)
,但没有成功

事实上,我已经做了两个函数,返回单个零点,一个从C++返回到Python,一个直接从C中完成,并使它们都将它们的零打印到控制台,以确认C既没有问题,也没有C与C++的零有关,但是到了Python时,C的零点已经变成1。(我后来发现,无论C尝试返回什么,情况都是如此)C++的零已成为一致的164。一位朋友建议将
0
的每个实例都更改为
0.0f
,这将164更改为标准随机大数

我在错误处理中遇到的唯一问题是,在一个单数但可重复的奇数实例中,
700
设法从一个函数中出来,该函数本应只能返回0到29之间的数字。不确定这可能与其他错误有什么联系,但如果它有帮助,它会有帮助

我已经在下面的pastebin中包含了我的代码,但是请注意,python代码的大部分只是测试哪些工作正常,哪些不正常


您的返回值是
ctypes.POINTER(ctypes.c\u float)


这对我不起作用,所有的dll函数都会返回整数。
.contents
返回一个错误,因为整数没有那个,而使用索引返回一个错误,因为整数没有索引。为迟到道歉,我从这个特定的项目中休息了一段时间,以赶上学习进度。@Clocks看看我的
cast
。您的函数取一个长度(int)并返回一个
浮点*
。我将该返回值从等价于
float*
的C转换为
(*float)[100]
(指向100个浮点数组的指针)。
。contents
取消对数组的引用以给出一个浮点数组,然后您可以使用
[]
。我不知道你为什么指整数……在我的回答中,除了
长度
,所有的东西都是浮点数。它肯定能工作,因为我编译了你的函数,上面的输出是直接从实际使用中获得的。@Clocks你的
粘贴库
链接代码的一个问题是,你在很多地方使用过
.res类型
。这是错误的关键字。请使用
.restype
(不是复数)。我正在比较它何时起作用和何时不起作用,我想最后一条评论就是它,我只是用复数表示。这可能会解决我所有的问题,谢谢
accelerator.getLastErrorCode.restype = np.ctypeslib.ndpointer(dtype=ctypes.c_int,shape=(128,))
accelerator.getLastLineExecuted.restype = np.ctypeslib.ndpointer(dtype=ctypes.c_int,shape=(128,))
>>> from ctypes import *
>>> dll = CDLL('test')
>>> dll.giveLotsZeroes.argtypes = c_int,
>>> dll.giveLotsZeroes.restype = POINTER(c_float)
>>> x = dll.giveLotsZeroes(100)
>>> x
<__main__.LP_c_float object at 0x0000022DE407F948>
>>> x[0]
0.0
>>> x[99]
0.0
>>> a = cast(x,POINTER(c_float*100)).contents
>>> a
<__main__.c_float_Array_100 object at 0x0000022DE45A5CC8>
>>> a[0]
0.0
>>> a[99]
0.0
>>> a[100]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: invalid index
>>> list(a)
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]