2010-06-30 3 views
0

나는는 인수로 통과 한 후 배열 요소를 셀 수 없다

UINT numVerts = sizeof(vertices)/sizeof(GXVector); 

내가 계산하려고 위의 다음 줄에 아규먼트

void GXDX::LoadMesh(GXVector vertices[], UINT indices[] = NULL) 
{ 
    D3D10_BUFFER_DESC bufferDesc; 

    UINT numVerts = sizeof(vertices)/sizeof(GXVector); 

    bufferDesc.Usage = D3D10_USAGE_DEFAULT; 
    bufferDesc.ByteWidth = sizeof(GXVector) * numVerts; 
    bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; 
    bufferDesc.MiscFlags = 0; 
    bufferDesc.CPUAccessFlags = 0; 

     code.............. 

} 

로를 통과 한 후 배열 요소를 계산하는 데 문제가 있어요 배열의 요소 수 varible vertex 그러나 나는 정확한 카운트를 얻지 못한다.

단계별로 살펴본 결과 배열의 모든 값을 볼 수 없으며 배열의 첫 번째 값만 볼 수 있습니다.

그래서 배열을 올바르게 arguement로 전달하는지 확신 할 수 없습니다. 다른 응용 프로그램에서는 동일한 작업을 수행하여 단계의 모든 값을 볼 수있었습니다. 이런 식으로 배열을 전달합니다.

GXVector vertices[] = {  {D3DXVECTOR3(0.5f, 0.5f, 0.5f)}, 
           {D3DXVECTOR3(0.5f, -0.5f, 0.5f)}, 
           {D3DXVECTOR3(-0.5f, -0.5f, 0.5f)}, 

           {D3DXVECTOR3(-0.5f, -0.5f, 0.5f)}, 
           {D3DXVECTOR3(-0.5f, 0.5f, 0.5f)}, 
           {D3DXVECTOR3(0.5f, 0.5f, 0.5f)}, 
    }; 

    UINT indices[] = {0,1,2,3,4}; 

    GXRenderManager::Device()->LoadMesh(vertices, indices); 

그래서 요컨대, 내가 배열의 올바른 요소 수를 얻을 수있는 내가 잘못 뭐하는 거지, 권리] 아규먼트로 배열을 전달하고있다.

+0

사람들이 질문에 적절하게 대답 할 수 있도록하기 위해 작업중인 언어를 결정해야합니다. C는 C++도 아니고 그 반대도 아닙니다. –

+0

'XYZ :: ABC' 물건이 있기 때문에 더 많은 C++로 보입니다. – ShinTakezou

답변

3

예, 배열을 올바르게 전달하고 있습니다. 그러나 C (및 C++)에서는 배열의 크기가 포함되지 않습니다. 따라서 배열의 크기를 별도의 매개 변수로 전달해야합니다. 배열 효과적으로 함수에 매개 변수로 전달 될 때 포인터에 부패, 그래서 sizeof(vertices) 배열의 크기가 아니라 포인터 형식의 크기를 제공합니다. 포인터 연산이나 인덱싱을 통해 배열을 처리 할 수 ​​있지만 정확한 크기을 알아야합니다. 그렇지 않으면 범위를 벗어날 수 있습니다.

이것은 원시 배열 대신 C++ std::vector을 사용하는 것이 가장 좋은 이유 중 하나입니다.

1

배열을 올바르게 전달하고 있습니다. 배열 매개 변수는 단순히 길이를 기억하지 않습니다. 대신 포인터는 단순한 포인터 인 것처럼 전달되므로 sizeof 표현식이 포인터의 크기가되고 포인터가 가리키는 전체 배열의 크기가 아닙니다.

함수가 배열의 길이를 알아야 할 경우 추가 매개 변수로 길이를 전달해야합니다.

+0

마치 "단순한 포인터"와 같은 것이 아닙니다. 전달되는 포인터입니다. 배열로 선언 된 함수 매개 변수는 포인터로 조정됩니다. –

+1

그는 "그들은 단순한 포인터 인 것처럼 전달되지만, 그렇지 않다"는 의미 일 가능성이 높습니다. 아마 그는 "그들은 단순한 포인터 인 것처럼 넘겨졌고, 사실 그들은 사실"이라고 말했습니다. – ShinTakezou

1

함수 선언에서 배열 길이를 명시 적으로 지정하지 않으면 C 배열 (전달중인 것)이 크기 (길이)를 전달하지 않습니다. C에서 이것을 해결하는 일반적인 방법은 배열뿐만 아니라 배열 길이를 함수에 전달하는 것입니다.

C++에서 훨씬 더 나은 것은 std::vector을 사용하고 주위를 전달하는 것입니다. 그것은 이미 자신의 크기를 알고 있으며 문제는 절박하게 사라집니다.

+0

사실이 아닙니다. 배열로 선언 된 함수 매개 변수는 배열 크기가 명시 적으로 지정되었는지 여부에 관계없이 포인터로 조정됩니다. –

+0

배열 길이를 지정하는 인수를 추가한다고 말한 것 같아요 – ShinTakezou

1

수행중인 작업은 런타임 작업이 아니며 컴파일러에서 실제로 확인합니다. 따라서 배열의 선언이 범위 내에있는 한 올바른 결과를 얻을 수 있습니다.

코드에서 다른 여러 지점의 배열을 전달할 수 있으므로 함수에서 그렇지 않습니다. 따라서 잘못된 결과가 발생합니다. (그리고 따라서 디버거에 대한 혼란도).

1

배열은 포인터를 전달할 때 포인터로 붕괴합니다. UINT indices[] = NULL은 어떤 의미의 감각으로 만들었습니까?

C와 같은 길이로 배열을 전달하거나 벡터 또는 부스트 :: 배열과 같은 지능적인 구조를 사용할 수 있습니다.

0

C sizeof 연산자는 런타임이 아닌 컴파일 타임에 계산됩니다. 작성된 것처럼 컴파일러에는 배열 크기를 결정하는 데 필요한 정보가 충분하지 않습니다.

대신 함수 프로토 타입을 변경하십시오. 배열의 포인터와 배열의 길이를 전달하십시오.

+0

이것은 더 이상 엄격하게 적용되지 않습니다. 스택의 배열은 런타임 매개 변수로 크기로 선언 할 수 있으므로이 경우 sizeof()는 런타임에 계산됩니다. –