【发布时间】:2015-03-12 16:47:12
【问题描述】:
我正在尝试为 C 中的数组排序函数使用 python 包装器。C 获取数组,按从小到大对整数进行排序,然后返回数组。但是当我运行它时,我得到了错误:
Traceback (most recent call last):
File "sortarray.py", line 25, in <module>
newarray = sortArray(array)
File "sortarray.py", line 8, in sortArray
libsortarray.sortArray.argtypes = (ctypes.c_int, ctypes.POINTER(ctypes.c_int))
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 378, in __getattr__
func = self.__getitem__(name)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 383, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: dlsym(0x7f84484280e0, sortArray): symbol not found
Python:
import ctypes
libsortarray = ctypes.CDLL('libsortarray.so')
def sortArray(array):
global libsortarray
libsortarray.sortArray.argtypes = (ctypes.c_int, ctypes.POINTER(ctypes.c_int))
arraySize = len(array)
array_type = ctypes.c_int * arraySize
result = libsortarray.sortArray(ctypes.c_int(arraySize), array_type(*array))
return result
file = open('bigarray.txt', 'r')
#Bigarray.txt is just 10,000 lines each with a single integer
array = []
arraySize = 10000
for i in range(0,arraySize):
array.append(int(file.readline()))
file.close()
newarray = sortArray(array)
print newarray
还有 libsortarray 函数
int* sortArray(int, int*);
int* sortArray(int arraySize, int* array) {
int temp, i, j;
for (i=0; i<arraySize; i++)
for (j=i+1; j<arraySize; j++)
if (array[i] > array[j]) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}
【问题讨论】:
-
那行得通。问题 tho,当我执行
for i in newarray时,它会返回一些随机整数,我假设它是内存中的地址。如果我用newarray[i]做for i in range它可以工作,但是有没有办法仍然可以用这个返回类型做for in? -
实际上我之前确实有过重新输入,但为了帖子删除了它,因为没有它它给我的错误更少。当我将 C 中的返回类型删除为 void 时,它不会对数组进行排序。如果没有返回类型,它会在尝试打印数组时给我一个错误。所以正在努力。但除此之外,我怎样才能把它变成一个 python 类型的数组呢?当我对数组进行排序时,似乎出现了段错误(Python,而不是 c 代码),然后执行另一个名为 reverseArray(size,array)的函数。段错误应该只需要大约 500ms 也需要一段时间。
newarray=reverseArray(arraySize,newarray)
标签: python c arrays pointers ctypes