这是我的dll函数的一个例子。我明白我应该忽略返回值,但是如何在Python中声明数组以获取新数组?
C ++代码:
<div class="top">
<h>HEADER</h>
</div>
<div class="down">
<div class="left">Left Cont</div>
<div class="main">Main Cont</div>
</div>
我想在我的Python程序中使用这个函数。如果我将数组传递给函数,通常的描述是有效的,但是如果想要将它返回,它就不起作用。
extern "C" _declspec(dllexport) int* SortFunc(int arr[], int n)
{
for(int i = 1; i < n; i++)
for(int j = i; j > 0 && arr[j-1] > arr[j]; j--)
{
int temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
}
return arr;
}
当我使用它时,我会看到一个错误:&#34;&#39; int&#39;对象不是可订阅的&#34;,数组b与数组a具有相同的描述。
答案 0 :(得分:0)
我不确定究竟是什么导致你看到这个错误,尽管我怀疑是怎么回事&#34; b&#34;得到了。我假设你的Python函数略有不同,因为Python的语法不允许&#34; for(int i = 0 ...)&#34;语法。
也就是说,我能够从C函数的以下Python实现中获得一个正确排序的数组:
def sort_func(arr, n):
for i in range(1, n):
for j in range (i, 0, -1):
if arr[j-1] > arr[j]:
temp = arr[j - 1]
arr[j - 1] = arr[j]
arr[j] = temp
return arr
使用
运行时python_list = [1, 2, 3, 6, 10, 4]
a = (ctypes.c_int * len(python_list))(*python_list)
b = sort_func(a, len(python_list))
print(b[:])
作为输入,从调用&#34; print(b [:])&#34;中提供排序后的数组[1,2,3,4,6,10]。
作为旁注,你可以通过简单地调用&#34; sorted(a)&#34;来实现相同的结果,根据我的理解,它将与你的书面函数一样。
答案 1 :(得分:0)
看起来SortFunc
修改了arr
。这有用吗?
SortFunc(a, n)
print(a[:]) # hopefully this will now show [1, 2, 3, 4, 6, 10]
我认为使用您当前的代码,b
可能只是一个int,也许是一个错误标志。您可能需要使用按引用传递来获取结果,而不是返回结果。所以Python代码看起来像:
SortFunc(a, b, n)
print(b[:])
那会打电话给void SortFunc(int arr[], int sorted[], int n)
。 http://staff.mbi-berlin.de/schultz/Call_C-DLL_from_Python.txt处有一些代码可以通过引用更改数组。
还有一件事:我不确定这会有效,但你可能会尝试返回一个新的已分配数组,而不是返回arr
:
int * sorted_array = new int[n];
// Read in values from arr and sort them into sorted_array...
return sorted_array