参照によって行列を関数に渡そうとしています。この関数はA[i][j]
、行列のすべての要素を に置き換え-A[i][j]
ます。最初にマトリックスを作成します。
float a[3][4] =
{
{1.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 1.0f, 0.0f, 0.0f},
{1.0f, 1.0f, 0.0f, 0.0f},
};
次に、このマトリックスへのポインターを取得します。
float*** pa = &a;
次に、次の機能を紹介します。
void process(float ***matrix, int nRows, int nCols){
short i;
short j;
for (i=0 ; i<nRows; i++){
for (j=0 ; j<nCols ; j++){
(*matrix)[i][j] *= -1;
}
}
}
私は次のように呼んでいます:
process(pa,3,4);
私のプログラムは実行に失敗し、以下を返します:
Segmentation fault: 11
何か案は?
回答の要約:この質問に寄せられた質問に基づくメモ:
I. 前述の関数を使用できますa
が、 がfloat**
. 特に:
int numberOfRows = 3;
int numberOfColumns = 4;
float **a = (float **) malloc(sizeof (float *) * numberOfRows);
for (i = 0; i < numberOfRows; ++i) {
a[i] = (float *) malloc(sizeof (float) * numberOfColumns);
}
そして、それはprocess
として関数に渡されprocess(&a, 3,4);
ます。
Ⅱ.別の方法として、次の関数を使用することもできます。
void multi_by_minus(float *matrix, int nRows, int nCols) {
short i,j;
for (i = 0; i < nRows; i++) {
for (j = 0; j < nCols; j++) {
matrix[i * nCols + j] *= -1;
}
}
}
これは、行列を 1 次元配列として扱います。その場合、単純に次のように呼び出します。multi_by_minus(&a, 3, 4);
III. 最後に、次のメソッドを使用できます。
void process2(int nRows, int nCols, float (*matrix)[nCols]) {
short i, j;
for (i = 0; i < nRows; i++) {
for (j = 0; j < nCols; j++) {
matrix[i][j] *= -1;
}
}
}
へのポインタを提供します。a
つまり、 のように呼び出しprocess2(3,4,&a);
ます。このようにして、2D の行列の要素へのアクセスを取得します。