2

我在 C++ 中使用指针有一些问题。我用不同大小的数组实现了三种方法,但计算相同。所以我决定提取计算并将它们放在一个需要数组的新方法中。但这不起作用,我不知道如何修改我的程序。

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);
}

或者,如果你想支持动态大小(不太可能),你将不得不做一个奇怪的把戏,并向编译器撒谎,假装它是一个一维数组,这很快就会变得棘手。

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 回答