使用 ctypes 传递数组

2023-11-23

我有一个C函数

void read_FIFO_AI0(int16_t** input, size_t size, NiFpga_Session* session, NiFpga_Status* status)
{
  *input = (int16_t*) malloc (size*sizeof(int16_t));
  // function that populates the array *input
}

它填充数组“*input”。现在我想将该数组中的数据传递给 python 进行进一步处理。我尝试使用 ctypes 来做到这一点:

def read_FIFO_AI0(size,session,status):
    _libfpga.read_FIFO_AI0.argtypes = [POINTER(ARRAY(c_int16, size)), c_int, POINTER(c_uint32), POINTER(c_int32)]
    _libfpga.read_FIFO_AI0.restype = None

    values = (c_int16*size)()
    _libfpga.read_FIFO_AI0(byref(values),size,byref(session),byref(status))
    return values

代码执行但我在数组中得到错误的结果。当我尝试从 C 内部使用 C 函数时,我得到了正确的结果:

size_t size=20;
int16_t* input;

read_FIFO_AI0(&input, size, &session, &status);

填充数组以便我可以在 Python 中访问数据的正确方法是什么?我并不局限于使用指向填充数组的指针,我也可以在 C 函数中创建数组并将其作为返回发送给 Python,但我也没有开始工作。


第一个参数的类型是POINTER(POINTER(c_int16)) not POINTER(ARRAY(c_int16,size)).

这是一个简短的例子:

