2014-12-04 2 views
1

필자의 논문을위한 코드를 개발하려고하는데, 2D 배열을 함수에 전달하는 방법을 배우려고했다. 나는 썼다. 코드는 아래에 있으며이 양식에서는 작동하지 않습니다. 이 오류가 있습니다 :함수에 전달되는 C++ 2d 배열

 
error: cannot convert ‘float (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]’ to ‘float (*)[2]’ for argument ‘3’ to ‘void func(int, int, float (*)[2], float)’ 
    func(m, n, a, omega); 

이 행렬 선언을 변경하면 float a [m] [n]; 떠 다니는 [2] [2] 작동 중입니다. 미리 감사드립니다.

void func(int m1, int n1, float a1[2][2], float omeg); 

using namespace std; 

int main(){ 

    int m = 2; 
    int n = 2; 
    int i, j; 
    float a[m][n]; 
    float x,y,z,omega, c; 
    x=0.1; 
    y=0.2; 
    z=0.3; 
    c = 0; 
    omega = (x*y*z)/x; 

    for(j = 0; j < n; j++) 
    { 
     for(i = 0; i < m; i++) 
     { 
     a[i][j] = 0.0; 
     } 
    } 
    func(m, n, a, omega); 

    cout << a[1][0] << endl; 

return 0; 
} 

void func(int m1, int n1, float a1[][2], float omeg) 
{ 
    for(int j = 0; j < n1; j++) 
     { 
      for(int i = 0; i < m1; i++) 
      { 
      a1[i][j] = omeg * 5; 
      } 
     } 

} 
+1

사용'const'을 m' 및'n''을 위해, 다른 사람이 아닌 표준 확장 가변 길이 배열 (VLA)를 사용합니다. – Jarod42

+0

배열 대신 vector (www.cplusplus.com/reference/vector/vector/)를 사용하지 않는 이유는 무엇입니까? – geoalgo

+0

나는 포인터와 매개 변수 전달에 대한 지식이없는 C++를 사용하려고한다. 코드를 작성하기 전에 이들을 배워야합니다. –

답변

0

mn에 대한 사용 const는 다른 사람이 아닌 표준 확장 가변 길이 배열 (VLA)를 사용합니다.

더 직관적 인 std::array을 사용하는 것이 좋습니다 (크기가 동적 인 경우 std::vector). 내 이해하는

0

, 선언

float a[m][n] 

수 없습니다. 이런 식으로 변수 또는 상수 배열 크기를 지정하는 것은 불가능합니다.

float a[2][2] 

같은 선언은 크기가 2 인 경우, 실제로 2 읽기 멋진이지만 선언

float (*a)[2] 

사용되는 것처럼 내부적으로는 동일하다. C 배열의 경우 배열 정의 후 크기를 알 수 없으며 최소한 매개 변수로 고정 된 크기의 배열을 선언하는 것은 불가능합니다. 적어도 원하는 효과는 없습니다.

+0

그건 맞지 않아 -'float a [2] [2]'는 매개 변수 유형으로'float ** a'가 아니라'float (* a) [2]'와 같습니다. 이 때문에 첫 번째 크기 크기 인'float a [] [2]'만 생략 할 수 있습니다. –

+0

나는 틀렸고 나의 대답을 바로 잡았다. 결과는 정확히 무엇입니까? 내 이해를 위해, 이것은 여전히 ​​경계 검사를 시행하거나 원하지 않는 사용을 막을 수있는 다른 정보를 제공하지 않습니다. 맞습니까? – Codor

0

이 시도 : -

int main(){ 

    int i, j; 
    float a[2][2]; 
    float x,y,z,omega, c; 
    x=0.1; 
    y=0.2; 
    z=0.3; 
    c = 0; 
    omega = (x*y*z)/x; 

    for(j = 0; j < 2; j++) 
    { 
     for(i = 0; i < 2; i++) 
     { 
      a[i][j] = 0.0; 
     } 
    } 
    func(a, omega); 

    cout << a[1][0] << endl; 

    return 0; 
    } 

    void func(float a1[2][2], float omeg) 
    { 
    for(int j = 0; j < 2; j++) 
    { 
     for(int i = 0; i < 2; i++) 
     { 
     a1[i][j] = omeg * 5; 
     } 
    } 
    }