Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Haciendo Un Importador

Iniciado por AgeR, 10 de Junio de 2004, 05:22:54 PM

« anterior - próximo »

AgeR

 Veréis, resulta que me estoy haciendo un importador/exportador de un formato propio para modelos 3d y tal.

No tengo ni idea de por qué falla, así que a ver si alguien tiene alguna idea. Pongo el código relevante a continuación.


// La estructura que contiene la información de una cara es la siguiente
struct tCara
{
int IndiceVertices[3];  // Indices a los vertices que hacen este triangulo
int IndiceCoord[3];   // Indices para las coordenadas de textura de este triangulo
};

// Esta es la función en cuestión
bool CModelo3D::Importa(char *szFichero)
{

CObjeto3D *pObjeto = NULL;

// Aquí hay otras operaciones y tal, pero hasta ese momento, no hay problemas

fread(&numObjetos, sizeof(int), 1, fp);
for (i = 0; i < numObjetos; i++)
{
 pObjeto = new CObjeto3D();

 // Añadimos un nuevo nodo CObjeto3D al vector de objetos
 m_pObjeto.push_back(*pObjeto);

 // Leemos el numero de caras del modelo
 fread(&m_pObjeto[i].numCaras, sizeof(int), 1, fp);

 // ESTO ES LO QUE PETA EL ASUNTO
 m_pObjeto[i].m_pCaras = new tCara [m_pObjeto[i].numCaras];
               }
// Más cosas...
}


m_pCaras está definido como : tCara *m_pCaras;

No controlo mucho de las STL, así que intuyo que ahí puede estar el problema.

En fin...

Zaelsius

 m_pObjeto es un vector?

Bueno.. alguna vez he tenido problemas con los vectores de la STL si no he reservado tamaño por defecto. Por probar, yo probaría a hacer un

m_pObjeto.reserve(numObjetos);

justo antes del for. En fin my two cents xD.

BeRSeRKeR

 Supongo que en teoría, m_pObjeto debería ser equivalente a pObjeto, ¿no?. Si es así, prueba a hacer en vez de esto:

// Leemos el numero de caras del modelo
fread(&m_pObjeto[i].numCaras, sizeof(int), 1, fp);

// ESTO ES LO QUE PETA EL ASUNTO
m_pObjeto[i].m_pCaras = new tCara [m_pObjeto[i].numCaras];


esto otro:

// Leemos el numero de caras del modelo
fread(&pObjeto->numCaras, sizeof(int), 1, fp);

// ESTO ES LO QUE PETA EL ASUNTO
pObjeto->m_pCaras = new tCara [pObjeto->numCaras];


A ver si es el índice el que está fallando. Aunque lo cierto es que en ese caso también debería petar en la línea

fread(&m_pObjeto[i].numCaras, sizeof(int), 1, fp);

Saludos.

PD: ah bueno, también asegúrate que numcaras es un número correcto y no algo raro como un número negativo, etc.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

AgeR

Cita de: "ZaelSiuS"m_pObjeto es un vector?
Otra vez yo y los nombres de variables  (nooo)  :

vector m_pObjeto;         // Lista de objetos o frames del modelo
Deberia ser algo asi como vector m_vObjeto;

De ahí que haga m_pObjeto.push_back(*pObjeto);

El numCaras lo lee bien, es el número de caras que tiene que tener ese objeto.
El índice no falla y lo del reserve no ha funcionado. Pues no caigo ahora en lo que puedo estar haciendo mal  :(

shephiroth

 Muy buenas. Yo la verdad no veo mucho problema, en principio todo lo veo correcto. Simplemente comentar que el problema que hay aqui puede darlo el compilador que se este utilizando. Por experiencia se que el visual studio .net (yo uso el 2002) me ha tragado con muchas cosas, que al meterlo en un visual c++ 6.0 no ha tragado y tenido que arreglar a mano. Por esta razón intentaría evitar algunas......rarezas que aunque el compilador suele tragar, cada uno lleva a su manera y puede dar problemas algunas veces.

Weno, despues del rollo, mirando esta linea:
fread(&m_pObjeto.numCaras, sizeof(int), 1, fp);

he observado que puede ocurrir algo. Yo probaría cambiandola por:
fread(&(m_pObjeto.numCaras), sizeof(int), 1, fp);

No obstante, que alguien mas experimentado mire, porque fijo que no es eso  (nooo)  (nooo)

AgeR

 Vale, he solucionado el problema.
Parece ser que rellenando el pObjeto antes de hacer el push_back() se soluciona el problema. Supongo que será porque el objeto no tiene un tamaño fijo y no se puede fijar el tamaño de las variables del objeto una vez hecho el push_back().

Puede ser por esto? Si es esto, hay algún modo de poder hacerlo? (Sólo por curiosidad).

Muchas gracias a todos!  ;)  






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.