указатели — невозможно скопировать шорты в динамический массив. Переполнение стека

Я пытался загрузить формат 3d-модели в C ++, но у меня возникла проблема с ним. Все идет хорошо, за исключением массива показателей шорт … Когда я пытаюсь загрузить одну модель, первые 2 пробела в массиве некорректны … если я загружаю вторую модель; больше шортов неправильно в данных модели …

Вот мой заголовочный файл:

#ifndef MODELDATA_H
#define MODELDATA_H

#include <GL/glu.h>
#include <string>

using namespace std;class modelData
{
public:
modelData();
virtual ~modelData();

short m_vert_count;
short m_ind_count;
short m_tid;
GLfloat *m_verts;
GLfloat *m_tex;
GLint *m_ind;

void loadModel(string input);
void draw();

protected:
private:
};

#endif // MODELDATA_H

А вот мой файл cpp:

#include "modelData.h"#include <GL/glu.h>
#include <fstream>
#include <string.h>
#include <iostream>

using namespace std;

modelData::modelData()
{
//ctor
m_verts = NULL;
m_tex = NULL;
m_ind = NULL;
m_ind_count = 0;
m_vert_count = 0;
}

modelData::~modelData()
{
//dtor
delete[] m_verts;
delete[] m_tex;
delete[] m_ind;
m_ind_count = 0;
m_vert_count = 0;
}

void modelData::loadModel(string input)
{
short temp;
char *newInput = new char[input.size()+1];
newInput[input.size()]=0;
memcpy(newInput,input.c_str(),input.size());
ifstream a_file( newInput,  ios::binary | ios::in );
delete newInput;

a_file.seekg( 0, ios::beg );
if ( ! a_file.read( reinterpret_cast<char*>( & m_vert_count ), sizeof( short ) ) )
{
cout << "Error reading from file: can't attain vertex buffer size" << endl;
return;
}

if ( ! a_file.read( reinterpret_cast<char*>( & m_ind_count ), sizeof( short ) ) )
{
cout << "Error reading from file: can't attain index buffer size" << endl;
return;
}

m_verts = new GLfloat[m_vert_count];
m_ind = new GLint[m_ind_count];
m_tex = new GLfloat[m_vert_count];

for (int i = 0; i < m_vert_count; i++)
{
if ( ! a_file.read( reinterpret_cast<char*>( & m_verts[i] ), sizeof( float ) ) )
{
cout << "Error reading from file: can't attain vertex buffer" << endl;
return;
}
}

for (int i = 0; i < ((m_vert_count)/3)*2; i++)
{
if ( ! a_file.read( reinterpret_cast<char*>( & m_tex[i] ), sizeof( float ) ) )
{
cout << "Error reading from file: can't attain texcoord buffer" << endl;
return;
}
}
for (int i = 0; i < m_ind_count; i++)
{
if ( ! a_file.read( reinterpret_cast<char*>( & m_ind[i] ), sizeof( short ) ) )
{
cout << "Error reading from file: can't attain index buffer" << endl;
return;
}
}cout << m_vert_count << "   " << m_ind_count << endl;
cout << "Model successfully loaded from " << input << "  ...Jolly good." << endl;

}

void modelData::draw()
{
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,m_verts);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2,GL_FLOAT,0,m_tex);
glDrawElements(GL_TRIANGLES,m_ind_count,GL_UNSIGNED_INT,m_ind);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

}

Надеюсь, код не слишком длинный и не слишком грязный, я просто не знаю, что происходит … насколько я могу судить; m_verts [] и m_tex [] выглядят так, как будто они заполнены нормально, но m_ind [] все время вызывает появление в массиве неправильных чисел … Я неправильно распределяю массив? Разве я не убираю то, что должен?

О, и я не думаю, что это вызывает проблему, но вы заметите, что я ничего не добавил для преобразования больших или малых порядков байтов … это потому, что я использую машину Intel, которая, кажется, всегда предполагает little endian и мой движок для Android использует little endian … так что я не думаю, что это проблема …

Любая помощь или предложения будут великолепны.
Спасибо за прочтение.

0

Решение

Если я могу видеть правильно, m_ind набирается как массив GLintс, но вы читаете в него, как будто это был массив shorts. На большинстве платформ это означает, что верхние два байта значения в значительной степени случайны.

Если ваш поток данных на самом деле содержит шорты, это будет безопасный способ их прочитать:

for (int i = 0; i < m_ind_count; i++)
{
short val;
if ( ! a_file.read( reinterpret_cast<char*>( & val ), sizeof( short ) ) )
{
cout << "Error reading from file: can't attain index buffer" << endl;
return;
}
m_ind[i] = val;
}

Несколько не связанных между собой заметок:

o Это:

char *newInput = new char[input.size()+1];
newInput[input.size()]=0;
memcpy(newInput,input.c_str(),input.size());
ifstream a_file( newInput,  ios::binary | ios::in );
delete newInput;

это просто очень сложный способ сказать это:

ifstream a_file(input.c_str(), ios::binary | ios::in);

o Я настоятельно рекомендую использовать std::vector вместо того, чтобы вручную динамически распределять и освобождать ваши массивы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]