2010-06-30 6 views
0

J'ai des problèmes de comptage des éléments du tableau après le passage dans un arguementne peut pas compter les éléments du tableau après avoir passé comme argument

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.............. 

} 

Dans la ligne suivante au-dessus

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

Je suis en train de compter le nombre d'éléments dans le tableau varices vertices. Mais je ne reçois pas un compte précis, sinon un du tout.

Lorsque j'ai fait un pas à travers, je remarque que je ne suis pas capable de voir toutes les valeurs dans le tableau, seulement la première valeur du tableau. Donc, je ne suis pas sûr si je passe correctement le tableau comme un argument. Dans une autre application, j'ai fait la même chose et j'ai pu voir toutes les valeurs dans l'étape. Je passe le tableau comme ça.

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); 

Donc, en résumé, Suis-je passer le tableau à droite comme arguement, ce que je fais mal où je ne peux pas obtenir le nombre d'élément correct du tableau.

+0

Vous devez décider dans quelle langue vous travaillez afin que les gens puissent répondre correctement à la question. C n'est pas C++ ni vice versa. –

+0

il semble plus C++, puisque stuff XYZ :: ABC – ShinTakezou

Répondre

3

Oui, vous passez correctement le tableau; Cependant, en C (et C++), les tableaux ne contiennent pas leur taille. Vous devez donc passer la taille du tableau en tant que paramètre séparé. Les tableaux se désintègrent en pointeurs lorsqu'ils sont passés en paramètre dans une fonction, donc sizeof(vertices) vous donnera la taille du type de pointeur, pas la taille du tableau. Vous pouvez cependant parcourir le tableau, soit avec l'arithmétique du pointeur, soit avec l'indexation - mais vous devez connaître sa taille exacte, sinon vous pouvez sortir des limites.

C'est l'une des principales raisons pour lesquelles, en C++ std::vector, il est recommandé d'utiliser à la place des tableaux bruts.

1

Vous passez correctement la matrice. Les paramètres de tableau ne se souviennent tout simplement pas de leurs longueurs. Au lieu de cela, ils sont passés comme s'ils étaient de simples pointeurs, donc votre expression sizeof obtient la taille d'un pointeur, pas la taille de l'ensemble du tableau vers lequel pointe le pointeur.

Si la fonction a besoin de connaître la longueur des tableaux, vous devez passer les longueurs comme paramètres supplémentaires.

+0

Ce n'est pas "comme si" ils étaient de simples pointeurs, ce sont * les * pointeurs qui sont passés. Les paramètres de fonction déclarés en tant que tableaux sont ajustés aux pointeurs. –

+1

Probablement, il ne voulait pas dire "ils sont passés comme s'ils étaient de simples indicateurs, mais ils ne le sont pas". Probablement, il voulait dire "ils sont passés comme s'ils étaient de simples indicateurs, et en fait, ils sont" – ShinTakezou

1

Les tableaux (que vous transmettez) ne transmettent pas la taille (longueur) sauf si vous spécifiez explicitement la longueur du tableau dans la déclaration de fonction. La manière typique de résoudre ceci en C est de passer la longueur du tableau dans la fonction ainsi que dans le tableau.

En C++, mieux vaut utiliser un std::vector et le faire circuler. Il connaît déjà sa propre taille et le problème disparaît complètement.

+0

Pas vrai. Les paramètres de fonction déclarés en tant que tableaux sont ajustés aux pointeurs _si une taille de tableau est spécifiée explicitement ou non. –

+0

Je pense qu'il voulait dire d'ajouter un argument pour spécifier la longueur du tableau – ShinTakezou

1

L'opération sizeof(vertices) que vous effectuez n'est pas une opération d'exécution, elle est en fait résolue par le compilateur. Donc, tant que la déclaration du tableau est dans la portée, vous obtiendrez un résultat correct.

Ce n'est pas le cas dans une fonction, car vous pourriez passer des tableaux à partir de plusieurs autres points du code, d'où le résultat incorrect. (Et d'où la confusion pour le débogueur aussi bien).

1

Les tableaux se désintègrent en pointeurs lorsque vous les passez comme ça. Quel genre de sens avez-vous pensé que UINT indices[] = NULL fait?

Vous pouvez passer la longueur avec le tableau, comme vous le feriez en C, ou vous pouvez utiliser une construction plus intelligente comme un vecteur ou boost :: array.

0

L'opérateur C sizeof est évalué au moment de la compilation et non au moment de l'exécution. Comme écrit, le compilateur n'a pas assez d'informations pour déterminer la taille du tableau.

Au lieu de cela, changez votre prototype de fonction. Passez un pointeur sur le tableau ainsi que la longueur du tableau.

+0

Ce n'est plus strictement vrai. Les tableaux de la pile peuvent être déclarés avec un paramètre d'exécution comme taille, donc sizeof() dans ce cas est calculé au moment de l'exécution. –

Questions connexes