Python ctypes:使用自定义类型调用函数

2024-05-19 20:12:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试包装pre-existing c code,以便在Linux的Python中使用。我对c没有什么经验,目前我正在使用ctypes来解决这个问题。我的C函数需要一个带有自定义类型项的2d数组,但我不知道如何在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;
}

头文件已定义

^{pr2}$

其中,NCHAN_18081和NGAINS_1808是常数,udev是整数。我遵循了一个关于多维数组的older question,并试图创建一个类似于c代码中的结构。在

^{3}$

但这有两个问题:自定义类型校准不能像int或float那样用操作符*填充在数组中,而且我不能将自定义类型传递给c。我也尝试过用Python语言创建一个列表数组,但是我不能将它转换成任何可以通过ctypes传递的有用的内容。在

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


Tags: 函数类型foraddresstable数组floatctypes
1条回答
网友
1楼 · 发布于 2024-05-19 20:12:12

行:

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

应引发类型错误,因为您实例化了校准。我相信你的意思是:

^{pr2}$

但即便如此,您也不需要AINarray包装器。根据[Python]: Arrays,您可以做如下操作:

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

相关问题 更多 >