x.c(编译为cl /LD x.c:

#include <stdlib.h>
#include <stdint.h>
__declspec(dllexport) void read(int16_t** input, size_t size)
{
  int i;
  int16_t* p = (int16_t*) malloc (size*sizeof(int16_t));
  for(i=0;i<size;i++)
    p[i] = i;
  *input = p;
}
__declspec(dllexport) void release(int16_t* input)
{
    free(input);
}

x.py

from ctypes import *
x = CDLL('x')
x.read.argtypes = POINTER(POINTER(c_int16)),c_size_t
x.read.restype = None
x.release.argtypes = [POINTER(c_int16)]
x.release.restype = None
p = POINTER(c_int16)()
x.read(p,5)
for i in range(5):
    print(p[i])
x.release(p)

Output:

0
1
2
3
4

请注意,如果您不记得,这可能会导致潜在的内存泄漏free the malloc。更好的方法是在 Python 中分配缓冲区并告诉 C 函数大小:

x.c

#include <stdlib.h>
#include <stdint.h>
__declspec(dllexport) void read(int16_t* input, size_t size)
{
  int i;
  for(i=0;i<size;i++)
    input[i] = i;
}

x.py

from ctypes import *
x = CDLL('x')
x.read.argtypes = POINTER(c_int16),c_size_t
x.read.restype = None
p = (c_int16*5)()
x.read(p,len(p))
print(list(p))

Output

[0, 1, 2, 3, 4]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ctypes 传递数组 的相关文章

随机推荐

  • Camel http4 使用 Https 上的基本身份验证下载文件

    我正在尝试从以下位置下载文件Https需要基本身份验证的 url 我正在使用 HTTP4 我正在尝试从网址下载 文件下载后 我需要将其保存到文件夹中 这是我的代码的样子 from xxx to http4 ebc cybersource c
  • 以编程方式在另一个桌面(空间)中打开 NSWindow

    在我的 OSX 项目中 我想要 识别 NSWindow 所在的桌面 公开空间之一 在确定的 Space 中打开 NSWindow 而不仅仅是在当前 Space 上 有没有办法完成这些简单的任务 浏览文档 NSWindowController
  • “void”是函数的有效返回值吗?

    private void SaveMoney string id public void DoSthWithMoney string action string id if action save return SaveMoney stri
  • 在WPF DataGrid中通过列标题获取列索引

    如何获得Column索引或Column DisplayIndex从它的Column Header in WPF DataGrid 我知道Column Header 想要得到column index 你可以用DisplayIndex 请注意
  • 在 netbeans 中为 .dll/.so 文件提供“java.library.path”

    我如何给出路径 dll or sonetbeans 中的文件以使用以下方式加载库 System loadLibrary Foo I read 这在 Netbeans 页面上 但无法帮助我 因为它给出了不满意的链接错误 这是我尝试过的两件事
  • wymeditor 无法保存插入的 iframe

    Wym编辑器 http wymeditor org 总是删除插入的 iframe 的内容 所以我无法将 vimeo 播放器块添加到我的页面 我怎样才能避免它 问候 阿列克谢 扎哈罗夫 Since 2011 年 5 月 31 日 WYMedi
  • Windows 上 MBCS 和 UTF-8 的区别

    我正在阅读有关 Windows 上的字符集和编码的信息 我注意到 Visual Studio 编译器 针对 C 中有两个编译器标志 称为 MBCS 和 UNICODE 它们之间有什么区别 我不明白的是 UTF 8 在概念上与 MBCS 编码
  • 在 HTML5 canvas 元素内移动矩形(像素)区域的最快方法是什么

    我想实现 HTML5 canvas 元素内容的垂直滚动 我不想再次渲染整个内容 相反 我想将整个内容向下 向上移动 并仅渲染已滚动到视图中的区域 我尝试过getImageData and putImageData函数 但在我的测试中它们几乎
  • linux中有类似COM0COM这样的程序吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我在Windows中使用com0com进行程序测试 linux下有没有类似com0com的程序 我知道有 pts ptmx 但我想要的是一个独立的程
  • Google 地球与 Google 地图 API v3 集成了吗?

    我正在尝试将 Google 地球集成到 Google 地图中 我发现它是possible在 v2 中 但我找不到任何关于如何使用 v3 执行此操作的文档 不幸的是 这尚未在 Google Maps API v3 中实现 请参阅相应的tick
  • groupByKey 是否比 reduceByKey 更受青睐

    我总是用reduceByKey当我需要对 RDD 中的数据进行分组时 因为它在打乱数据之前执行映射端缩减 这通常意味着更少的数据被打乱 从而获得更好的性能 即使当map端reduce函数收集了所有值并且没有实际减少数据量时 我仍然使用red
  • 在(据称)高性能代码中使用 GetCurrentMethod

    出于记录目的 我们应用程序中的一些方法包括以下行 Dim Log As ILog GetLog Reflection MethodBase GetCurrentMethod DeclaringType 我对反思有一种可以说是非理性的恐惧 我
  • 如何从java调用C#函数[重复]

    这个问题在这里已经有答案了 我需要从 java 调用 C 函数 为此我创建了以下内容 我创建了一个java头文件Authenticator h 代码如下 include
  • 循环遍历数组并成对输出(每个第二个元素的分隔符)

    我有一个包含匿名元素的数组 元素通过 php 添加到数组中 如下所示 playlist array while databaseloop playlist a title playlist a length echo json encode
  • 通用集合中的记录相等性

    假设您有一条带有重载相等运算符的记录 TSomeRecord record Value String class operator Equal Left Right TSomeRecord Boolean end 实现比较字符串值 如果根据
  • Linux中每个进程的最大线程数

    我编写了一个简单的程序来计算Linux Centos 5 中一个进程可以拥有的最大线程数 这是代码 int main pthread t thrd 400 for int i 0 i lt 400 i int err pthread cre
  • NuGet 包引用复制 dll 本地

    我需要将 NuGet dll 的 Copy Local 设置为 false 在此之前 我使用了包配置格式 一切正常 迁移到后封装参考格式 我找不到如何做到这一点的方法 有人可以帮助我吗 您可以使用私有资产 从文档复制
  • 使用 Hibernate API 进行 Java 字符串日期验证

    我正在尝试验证字符串日期 using javax validation 休眠验证 我需要检查给定的字符串日期应该是过去的并且它应该是正确的yyyyMMdd具有所有限制的格式 例如闰年 30th 31st day public class U
  • 如何捕获鼠标移动事件

    我想在我的主窗体中捕获鼠标移动事件 虽然我能够连接MouseEventHandler对于主窗体 当光标位于 UserControl 或任何其他控件上时 该事件不再触发 如何确保我始终掌握鼠标位置 您可以使用低级鼠标钩 看this示例并检查
  • 使用 ctypes 传递数组

    我有一个C函数 void read FIFO AI0 int16 t input size t size NiFpga Session session NiFpga Status status input int16 t malloc si