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

Posted

技术标签:

【中文标题】我应该如何声明一个数组?【英文标题】:How should I declare an array? 【发布时间】:2015-10-21 15:27:32 【问题描述】:

这是我的 dll 函数示例。我知道我应该忽略返回值,但是如何在 Python 中声明数组以取回新数组?

C++ 代码:

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;

我想在我的 Python 程序中使用这个函数。如果我将数组传递给函数,通常的描述有效,但如果想要取回它,它就不起作用。

python_list = [1, 2, 3, 6, 10, 4]
a = (ctypes.c_int * len(python_list))(*python_list)
b = SortFunc(a, n)
print(b[:])

当我使用它时,我会看到一个错误:“'int' object is not subscriptable”,数组 b 与数组 a 具有相同的描述。

【问题讨论】:

您的 Python 代码在我的机器上运行良好。它会产生什么错误信息或不良行为?请同时包含对 SortFunc 的调用,因为问题可能在那里发生。 哦,请原谅我的不准确。当我想返回值并打印数组时它不起作用。如果我将数组传递给函数,则此描述有效,但如果要取回它则无效。当我使用这个b = SortFunc(a, n) 并尝试打印它print(b[:]) 时,我会看到一个错误:“'int' object is not subscriptable”,数组 b 与数组 a 具有相同的描述。 谢谢,这很有帮助。请编辑您的问题以包含此信息。 C++ 认为它返回的是什么类型? Python 认为它收到了什么类型?在 return 之前打印出 arr 的类型;打印出 b 的类型。从您的消息来看,Python 似乎认为它得到了一个 int 而不是一个 int 列表,但让我们用两个运行时系统检查一下。 我的任务是编写 C++ dll 并在 Python 中使用它,但我以前从未研究过它。这就是为什么我在描述所有这些方面遇到了一些麻烦。该程序更改数组 a。这意味着如果我使用这个函数,我将得到一个排序数组 a,它可以工作。但我想学习如何将数组 b 描述为结果 【参考方案1】:

看起来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

【讨论】:

是的,它修改了arr 并且可以工作,但我想返回新数组。我有一个想法用另一个数组调用该函数,但我只是不知道如何实现这一点。感谢您的帮助,这非常有帮助!【参考方案2】:

我不确定究竟是什么导致您看到该错误,但我怀疑“b”的创建方式出了点问题。我假设您的函数的 Python 版本略有不同,因为 Python 的语法不允许使用“for (int i = 0...)”语法。

也就是说,我能够从您的 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[:])

作为输入,给出来自“print(b[:])”调用的排序数组 [1, 2, 3, 4, 6, 10]。

附带说明一下,您只需调用“sorted(a)”即可获得相同的结果,据我了解,这与您编写的函数的作用相同。

【讨论】:

以上是关于我应该如何声明一个数组?的主要内容,如果未能解决你的问题,请参考以下文章

为啥全局数组大小应该是一个整数常量?

用变量声明一个数组[重复]

动态初始化的数组大小示例

通过引用返回指针数组

如何从 API 声明数组来代替硬编码数组?

如何在方法中声明数组[重复]