0

我编写了一个 C++ 应用程序,在其中,我需要调用一个用 C 编写的数学函数。原型如下所示:

void Jacobi_Cyclic_Method(double *eigenvalues, double *eigenvectors, double *A, int n);

我的问题是我似乎无法传递函数 double * (例如,特征向量和 A 都是多维数组。传递这些东西的 C++ 方式似乎是

double [][size]

我已经阅读了有关 extern C 的信息,但我认为它不适用于这里,因为我不是与对象交互而是与源本身交互。如何发送该 C 函数我的多维数组定义如下:

double [100][100] A;
double [100][100] eigenvectors;
double [100] eigenvalues;

试图编译我得到:

error: no matching function for call to ‘MathEngine::Jacobi_Cyclic_Method(double 
[100], double [100][100], double [100][100], int)’
mathEngine.h:9: note: candidates are: static void    
MathEngine::Jacobi_Cyclic_Method(double*, double*, double*, int)
4

2 回答 2

1

问题可能是您的Jacobi_Cyclic_Method函数要求矩阵采用列或行主要格式,其中每列/行都连续存储在单个一维数组中。例如,对于大小为mxn的行主矩阵,任何给定行中的元素都是连续存储的,并且行i和列j中的项目将位于位置i*n+j(对于从零开始的索引ij)。如果矩阵是列优先的,它将位于i+j*m位置。

在 C/C++ 中使用多维数组通常不是您想要的,因为类似

double A[100][100];

不是二维数组,而是长度为 100 的单个数组,其中包含指向长度为 100 的数组的指针。因此,其中的行A不是连续存储的。

于 2012-04-25T05:45:28.780 回答
0

我假设您的 C 函数的某些参数需要多维数组,并且原型是用指向数组/矩阵参数的双精度数的指针编写的,其中整数参数表示每个维度的大小(我猜矩阵是正方形?)。如果是这种情况,那么您可以将指针传递给每个数组/矩阵的第一个元素,如下所示:

Jacobi_Cyclic_Methods(&eigenvalues[0], &eigenvectors[0][0], &A[0][0], 100);

您最初的尝试不起作用,因为例如 的类型eigenvectorsdouble[100][100]衰减到double (*)[100],而不是double *

这篇文章解决了指针和多维数组的问题。

于 2012-04-25T04:53:16.267 回答