【发布时间】:2016-02-06 19:42:35
【问题描述】:
您好,我正在尝试调用具有以下签名的 c++ 函数
change_mountain_heights(mnt *mountains[],float32 heights[],int8 num_elements)
这个想法来自 python 我可以有一个山脉及其高度的列表,我可以调用 c++ 函数来设置它们的高度。 C++ 函数需要 2 个数组。一个包含山名的数组和另一个包含山高的数组。
所以在 python 中我有 2 个列表
- mountains=[乞力马扎罗山,mount_saina,mount_elgon]
- mnt_heights=[100.1,200,3331.56]
- element_count=len(山)
我使用ctypes并调用c函数如下,
def change_heights(mountain_list,height_list,element_count):
mountain_array=(ctypes.c_char_p * len(mountain_list))(*mountain_list)
height_array=(ctypes.c_float * len(height_list))(*height_list)
element_count_param=ctypes.c_int8(element_count)
change_mountain_heights.argtypes=(ctypes.c_char_p,ctypes.c_float,ctypes.c_int8)
_success=change_mountain_heights(mountain_array,height_array,element_count_param)
但它似乎不起作用,我不能 100% 确定我是否正确地创建了数组,因为大小 和 确保山字符串正确分配给数组, 同样对于高度。我做错了什么,还是应该在别处寻找问题的根源?
更新
我认为其中一个问题源于
change_mountain_heights.argtypes=(ctypes.c_char_p,ctypes.c_float,ctypes.c_int8)
现在山脉列表是一个字符串数组,或者在 python 中是一个字符串列表,我如何将 argtypes 设置为字符串列表或至少是一个字符串数组。
我是否正确假设我在 argtypes 中使用的 ctypes.c_char_p 不允许我将字符串数组传递给函数?我应该在 argtypes 中有什么表明我将通过
- 一个包含字符串的数组
- 一个包含浮点数的数组
我在 windows 上使用 python 2.7.10 问候
【问题讨论】:
-
你能定义“它似乎不起作用”吗?您至少可以调用该函数吗?由于该函数是一个 c++ 函数,如果它没有声明为
extern "C",它可能会被导出为一个修饰函数名。mnt只是typedef上的char吗? -
我可以调用该函数,实际上它并没有崩溃,但是当我查看新的山高时,它们保持不变。我单步执行了代码,成功返回 1,失败返回 0(我快速阅读了一些文档),它总是返回 0。我想我没有正确的 argtypes。但我不确定如何将数组声明为 argtypes 的一部分。
-
函数如何知道两个数组中有多少元素(因为它们不是 size 参数)?这是否意味着
moutains数组中的最后一个元素是NULL? -
抱歉没觉得size参数很重要,更新问题
标签: c++ python-2.7 ctypes