Python ctypes:在 c 中调用具有自定义类型的函数

2023-12-04

我正在尝试包裹预先存在的c代码用于 Linux 中的 Python。我对 c 的经验很少,目前我正在使用 ctypes 来解决这个问题。我的 C 函数需要一个带有自定义类型条目的二维数组,我不知道如何在 python 中重新创建它以将其传递给 c 函数。

这是我尝试调用的函数:

void usbBuildGainTableAI_USB1808(libusb_device_handle *udev, Calibration_AIN table[NCHAN_1808][NGAINS_1808])
{

  int i, j;
  uint16_t address = 0x7000;  // base address of ADC calibration coefficients.

  for (i = 0; i < NCHAN_1808; i++) {
    for (j = 0; j < NGAINS_1808; j++) {
      usbMemAddressW_USB1808(udev, address);
      usbMemoryR_USB1808(udev, (uint8_t *) &table[i][j].slope, sizeof(float));
      address += 4;
      usbMemAddressW_USB1808(udev, address);
      usbMemoryR_USB1808(udev, (uint8_t *) &table[i][j].offset, sizeof(float));
      address += 4;
    }
  }
  return;
}

头文件已经定义了

typedef struct Calibration_AIN_t {
  float slope;
  float offset;
} Calibration_AIN;

其中 NCHAN_18081 和 NGAINS_1808 是常量,udev 是整数。我已经关注了一个老问题关于多维数组,并尝试创建一种类似于 c 代码中的结构。

_1808 = CDLL(os.path.abspath("lib1808.so"))

NCHAN_1808 = 8  # max number of A/D channels in the device
NGAINS_1808 = 4  # max number of gain levels

class Calibration_AIN(Structure):
    _fields_ = [("slope", c_float), ("offset", c_float)]

class AINarray(Structure):
    _fields_ = [("array", (Calibration_AIN() * NCHAN_1808) * NGAINS_1808)]

table_AIN = AINarray()

_1808.usbBuildGainTableAI_USB1808(udev, table_AIN)

但这有几个问题:自定义类型 Calibration_AIN 无法像 int 或 float 那样使用运算符 * 填充在数组中,而且我无法将自定义类型传递给 c。我还尝试过用 Python 中的列表列表创建数组,但我无法将其转换为可通过 ctypes 传递的任何对 c 有用的内容。

如何在不修改c代码的情况下从python调用这个函数?任何帮助将不胜感激,并且让我知道我是否应该学习 c 并尝试用 c 或 Cython 编写我的程序。 Ctypes 可能不是最好的方法。


该行:

_fields_ = [("array", (Calibration_AIN() * NCHAN_1808) * NGAINS_1808)]

应该提出一个类型错误, 自从你实例化 校准_AIN。我相信你的意思是:

_fields_ = [("array", (Calibration_AIN * NCHAN_1808) * NGAINS_1808)]

但即便如此,您也不需要AINarray包装纸。根据[Python]:数组,你可以这样做:

Calibration_AIN_Table = (Calibration_AIN * NCHAN_1808) * NGAINS_1808

然后,为了初始化一个实例,请执行以下操作:

>>> cat = Calibration_AIN_Table()
>>> for i in range(NGAINS_1808):
...     for j in range(NCHAN_1808):
...         cat[i][j].slope = i * j
...         cat[i][j].offset = i * i * j
...
>>> cat[2][3].slope
6.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python ctypes:在 c 中调用具有自定义类型的函数 的相关文章

