не может считать элементы массива после передачи в качестве аргумента - PullRequest
0 голосов
/ 30 июня 2010

У меня проблемы с подсчетом элементов массива после передачи его в аргумент

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

}

В следующей строке выше

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

Я пытаюсь подсчитать количество элементовмассив переменных вершин.Но я не получаю точного подсчета, если не одного вообще.

Когда я сделал шаг вперед, я заметил, что не могу увидеть все значения в массиве, только первое значениемассив.

Так что я не уверен, правильно ли я передаю массив в качестве аргумента.В другом приложении я сделал то же самое и смог увидеть все значения в шаге до конца.Я передаю массив следующим образом.

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

Итак, в двух словах: правильно ли я передаю массив в качестве аргумента, что я делаю неправильно, если не могу получить правильное количество элементов массива.

Ответы [ 6 ]

3 голосов
/ 30 июня 2010

Да, вы правильно передаете массив;однако в C (и C ++) массивы не содержат их размера.Поэтому вам нужно передать размер массива в качестве отдельного параметра.Массивы распадаются на указатели при передаче в качестве параметра в функцию, поэтому sizeof(vertices) даст вам размер типа указателя, а не размер массива.Вы можете пройти через массив либо с помощью арифметики с указателем, либо с индексированием - но вам нужно знать его точный размер , в противном случае вы можете выйти за пределы.

Это одна из основных причин, почемув C ++ std::vector рекомендуется использовать вместо необработанных массивов.

1 голос
/ 30 июня 2010

Массивы распадаются на указатели, когда вы передаете их таким образом.Какой смысл вы думаете, что UINT indices[] = NULL сделал?

Вы можете передавать длину вокруг массива, как это было бы в C, или вы могли бы использовать более интеллектуальную конструкцию, такую ​​как вектор или повышение::. массив

1 голос
/ 30 июня 2010

Операция sizeof(vertices), которую вы выполняете, не является операцией во время выполнения, она фактически разрешается компилятором.Таким образом, пока объявление массива находится в области видимости, вы получите правильный результат.

Это не так в функции, поскольку вы можете передавать массивы из нескольких других точек в коде, следовательноневерный результат.(И, следовательно, путаница и для отладчика).

1 голос
/ 30 июня 2010

Массивы C (что вы и передаете) не передают размер (длину), если вы явно не укажете длину массива в объявлении функции. Типичный способ решить эту проблему в C - передать длину массива в функцию, а также в массив.

В C ++ гораздо лучше использовать std::vector и передавать его. Он уже знает свой собственный размер, и проблема полностью исчезает.

1 голос
/ 30 июня 2010

Вы правильно передаете массив.Параметры массива просто не запоминают их длины.Вместо этого они передаются как простые указатели, поэтому ваше выражение sizeof получает размер указателя , а не размер всего массива, на который указывает указатель.

Если функция должна знать длины массивов, вам необходимо передать длины в качестве дополнительных параметров.

0 голосов
/ 30 июня 2010

Оператор C sizeof вычисляется во время компиляции, а не во время выполнения.Как написано, у компилятора недостаточно информации для определения размера массива.

Вместо этого измените прототип функции.Передайте указатель на массив, а также длину массива.

...