2010-06-30 2 views
0

У меня возникают проблемы подсчета элементов массива после прохождения его в arguementне может рассчитывать элементы массива после прохождения в качестве аргумента

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

Таким образом, в двух словах, Могу ли я передача массива прямо как arguement, что я делаю неправильно, где я не могу получить правильное количество элементов массива.

+0

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

+0

кажется более C++, так как 'XYZ :: ABC' stuff – ShinTakezou

ответ

3

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

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

1

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

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

+0

Это не« как если бы », они были просто указателями, это * указатели *, которые передаются. Параметры функции, объявленные как массивы, настраиваются на указатели. –

+1

Вероятно, он имел в виду не «они переданы, как если бы они были простыми указателями, но это не так». Вероятно, он имел в виду «они прошли, как если бы они были простыми указателями, а на самом деле они». – ShinTakezou

1

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

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

+0

Неправда. Функциональные параметры, объявленные как массивы, настраиваются на указатели: независимо от того, указан ли размер массива явно. –

+0

Я думаю, он хотел сказать, чтобы добавить аргумент, чтобы указать длину массива. – ShinTakezou

1

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

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

1

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

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

0

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

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

+0

Это уже не так. Массивы в стеке могут быть объявлены с параметром run-time в качестве размера, поэтому sizeof() в этом случае вычисляется во время выполнения. –

Смежные вопросы