2013-03-09 6 views
0

배열을 인수로받는 함수를 올바르게 작성하려면 어떻게해야합니까? 아래의 코드에서 결과는 36이어야하지만 내 기능에서는 4 번만 보여야합니다. 첫 번째 요소 만 전달하는 것처럼 보입니다.C++ 배열 및 함수

void test(float v[]){ 
    printf("size: %d\n", sizeof(v)); //RESULT: 4 
} 

int main(){ 
    GLfloat vv[] = { 
     0, 0, 0, 
     1, 1, 0, 
     1, 0, 0 
    }; 
    printf("size: %d\n", sizeof(vv)); //RESULT: 36 
    test(vv); 
    return 0; 
} 

답변

3

는 어떻게 인수로 배열을받는 올바른 기능을합니까?

예에서와 같이 배열의 크기가 컴파일시 알려진 크기 인 경우 템플릿 함수를 사용할 수 있습니다. 이 예제에서는 배열 참조를 const 참조로 취합니다.

template< class T, size_t N > 
void foo(const T (&data)[N]) 
{ 
    // length of array is N, can access elements as data[i] 
} 

int main(){ 
    GLfloat vv[] = { 
    0, 0, 0, 
    1, 1, 0, 
    1, 0, 0 
    }; 

    foo(vv); 
}  

이 질문에 대한 답은 리터럴입니다. 당신이 고정 배열을 사용하기 위해 최선을 다하고 있습니다 경우 C++에, 당신은 참조 매개 변수를 사용할 수 있습니다

template <size_t N> 
void foo(const std::array<GLfloat, N>& data) 
{ 
    // data looks like a C array, but has size() and many other methods 
} 

int main(){ 
    std::array<GLfloat, 9>{ 
     { 0, 0, 0, 
     1, 1, 0, 
     1, 0, 0 } 
    }; 

    foo(vv); 
} 
7

array를 인수로 전달하면 첫 번째 요소에 대한 포인터로 감소합니다.
sizeof은 배열이 아닌 포인터의 크기를 제공합니다.

가장 간단한 솔루션은 크기를 함수에 대한 별도 인수로 전달하는 것입니다.

void myFunction(float[] array, size_t size); 
+2

1 주 : 나는 분명 사본이 형식을 사용하여 지정하고 같은 std::array 등 참조 시멘틱스, 어떻게 할 것인지 'sizeof (ar)'와 함께 올바른 크기를보고하는'template foo (float (& ar) [N])'과 같이. – WhozCraig

+0

@WhozCraig : +1. 내 질문에 C와 C++ 태그를 모두 들었을 때 나는 의심스러워했다. –

+0

일반화 된 솔루션을 작성한다는 관점에서 보면 대부분의 경우 iterator를 'begin'과 'end'에 전달하는 것이 더 좋지 않을까요? 그런 다음 함수를 배열에 적용하거나 "std :: vector"와 똑같이 적용 할 수 있습니다. – DavidO