Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ctypes从C函数向Python返回C数组_Python_C_Ctypes - Fatal编程技术网

使用ctypes从C函数向Python返回C数组

使用ctypes从C函数向Python返回C数组,python,c,ctypes,Python,C,Ctypes,我目前正试图通过编写一个C函数来减少Python程序的运行时间,以便在一个非常大的数组上完成繁重的工作。目前,我正在使用这个简单的函数 int * addOne(int array[4]) { int i; for(i = 0; i < 5; i++) { array[i] = array[i] + 1; } return array; } 如何从返回的指针创建Python列表?返回的指针实际上与传递的指针相同。也就是说,实际上不需

我目前正试图通过编写一个C函数来减少Python程序的运行时间,以便在一个非常大的数组上完成繁重的工作。目前,我正在使用这个简单的函数

int * addOne(int array[4])
{
    int i;
    for(i = 0; i < 5; i++)
    {
        array[i] = array[i] + 1;
    }
    return array;
}

如何从返回的指针创建Python列表?

返回的指针实际上与传递的指针相同。也就是说,实际上不需要返回数组指针

当您将一个指向支持列表的内存区域的指针从Python传递到C时,C函数可以更改该内存。您可以返回一个整数状态代码来标记一切是否按预期进行,而不是返回指针

int addOne(int array[4])
{
    int i;
    for(i = 0; i < 5; i++)
    {
        array[i] = array[i] + 1; //This modifies the underlying memory
    }
    return 0; //Return 0 for OK, 1 for problem.
}

对于这个问题已经有了一个很好的答案,但这里有一个替代选项:如果您想快速处理大型数值数据数组,而不是编写自己的c扩展,您可以使用。这正是numpy的用途,它的速度非常快。这能回答你的问题吗?非常感谢!现在对我有用了。还有一件事。。。如何构造2d ctypes数组?干杯,尼克
int addOne(int array[4])
{
    int i;
    for(i = 0; i < 5; i++)
    {
        array[i] = array[i] + 1; //This modifies the underlying memory
    }
    return 0; //Return 0 for OK, 1 for problem.
}
from ctypes import *
libCalc = CDLL("libcalci.so")
pyarr = [65, 66, 67, 68]                   #Create List with underlying memory
arr = (ctypes.c_int * len(pyarr))(*pyarr)  #Create ctypes pointer to underlying memory
res = libCalc.addOne(arr)                  #Hands over pointer to underlying memory

if res==0:
    print(', '.join(arr))                  #Output array