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関数で行列が列または行のメジャー形式である必要があることです。この場合、すべての列/行が単一の1次元配列に連続して格納されます。たとえば、サイズmxnの行の主行列の場合、任意の行の要素は連続して格納され、行iと列jの項目は位置i * n + jになります(ゼロベースのインデックスiおよびjの場合)。行列が列メジャーの場合、i + j*mの位置になります。

C / C ++で多次元配列を使用することは、多くの場合、次のようなものであるため、希望するものではありません。

double A[100][100];

は2次元配列ではなく、長さ100の配列へのポインタを含む長さ100の単一配列です。したがって、の行はA連続して格納されません。

于 2012-04-25T05:45:28.780 に答える
0

C関数には、そのパラメーターの一部に多次元配列が必要であり、プロトタイプは、配列/行列パラメーターのdoubleへのポインターを使用して記述されていると想定しています。ここで、整数パラメーターは各次元のサイズを示します(行列は四角?)。この場合、次のように各配列/行列の最初の要素へのポインターを渡すことができます。

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

たとえば、のタイプは、に減衰するのではなく、に減衰するため、最初の試行は機能eigenvectorsdouble[100][100]ませdouble (*)[100]double *

この投稿では、ポインターと多次元配列の問題について説明します。

于 2012-04-25T04:53:16.267 に答える