• Lunes 18 de Noviembre de 2024, 20:43

Autor Tema:  Memoria Disponible  (Leído 2393 veces)

Hoodman

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Memoria Disponible
« en: Viernes 18 de Junio de 2004, 15:22 »
0
Espero que todos esten bien. Tengo una pregunta a ver si me pueden ayudar.
Existe una funcion en C que me diga la cantidad de memoria que hay disponible en el sistema(Windows)? o por lo menos una forma de saber esto. Si alguien tiene una idea por favor me la comunica, muchas gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Memoria Disponible
« Respuesta #1 en: Viernes 18 de Junio de 2004, 15:23 »
0
No creo que en C exista eso, pero para que Sistema Operativo lo queres?

 :ph34r:  :comp:  :hola:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Memoria Disponible
« Respuesta #2 en: Sábado 19 de Junio de 2004, 02:24 »
0
no directamente en c, pero lo puedes hacer a travez de la api de windows
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Memoria Disponible
« Respuesta #3 en: Sábado 19 de Junio de 2004, 22:49 »
0
Un saludo a todos pues hacía muxo ke no me pasaba!!!!

Como bien ha dicho Juank hay una función de la API de windows que permite hacerlo: MEMORYSTATUS ke te indica la cantidad de memoria física y virtual disponible y total.
Aki te dejo el código para realizarlo, SIEMPRE BAJO WINDOWS claro:
Código: Text
  1.  
  2. char  m_ram[300];
  3. MEMORYSTATUS statex;
  4.  
  5.   statex.dwLength = sizeof (statex);
  6.  
  7.   GlobalMemoryStatus (&statex);
  8.  
  9.   sprintf(m_ram,"%7.0f MB de memoria física\n%7.0f MB libres\n"
  10.                                       "%7.0fMB de memoria virtual\n%7.0f MB libres",
  11.                                      (float)statex.dwTotalPhys/(div*1000),(float)     statex.dwAvailPhys/(div*1000),(float)statex.dwTotalVirtual/(div*1000),(float)statex.dwAvailVirtual/(div*1000));
  12.  
  13.                 puts(m_ram);
  14.  
  15.  
Por si también te interesa hay también una función para saber el espacio de los discos:
Código: Text
  1.  
  2. #include <windows.h>
  3. #include <stdio.h>
  4.  
  5. #define div 1048576
  6.  
  7. void main()
  8. {
  9.   __int64 libre_usuario,total,libre;
  10.  
  11.   if (GetDiskFreeSpaceEx("C:\\",(ULARGE_INTEGER *)&libre_usuario,(ULARGE_INTEGER *)&total,
  12.     (ULARGE_INTEGER *)&libre))
  13.    {
  14.     printf("\n\t\tUnidad c:\n");
  15.       printf("\n\tEspacio total = %5.5f MB\n", (float)total/div);
  16.     printf("\n\tEspacio libre = %5.5f MB\n", (float)libre/div);
  17.     printf("\n\tEspacio libre usuario = %5.5f MB\n", (float)libre_usuario/div);
  18.    }
  19.   if (GetDiskFreeSpaceEx("D:\\",(ULARGE_INTEGER *)&libre_usuario,(ULARGE_INTEGER *)&total,
  20.     (ULARGE_INTEGER *)&libre))
  21.    {
  22.     printf("\n\t*************************");
  23.     printf("\n\t\tUnidad d:\n");
  24.       printf("\n\tEspacio total = %5.5f MB\n", (float)total/div);
  25.     printf("\n\tEspacio libre = %5.5f MB\n", (float)libre/div);
  26.     printf("\n\tEspacio libre usuario = %5.3f MB\n", (float)libre_usuario/div);
  27.    }
  28.  
  29.   getchar();
  30. }
  31.  
  32.  
Fijate ke he mirado el espacio de dos unidades: C: y D:, tendrás ke poner las letras ke en tu caso se correspondan con las unidades de disco.
En fin espero ke te sirva de ayuda, Un saludo!!!!
No hay tonto más molesto que el ingenioso.

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Memoria Disponible
« Respuesta #4 en: Sábado 19 de Junio de 2004, 23:38 »
0
Interesante :comp:... Gracias carmamezo por la informacion... una consulta, hay alguna funcion en las APIs para visualizar el codigo interno de las bios de un disco regido... no se si estoy preguntando bien, espero que sip. Saludos :hola:
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Memoria Disponible
« Respuesta #5 en: Sábado 19 de Junio de 2004, 23:51 »
0
Hola Jonathan, viejo amigo, la verdad es que me has pillao... No conozco ninguna función que permita tal cosa... La verdad es que tampoco sé muy bien qué es lo que quieres.  Como mucho se puede saber el serial de un CD o cosas así...
Sorry!!!
un saludo!
No hay tonto más molesto que el ingenioso.

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Memoria Disponible
« Respuesta #6 en: Domingo 20 de Junio de 2004, 00:18 »
0
ok amigo, no hay problema, lo que pedia es algo similar... de fabrica, cada disco rigido trae un numero de identificacion dentro de sus bios (o algo asi)... tengo unas ideas locas para desarrollar partiendo de ese conocimiento. Pero va a ser dificil... Te agradesco te tiempo. Saludos y Suerte :hola:
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»

