从c函数返回2D数组

时间:2014-03-20 15:58:51

标签: c arrays pointers

我是一个python程序员编写一些c(用ctypes包装)来加速一些紧密的循环。我在使用带有二维数组(*double)[2]的函数时遇到问题,对它做了一些事情并将其返回。函数类似于以下内容:

double *process(int n, double (*results)[2], ...) {
    // Do some things to results
    return results;
}

这里,n是第一级结果中的元素数。这不会编译,显然我是从不兼容的指针类型返回的。使return *results允许它编译和运行(所有包含的逻辑都没问题),但返回时是段错误。将函数设为double **并返回任意数量的* s并不能让我编译。

显然我在这里是个白痴,这并不令人惊讶,因为我不太了解c指针。我需要做些什么来完成这项工作?我有另一个函数返回double *工作正常,所以它显然与2D数组有关。

5 个答案:

答案 0 :(得分:3)

如果您只是想换新results,您甚至不需要退货。数组是通过地址传递的,而不是值。

void process(int n, double results[][2], ...) {
    // Do some things to results,
    results[n][0] = 1.0l;
    // And no need to return.
}
int main(){
    double array[2][2] = { .0 };
    printf( "Before process: %lf", array[1][0] );
    process( 1, array );
    printf( "After process: %lf", array[1][0] );
}

应输出:

Before process: 0.0000000000
After process: 1.0000000000

答案 1 :(得分:0)

返回您需要使用的2D数组

double **

要在功能处理()中将2D数组作为参数,您可以使用

double *results[2]

double results[2][]

答案 2 :(得分:0)

您的函数的返回值只需要1D array作为返回值。要使其适用于2D数组,请将其设为double **

当您返回时,仅返回results。不要在其前面加*

答案 3 :(得分:0)

我想你想要这个:

double ** process(int n, double ** results)
{
    /* Do stuffz */
    return results;
}

答案 4 :(得分:0)

您可能希望返回指向二维数组的指针。在这种情况下,您必须使用:

double (*process (int n, double results[][2], ...))[2] {
  return results;
}

这基本上意味着“返回指向两个2个元素的指针”

或者,为了使它更具可读性:

typedef double arrayType[2];

arrayType * process(int n, double results[][2]) {
    return results;
}