3

参照によって行列を関数に渡そうとしています。この関数は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 の行列の要素へのアクセスを取得します。

4

4 に答える 4

9

すでにメモリを提供しているため、トリプルポインターは必要ありません。関数内でメモリを割り当てる場合は、それを使用します。

少なくとも 1 次元のサイズを指定しないと、2 次元の行列にインデックスを付けることはできません。その理由は、両方の次元を考慮して正しいオフセットにアクセスするコードをコンパイラが生成する必要があるためです。この特定のケースでは、単純なポインターを渡し、次のように 1D 配列としてインデックス付けすることをお勧めします。

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 * nCols + j] *= -1;
   }
 }
}

次に、次のように呼び出すことができます。

process((float*)a,3,4);

このようにして、手動でバッファーにインデックスを付けます。

于 2013-01-22T01:31:02.447 に答える
3

関数の署名を次のように変更する必要があります。

void process(float (*matrix)[3][4], int nRows, int nCols){

関数を呼び出すときは、これを使用します。

process(&a, 3, 4);
于 2013-01-22T01:39:09.510 に答える
1

nColsパラメータをパラメータの前に置くとmatrix、2 次元行列を渡して、追加の*演算子やインデックス演算なしで自然な方法で使用できます。

void process(int nRows, int nCols, float (*matrix)[nCols])
{
    for (short i = 0 ; i < nRows; i++)
    {
        for (short j = 0; j < nCols; j++)
        {
            matrix[i][j] *= -1;
        }
     }
}

次に、次processのように呼び出します。

process(3, 4, matrix);

ちなみに:

  • iとを作成する特別な理由がない限りj short、それらを宣言する必要がありますintintは、ターゲット プラットフォームでの整数の「自然な」サイズと定義されています。
于 2013-01-22T01:57:22.563 に答える