2013-03-23 2 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) –

ответ

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

Отлично! Я взял версию шаблона, и он отлично работает. Большое спасибо! – altralaser

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); 
}*/ 
Смежные вопросы