2013-03-23 160 views
2

我在C++中使用指针时遇到了一些问题。 我使用不同大小的数组实现了三种方法,但计算结果相同。所以我决定提取计算并将它们放入一个期望数组的新方法中。 但这不起作用,我不知道如何修改我的程序。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)' 

提前感谢!

+2

[数组是不是指针](http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c) – 2013-03-23 00:35:23

回答

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

太棒了!我采取了模板版本,它工作正常。非常感谢! – altralaser 2013-03-23 02:12:23

0

如果你只想处理方阵,那么你可以使用模板:如果您希望通过阵列,而不使用模板

template <int N> 
calculate(float param[N][N]) { 
// code 
} 
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

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