随机推荐

  • ajax成功后jQuery继续循环执行

    我有一个循环中的 jQuery ajax 调用 但是我不希望同时进行这些 ajax 调用 我需要先完成第一个 ajax 调用 然后再进行下一个调用 for var i 0 i lt options length i jQuery ajax
  • 在 python 中使用 enumerate() 时从列表中删除元素[重复]

    这个问题在这里已经有答案了 Object 是一个解码后的 json 对象 其中包含一个名为 items 的列表 obj json loads response body as unicode for index item in enumer
  • 如何使用 GAE 创建自动完成功能?

    我使用 jQuery UI自动完成小部件 我还有 GAE 数据存储 class Person db Model key name contains person id in format lastname firstname middlen
  • 如何将 JRE 捆绑到 Java 应用程序的 EXE 中? Launch4j 提示“运行时丢失或损坏。”

    我对 Java 编程很陌生 但总体上熟悉一切的工作原理 我希望能够将 jar 文件和 jre 放入 Windows 可执行文件 exe 中 这样当我分发它时 客户端不需要安装 JRE 我应该使用什么程序 我有 launch4j 它似乎完全符
  • WindowChrome - 无法单击标题栏中的按钮

    我的 WPF 应用程序有一个自定义 WindowChrome 样式 从此处摘取 http www bdevuyst com wpf custom title bar and taskbar 代码在这里
  • pygobject 中的拖放无响应

    我试图让拖放在 pygobject 中正常工作 但它很慢而且反应迟钝 90 的时间我必须挥动我正在拖动的项目才能成功放下它 任何人都可以看看我是否做得不正确或者这是 pygobject 的错误 这是我的代码 from gi reposito
  • 来自网络摄像头流的 Raspberry Pi 3 Python 和 OpenCV 人脸识别

    我尝试使用树莓派 3 型和摄像头模块通过 WiFi 网络传输视频 但发现与我在网上找到的其他示例存在一些不一致之处 我试图获得该视频中执行的第三次测试的结果 https www youtube com watch v sYGdge3T30o
  • 使用 Python 进程进行多处理

    我正在尝试使用 Process 将Python脚本修改为多进程 问题是它不起作用 第一步 按顺序检索内容 test1 test2 在第二个中 将并行调用它 test1 和 test2 实际上没有速度差异 如果单独执行这些函数 您会注意到差异
  • Android ActionBar setActionView布局问题

    我一直在尝试使用 ICS 中 ActionBar 中的 setActionView 看起来应该很简单 但不知怎的 我没有得到我希望的布局对齐 正如您在下图中看到的 目标 图标在其布局中正确居中 但是当我 setActionBar progr
  • 为什么新数组很慢?

    比较操作时 var fat cats cats slice to var fat cats new Array cats length 性能差异令人困惑 在 Firefox 和 Chrome 中new Array速度较慢 当它应该更快时 它
  • 如何正确使用__setattr__,避免无限递归

    我想定义一个包含以下内容的类read and write方法 可以按如下方式调用 instance read instance write instance device read instance device write 为了不使用交错
  • 沿一维的 1D 数组和 3D 数组的有效乘积 - NumPy

    我有两个 numpy 数组 一个名为 t 的一维数组 形状为 70L 其元素名为 ti 称为 I 的 3D 数组 形状为 70L 1024L 1024L 每个元素称为 Ii 因此 Ii 的尺寸为 1024L 1024L 我想沿第一维制作两个
  • 如何解决“bash:ls:找不到命令”[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我做错了什么PATH 所以目前如果我输入ls我得到的命令 bash ls command not found 我该如何解决 Restore PATH 最简单的方法是关闭当前的 she
  • SQLAlchemy 相当于 SQL“LIKE”语句

    标签列具有 苹果香蕉橙 和 草莓香蕉柠檬 等值 我想找到 SQLAlchemy 等效语句 SELECT FROM table WHERE tags LIKE banana 我应该传递什么Class query filter 去做这个 每列有
  • Android如何为回收器视图制作自定义滚动条

    我有一个用于回收器视图的自定义垂直滚动条 但用于显示项目位置的拇指有点太大 并且在顶部时处于关闭位置 在styles xml中 我使用thumb xml和track xml文件定义了自定义滚动条 用于自定义轨道和拇指 在 recyler x
  • Android:如何触发软键盘上的任意按键事件?

    有没有办法以编程方式按下 Android 软键盘的按键 就像 当键盘出现时 我想通过我的代码而不是手指按 J 键 第一种方法 IBinder binder ServiceManager getService window IWindowMa
  • fgets 被跳过

    我有一个小程序 我想询问一个选项 然后询问一个文件名 Some code before printf n printf 1 Register a file n printf 2 Get global list n printf 3 Down
  • Java - 无法解析的日期,需要格式匹配“GMT-0400”

    我有以下Java DateFormat formatter new SimpleDateFormat EEE MMM dd yyyy HH mm ss zZ zzzz Locale ENGLISH Calendar cal Calendar
  • Java 加载自定义字体文件 (.ttf)

    我在下面使用了这段代码 它出现了这个堆栈跟踪 java io FileNotFoundException font ttf No such file or directory at java io FileInputStream open
  • Python ctypes:在 c 中调用具有自定义类型的函数

    我正在尝试包裹预先存在的c代码用于 Linux 中的 Python 我对 c 的经验很少 目前我正在使用 ctypes 来解决这个问题 我的 C 函数需要一个带有自定义类型条目的二维数组 我不知道如何在 python 中重新创建它以将其传递