Hoodman

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Memoria Disponible
« Respuesta #7 en: Lunes 21 de Junio de 2004, 15:34 »
0
Muchas gracias Sr. Juank y Sr carmamezo, la informacion que me proporsionaron me sirvio de mucho, para unos de mi proyecto. Aunque para el mas importante no puedo usar el API de windows para lo que quiero. Dejame explicarme un poco mejor.

Necesito hacer un programa usando codigo de C y/o Assembler que tenga una lista enlazada de n elementos. Los elementos de la lista se van a ir agregando automaticamente y cada vez que se agregue un elemento debo de imprimir en pantalla cuanta memoria queda en el sistema.

Mi problema esta en que no se que tipo de memoria se va ocupando cuando agrego un elemento a lista enlazada. El codigo que genera la lista ya lo hice, y le he puesto codigo que he encontrado a ver si me devuelve la memoria que queda. En todas la pruebas siempre me devuelve el mismo numero a veces 640k o dependiendo de la memoria que le asigne al programa atravez de windows. Por ejemplo le doy un click derecho en el archivo ejecutable de mi programa, en propiedades voy a memoria y le pongo en la memoria convencional un total de 80 y entorno inicial 256, y a toda las demas memoria que aparecen (extendida EMS y SMS) le pongo ninguna y entonces el codigo me devuelve 148k en vez de 640k.

Bueno para no hacerle el cuento mas largo hay le pongo unos de los codigo que he encontrado que me devuelve supuestamente la memoria disponible.

void set_xy(int x, int y)
{
  union REGS r;

  r.h.ah=2;
  r.h.bh=0;
  r.h.dh=y-1;
  r.h.dl=x-1;
  int86(0x10,&r,&r);
}

void _set_xy(char x, char y)
{
   asm mov ah,02h    // _AH=2
   asm mov bh,0h     // _BH=0
   asm mov dh, y     // _DH=y-1
   asm dec dh
   asm mov dl, x     // _DL=x-1
   asm dec dl
   asm int 10h
}

int get_memory_size(void)
{
   union REGS r;

   int86(0x12,&r,&r);
   return(r.x.ax);   // kbyte
}

int _get_memory_size(void)
{
   asm int 12h

   return(_AX);
}

int put_print(char ch)
{
   union REGS r;

   r.h.ah=0;
   r.h.al=ch;
   int86(0x17,&r,&r);
   return(r.h.ah);   // Status code
}

int _put_print(char ch)
{

   _AH=0;
   _AL=ch;
   asm int 17h;

   return(_AH);
}

void main(void)
{
  int h,m,s,s100;

  set_xy(5,5);   printf("dfghjkl\n");
  _set_xy(10,10);printf("123456789\n");
  printf("Memory size = %dkbyte.\n",get_memory_size());
  printf("Memory size = %dkbyte.\n",_get_memory_size());
  put_print('A');
  _put_print('B');
 getch();
}

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Memoria Disponible
« Respuesta #8 en: Lunes 21 de Junio de 2004, 16:13 »
0
Lista de interrupciones de MS-DOS:

http://www.ctyme.com/rbrown.htm


 :ph34r:  :comp:  :hola:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Memoria Disponible
« Respuesta #9 en: Lunes 21 de Junio de 2004, 18:10 »
0
en otro post te respondi las restricciones que tienes para usar el codigo que posteaste.
NO HAY
ninguna manera de hacer lo que pides en un sistema moderno sino es a travez de la API,

las interrupciones del DOS no te funcionaran sino en sistemas vbasados en dos, como los viejos windows.
te puedes servir de la para saber la menmoria disponible al comenzar el programa y luego con ayuda de la funcion sizeoff puedes saber el tamaño de un nodo de la lkista y simpolemente llevar las cuentas acumulando cada vez que adicionas un nuevo nodo,
sin embargo es una medicion inexacta ya que otros programas tambien estarian copnsumiendo recursos del sistema mientras ejecutas tu programa, asi que realmente la cantidad de memoria podria aumenmtar o disminuir abruotamente mientras se ejecuta tu programa sinque tengas manera de saberlo salvo que uses llamadas recurrentes a la api.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Memoria Disponible
« Respuesta #10 en: Lunes 21 de Junio de 2004, 18:14 »
0
"Muchas gracias Sr. Juank y Sr carmamezo, la informacion que me proporsionaron me sirvio de mucho, para unos de mi proyecto. Aunque para el mas importante no puedo usar el API de windows para lo que quiero. Dejame explicarme un poco mejor."

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.