gpt4 book ai didi

python - Python 中的 C++ 库 : custom sorting method

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:50 24 4
gpt4 key购买 nike

我想在 C++ 中制作一个自定义排序方法并在 Python 中导入它。我不是 C++ 专家,这里是“sort_counting”的实现

#include <iostream>
#include <time.h>

using namespace std;

const int MAX = 30;

class cSort
{
public:
void sort( int* arr, int len )
{
int mi, mx, z = 0; findMinMax( arr, len, mi, mx );
int nlen = ( mx - mi ) + 1; int* temp = new int[nlen];
memset( temp, 0, nlen * sizeof( int ) );

for( int i = 0; i < len; i++ ) temp[arr[i] - mi]++;

for( int i = mi; i <= mx; i++ )
{
while( temp[i - mi] )
{
arr[z++] = i;
temp[i - mi]--;
}
}

delete [] temp;
}

private:
void findMinMax( int* arr, int len, int& mi, int& mx )
{
mi = INT_MAX; mx = 0;
for( int i = 0; i < len; i++ )
{
if( arr[i] > mx ) mx = arr[i];
if( arr[i] < mi ) mi = arr[i];
}
}
};

int main( int* arr )
{
cSort s;
s.sort( arr, 100 );

return *arr;
}

然后在python中使用它

from ctypes import cdll
lib = cdll.LoadLibrary('sort_counting.so')

result = lib.main([3,4,7,5,10,1])

编译顺利

如何重写一个 C++ 方法来接收一个数组,然后返回一个排序后的数组?

最佳答案

错误很明显:ctypes 不知道如何将 python 列表转换为 int * 以传递给您的函数。事实上,python 整数不是一个简单的int列表不是只是一个数组。

ctypes 的功能是有限制的。将通用 python list 转换为 int 数组不是可以自动完成的事情。

这解释了here :

None, integers, bytes objects and (unicode) strings are the only native Python objects that can directly be used as parameters in these function calls. None is passed as a C NULL pointer, bytes objects and strings are passed as pointer to the memory block that contains their data (char * or wchar_t *). Python integers are passed as the platforms default C int type, their value is masked to fit into the C type.

如果你想传递一个整数数组,你应该阅读 arrays .您不必创建一个列表,而是必须使用 ctypes 数据类型创建一个 int 数组并将其传入。

请注意,您必须从 python 进行转换。您编写什么 C++ 代码并不重要。另一种方法是使用 Python C/API 而不是 ctypes 来只编写 C 代码。


一个简单的例子是:

from ctypes import *
lib = cdll.LoadLibrary('sort_counting.so')

data = [3,4,7,5,10,1]

arr_type = c_int * len(data)
array = arr_type(*data)

result = lib.main(array)

data_sorted = list(result)

关于python - Python 中的 C++ 库 : custom sorting method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30963913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com