【问题标题】:Pointer for arrays in C++C++中数组的指针
【发布时间】:2013-03-12 23:47:32
【问题描述】:

我在 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)'

提前致谢!

【问题讨论】:

标签: c++ arrays pointers methods


【解决方案1】:
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);
}

【讨论】:

  • 太棒了!我拿了模板版本,它工作正常。非常感谢!
【解决方案2】:

如果您希望在不使用模板的情况下传递数组,您可以执行以下操作:

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

【讨论】:

    【解决方案3】:

    你可以使用指针指向指针...

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

    【讨论】:

      【解决方案4】:

      如果你只想处理方形数组,那么你可以使用模板:

      template <int N>
      calculate(float param[N][N]) {
      // code
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 2010-10-25
        • 1970-01-01
        • 2018-01-04
        相关资源
        最近更新 更多