Anuncios Google

¿Unir buffers?

Hola, estoy teniendo un problema y es que, tengo varios buffers (datos de imagen, pixeles), 7 para ser exactos, y ahora quiero unir esos 7 buffers en uno solo, para ello he estado usando la función memcpy();

 

// Carga los trozos de textura
    Texture *texs = NULL;
    texs = (Texture*) calloc (7, sizeof(Texture));
    texs[0].Load(skin, 0); texs[1].Load(eyes, 0); texs[2].Load(mouth, 0);                    texs[3].Load(hair, 0);
    texs[4].Load(jacket, 0); texs[5].Load(trousers, 0); texs[6].Load(shoes, 0);
 
    // Copia las texturas al buffer principal (AQUI EMPIEZA A DAR PROBLEMAS)
    memcpy((void*)(*Models[0].mtls[0].Tex.frames[0].data + 0), (void*)texs[0].frames[0].data, 49152);
    memcpy((void*)(*Models[0].mtls[0].Tex.frames[0].data + 49152), (void*)texs[1].frames[0].data, 49152);  // 49152 es el tamaño en bytes de cada buffer
    memcpy((void*)(*Models[0].mtls[0].Tex.frames[0].data + 98304), (void*)texs[2].frames[0].data, 49152);
    memcpy((void*)(*Models[0].mtls[0].Tex.frames[0].data + 147456), (void*)texs[3].frames[0].data, 49152);
    memcpy((void*)(*Models[0].mtls[0].Tex.frames[0].data + 196608), (void*)texs[4].frames[0].data, 49152);
    memcpy((void*)(*Models[0].mtls[0].Tex.frames[0].data + 245760), (void*)texs[5].frames[0].data, 49152);
    memcpy((void*)(*Models[0].mtls[0].Tex.frames[0].data + 294912), (void*)texs[6].frames[0].data, 49152); // AQUI TERMINAN LOS PROBLEMAS
 
    // Elimina las texturas temporales
    for(int i=0;i<7;i++) texs[i].Unload(1);
    free(texs); texs = NULL;
 

EL problema que da es "fallo de segmentación", vamos que me estoy pasando del límite del buffer, pero el tamaño de los 7 buffers son de 336KB, lo mismo que el buffer donde lo paso todo...

 

¿Qué estoy haciendo mal en los "mempy"?

 

Gracias de antemano.

 


~Actualmente estudiando Ingeniería de las Tecnologías de la Telecomunicación en la Escuela de Ingenieros~


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de joserc87

Debug.

Para empezar, te diría que te cojas el debugger y mires en qué punto da el fallo de segmentación. Te puedes llevar una sorpresa, pues posiblemente casque en el primer memcpy. Si no quieres usar el debugger, al menos pon printfs entre los memcpy y  mira en cual falla.

La verdad es que es dificil saber donde esta el error sin saber más sobre tu programa, pero así a bote pronto... en el memcpy, el * delante de Models, para qué sirve? Es posible que le estes enviando el valor en lugar de la dirección? Por cierto, en lugar de poner 98304, 147456, etc, usa expresiones como 49152*2 49152*3, etc. Es igual de eficiente (ya que el valor se calcula en tiempo de compilación) y es más facil de leer. O mejor aún, usa defines como #define LONG_BUF 48*1024 y luego lo usas LONG_BUF*2, etc.

Saludos


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Andresmargar

El fallo de segmentación lo

El fallo de segmentación lo da en el primer memcpy, el * delante de Models es para que empiece la función a copiar memoria desde esa posición más lo que yo le de (49152, 98304), en verdad los puse primero así (con la calculadora) para que no se calculara el tiempo de ejecución eso (no sabía que eso se hacía en la compilación). Bueno, retocándolo un poco me ha quedado una cosa así:

 

// Carga los trozos de textura
    Texture *texs = NULL;
    texs = (Texture*) calloc (7, sizeof(Texture));
    texs[0].Load(skin, 0); texs[1].Load(eyes, 0); texs[2].Load(mouth, 0); texs[3].Load(hair, 0);
    texs[4].Load(jacket, 0); texs[5].Load(trousers, 0); texs[6].Load(shoes, 0);
 
    // Crea el buffer
    char *buffer = NULL;
    buffer = (char*) malloc (49152*7);  // Tamaño del buffer
 
    // Copia las texturas al buffer principal
    memcpy(&buffer[0], texs[6].frames[0].data, 49152);
    memcpy(&buffer[49152], texs[5].frames[0].data, 49152);
    memcpy(&buffer[98304], texs[4].frames[0].data, 49152);
    memcpy(&buffer[147456], texs[3].frames[0].data, 49152);
    memcpy(&buffer[196608], texs[2].frames[0].data, 49152);
    memcpy(&buffer[245760], texs[1].frames[0].data, 49152);
    memcpy(&buffer[294912], texs[0].frames[0].data, 49152);
 
    // Elimina las texturas temporales
    for(int i=0;i<7;i++) texs[i].Unload(1);
    free(texs); texs = NULL;

 

Lo que fallaba era el * delante del memcpy, le pasé la dirección inicial en el primer elemento con &, y ya va perfecto.

 

Saludos!


~Actualmente estudiando Ingeniería de las Tecnologías de la Telecomunicación en la Escuela de Ingenieros~

Imagen de joserc87

Genial

Ya decía yo que ese * sobraba ;)

Ahora te ha quedado mucho más claro el código.

PD: Si usas C++, generalmente es más apropiado usar New en lugar de malloc, simplemente porque es más sencillo de utilizar. Tu (Texture*) calloc (7, sizeof(Texture)); lo puedes cambiar por un new Texture [7]; y tu  (char*) malloc (49152*7); por un new char [49152*7];. Finalmente se cambiarían los frees por deletes delete [] array; . Así no te tienes que "complicar" la vida con sizeofs ni castings. Repito, solo para C++, no sirve en C, pero si usas programación orientada a objetos, por defecto se suele usar new/delete en lugar de malloc/free. Ya como tú veas.

Saludos!


Be pointer my friend...

Dennis Ritchie. Padre de C y cocreador de UNIX.

R.I.P.

 

Imagen de Andresmargar

Es que siempre lo he estado

Es que siempre lo he estado haciendo con malloc() y free(), ya que vale para ambos lenguajes xD

 

Gracias ^^

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.