我应该如何声明一个数组?
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)”即可获得相同的结果,据我了解,这与您编写的函数的作用相同。
【讨论】:
以上是关于我应该如何声明一个数组?的主要内容,如果未能解决你的问题,请参考以下文章