0

引数として配列を受け取る正しい関数を作成するにはどうすればよいですか? 以下のコードでは、結果は 36 になるはずですが、私の関数では 4 しか表示されません。最初の要素のみを渡すようです。

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;
}
4

2 に答える 2

7

配列を引数として渡すと、最初の要素へのポインターとして減衰します。
sizeof配列ではなくポインタのサイズを示します。

最も簡単な解決策は、サイズを別の引数として関数に渡すことです。

void myFunction(float[] array, size_t size);
于 2013-03-09T06:41:42.990 に答える
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);
}    

それが質問に対する文字通りの答えでした。次のような明確なコピー、割り当て、および参照のセマンティクスを持つ型を使用しますstd::array

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);
}  
于 2013-03-09T08:41:17.457 に答える