我应该如何声明一个数组?

时间:2015-10-21 15:27:33

标签: python c++ arrays

这是我的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具有相同的描述。

2 个答案:

答案 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