【发布时间】:2018-04-17 16:03:02
【问题描述】:
我正在为 Strand/Straus7 使用 python 脚本来导入他的 DLL。
我正在尝试调用一个名为 St7SetUnits 的函数来设置单位,按照手册 (Img.1) 并查看我导入的 DLL (Img.2) 的 .py 脚本)。该函数需要一个 c_long 和一个 ctypes.POINTER.(c_long),如脚本中指定的 (Img.3)
这里是完整的手册 strand7.com/downloads/Strand7%20R246%20API%20Manual%20TOC.pdf
这里是 .py 脚本https://www.dropbox.com/s/88plz2funjqy1vb/St7API.py?dl=0
如手册开头所述,我必须将列表转换为 ctypes 数组 (Img.4)。 我调用的函数与示例相同,但我无法正确调用它。 我写
import St7API as SA
import ctypes
SA.St7Init()
unitsArray = ctypes.c_int * SA.kLastUnit
units = unitsArray()
units[0] = 0
units[1] = 1
units[2] = 3
units[3] = 1
units[4] = 1
units[5] = 2
SA.St7SetUnits(1, units)
但返回错误
expected c_long, got c_long_Array_6
如果我尝试其他方法,例如数组中的 int
SA.St7SetUnits(1, units[0])
错误变化
expected LP_c_long, got int
我尝试了很多解决方案,但没有一个有效。
谁能帮帮我?
非常感谢
【问题讨论】:
-
如果可能,最好 (a) 链接到实际手册而不是其屏幕截图,并且 (b) 将相关文本复制并粘贴到问题中,这样链接在第一名。有时这是不可能的(例如,很难链接到印刷书籍),如果图表不是文本,则无法将其复制并粘贴为没有可怕的 ASCII 艺术的文本),但如果可能的话,请编辑您的问题。
-
无论如何,你做事的方式是调用一个需要
ctypes数组的函数的方式,你得到的错误消息说函数不需要一个ctypes数组。可能库中存在错误,或者文档中存在错误,或者您将旧文档用于新版本库的不匹配,反之亦然。 -
感谢您的建议,这是我第一次在这里问问题,我是一个非常初学者。
-
也感谢您的回答。实际上,当我放入其他内容时,错误消息会发生变化。例如,如果我写 SA.St7SetUnits(1, units[0]) 返回预期的 LP_c_long, got int
-
LP_c_long意味着它需要一个指向 int 的指针,所以 int 肯定行不通。一个整数数组应该像在 C 中一样自动“衰减”到指向该数组的指针,但如果这不起作用,您可以显式传递一个指向该数组的指针,可能通过使用byref或 @ 987654334@ 函数来自ctypes。你不应该这样做,但是如果库作者在设置argtypes时做了一些奇怪的事情,也许这就是问题所在,所以试试看会发生什么。