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~
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
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
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í:
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~
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 unnew Texture [7];
y tu(char*) malloc (49152*7);
por unnew char [49152*7];
. Finalmente se cambiarían los frees por deletesdelete [] 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!
Dennis Ritchie. Padre de C y cocreador de UNIX.
R.I.P.
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 ^^