2

C++でポインタを使用するのにいくつか問題があります。サイズの異なる配列で3つのメソッドを実装しましたが、計算は同じです。そこで、計算を抽出して、配列を期待する新しいメソッドに配置することにしました。しかし、それは機能せず、プログラムを変更する方法がわかりません。

void method1() {
  float a[3][3];
  calculate(a, 3);
}

void method2() {
  float a[4][4];
  calculate(a, 4);
}

void method3() {
  float a[5][5];
  calculate(a, 5);
}

void calculate(float *param[], int n) {
  // Code
}

グローバル変数やベクトルなどを使用できることは知っていますが、この構造のロジックが必要です。

コンパイラエラーは次のとおりです。

Test.cpp: In function 'void method1()':
Test.cpp:7:16: error: cannot convert 'float (*)[3]' to 'float**' for argument '1' to 'void calculate(float**, int)'
Test.cpp: In function 'void method2()':
Test.cpp:12:16: error: cannot convert 'float (*)[4]' to 'float**' for argument '1' to 'void calculate(float**, int)'
Test.cpp: In function 'void method3()':
Test.cpp:17:16: error: cannot convert 'float (*)[5]' to 'float**' for argument '1' to 'void calculate(float**, int)'

前もって感謝します!

4

4 に答える 4

5
template <int n>
void calculate(float (&param)[n][n]) {
  std::cout << param[x][y];
}

void method1() {
  float a[3][3];
  calculate(a);
}

または、動的サイズをサポートしたい場合(ありそうもない)、奇妙なトリックを実行し、それが1d配列であると偽ってコンパイラーに嘘をつく必要があり、それはトリッキーになります。

int index(int x, int y, int n) {return y*n+x;}

void calculate(float* param, int n) {
    std::cout << param[index(x, y, n)];
}

void method1() {
  float a[3][3];
  calculate(a[0], 3);
}
于 2013-03-23T00:38:31.603 に答える
1

あなたはポインタへのポインタを使うことができます...

void calculate(float *param[], int n)
{
    // Code
}

void method1() {

    float **a = new float*[3];

    a[0] = new float[3];
    a[1] = new float[3];
    a[2] = new float[3];

    a[0][0] = 1.0f;
    a[0][1] = 2.0f;
    a[0][2] = 3.0f;

    a[1][0] = 4.0f;
    a[1][1] = 5.0f;
    a[1][2] = 6.0f;

    a[2][0] = 7.0f;
    a[2][1] = 8.0f;
    a[2][2] = 9.0f;

    calculate(a, 3);
}


void method2() {
    float **a = new float*[4];

    a[0] = new float[4];
    a[1] = new float[4];
    a[2] = new float[4];
    a[3] = new float[4];

    calculate(a, 4);
}

void method3() {
    float **a = new float*[5];

    a[0] = new float[5];
    a[1] = new float[5];
    a[2] = new float[5];
    a[3] = new float[5];
    a[4] = new float[5];

    calculate(a, 5);
}

それ以外の場合は、関数のシグネチャで配列の列サイズを指定する必要があります。

void calculate(float param[][3], int n) {
  // Code
}

void method1() {
  float a[3][3];
  calculate(a, 3);
}
/*
void method2() {
  float a[4][4];
  calculate(a, 4);
}

void method3() {
  float a[5][5];
  calculate(a, 5);
}*/
于 2013-03-23T03:43:05.743 に答える
1

テンプレートを使用せずに配列を渡したい場合は、次のようにします。

static const int size = 3;

void calculate(float (&param)[size][size]) {
}

int main() {
  float  a[size][size];

  calculate(a);
  return 0;
}

sizeにすることもできますが#define、私は好きstatic constです。

于 2013-03-23T00:53:09.890 に答える
0

正方形の配列のみを処理する場合は、テンプレートを使用できます。

template <int N>
calculate(float param[N][N]) {
// code
}
于 2013-03-23T00:41:38.473 に答える