• Lunes 16 de Diciembre de 2024, 01:25

Autor Tema:  Problema De Memoria  (Leído 1414 veces)

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Problema De Memoria
« en: Domingo 4 de Abril de 2004, 22:49 »
0
Saludos a todos.

Bueno en esta ocacion queria pedirles un favor HAGANME LA TAREA! :devil:

No mentiras, realmente es solo un favor .

Resumen:
Algo falla al asignar memoria con malloc despues de 964 veces dentro de un ciclo, pero no me arroja error sino al ejecutar el programa.

Explicacion completa:

Estoy desarrollando un programa en el cual necesito crear una matriz dinamicamente, ya he implementado la funcion para hacerlo , pero por alguna extraña razon cuando llega a cierto punto dentro del ciclo se me revienta el programa... :huh:
Código: Text
  1.  
  2. char **getDotMatrix(bitmapType *bmp)
  3. {
  4.   char **matrix;
  5.   char *msg;
  6.     int x=0, y=0,i=0,j=0, bytesPerCol = bmp->bitsPerPixel/8;
  7.  
  8.   msg=(char*)malloc(255);
  9.   memset(msg,'\0',255);
  10.  
  11.   matrix = (char **)malloc(bmp->width*bytesPerCol);
  12.  
  13.   if(matrix != NULL)
  14.   {
  15. //    memset(matrix, '\0', sizeof(matrix));
  16.         for(x=0;x < (bmp->width*bytesPerCol);x++)
  17.     {
  18.       matrix[x] = (char *)malloc(bmp->height);
  19.       
  20.       if(matrix[x]!=NULL)
  21.       {
  22.                 //memset(matrix[x], '\0', bmp->height);
  23.                 if((x+1)%964==0)
  24.           x=x;
  25.       }
  26.       else
  27.       {
  28.         strcpy(msg,"Error al asignar memoria a la matrix[x]: ");
  29.         allegro_message(msg);
  30.       }
  31.     }
  32.   
  33.     /*for(y=0;y<bmp->height;y++)
  34.     {
  35.       for(x=0;x<bmp->width*bytesPerCol;x++)
  36.       {
  37.         for(j=2;j>=0;j++)
  38.         {
  39.           matrix[x][y] = bmp->bmpData[i+j];
  40.           x++;
  41.         }
  42.         x--;  
  43.         i+=bytesPerCol;
  44.       }
  45.     }*/  
  46.   }
  47.   else
  48.   {
  49.     strcpy(msg,"Error al asignar memoria a la matrix: ");
  50.     allegro_message(msg);
  51.   }
  52.   
  53.   return matrix;
  54. }
  55.  

He controlado todo lo que parece estar a mi alcance, al utilizar malloc no me devuelve NULL o sea que se supone que ha funcionado bien pero en este segmento:
Código: Text
  1.  
  2.         for(x=0;x < (bmp->width*bytesPerCol);x++)
  3.     {
  4.       matrix[x] = (char *)malloc(bmp->height);
  5.       
  6.       if(matrix[x]!=NULL)
  7.       {
  8.                 //memset(matrix[x], '\0', bmp->height);
  9.                 if((x+1)%964==0)
  10.           x=x;
  11.       }
  12.       else
  13.       {
  14.         strcpy(msg,"Error al asignar memoria a la matrix[x]: ");
  15.         allegro_message(msg);
  16.       }
  17.     }
  18.  
  19.  
como se puede obervar hasta al llegar x=964 todo funciona bien pero en la siguiente asignacion de memoria:

matrix
  • = (char *)malloc(bmp->height);


Me sale este mensaje en el compilador:
Citar
Excepción no controlada en 0x77f65a58 en Bitmap.exe: Punto de interrupción del usuario.
Estos son lo valores de las variables al momento anterior al error, no estan los de el contenido de los apuntadores porque no caben, sin embargo:
bmp->with = 640
bmp->heigth= 480
bmp->bitsPerPixel =24
Citar

   bytesPerCol   3   int
   i   0   int
   x   963   int
   y   0   int
Les agradezco de antemano cualquier ayuda que me puedan prestar  :(
ya que llevo dos dias con esto y no he logrado resolverlo :scream:

Con valores pequeños todo funciona normal.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema De Memoria
« Respuesta #1 en: Lunes 5 de Abril de 2004, 21:53 »
0
Esta respuesta me la han dado en la comunidad de msdn y quiero postearla para el foro:

Ron Natalie:
Citar
"Juank" <juank@etb.net.co> wrote in message news:C4A60EBB-7A5D-44F0-95DB-
>   matrix = (char **)malloc(bmp->width*bytesPerCol);

char** is pointer to pointer to char.   If you want N pointers, you need
to take into account the size of the pointer (N * sizeof (char*)).
    matrix = (char**) malloc(bmp->width*bytesPerCol*sizeof(char*));
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema De Memoria
« Respuesta #2 en: Lunes 5 de Abril de 2004, 21:54 »
0
jajaja
mi respuesta torpe en inglès :P
Citar
Hey!!!

TX You answer my Q very fast !!!

Really i think that it is the problem, altougth i only can try this solution un the nigth ;)
because now i`m in the office!!!

I´m really thankfull with you!!!

tomorrow or this night i post the results here...

TX and more TX
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

gmantil

  • Miembro MUY activo
  • ***
  • Mensajes: 121
    • Ver Perfil
Re: Problema De Memoria
« Respuesta #3 en: Lunes 5 de Abril de 2004, 22:26 »
0
Juank:
¿En que compilador trabajas? Es bueno verificar que tu compilador toma la memoria extendida, no sea que este trabajando solo en los 640KB. Hay una función que nos devuelve la memoria disponible para detectar si la rutina se queda corta de memoria. Normalmente lo deberias poder ver con el NULL que retorna malloc, pero no entiendo porque no lo hace correctamente. Yo me inclino por pensar que tu programa solo trabaja con 640 KB y se está quedando corto. Voy a tratar de buscar la función que mide la memoria. Hay cosas que se dejan de utilizar y se olvidan.

Seguiremos en contacto.

gmantil

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema De Memoria
« Respuesta #4 en: Lunes 5 de Abril de 2004, 22:30 »
0
Es cierto,
no se me habia ocurrido esa opción.

El compilador que uso es el visual studio .NET, por suerte es muy parametrizable en cuanto a opciones de compilacion, asi que esta noche tambien le hechare una ojeada a eso.

gracias profe.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema De Memoria
« Respuesta #5 en: Martes 6 de Abril de 2004, 08:15 »
0
Listo todo solucionado.. el error era en la asignacion ya que no estaba reservando memoria para un char * sino solo para un char.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io