Buscar temas sin respuesta | Ver temas activos |

Nuevo tema Responder al tema Índice general » Programacion: Vieja escuela » C / C++
Autor Mensaje
Desconectado 
 Asunto: problema de memoria en C++
NotaPublicado: 10 Mar 2010 14:23 
poster a 1200 bps

Registrado: 28 Oct 2009 11:17
Mensajes: 17
antes que nada saludos a todos y gracias por tomarse el tiempo de leer esto!
este es mi problema: estoy usando el compilador Turbo C++ 4.5 (funciona en Windows, no en DOS) para desarrollar un emulador de Nintendo NES. tengo que reservar memoria para emular la memoria RAM de la consola. en el codigo fuente del emulador XNES vi que lo hacen de la siguiente manera:

Código:
RAM = (byte *)malloc( 0x10000 );


...pero cuando intento hacer eso en mi compilador de tira error. pareciera que no hay memoria suficiente, pero se que es un error del compilador. este error siempre me salta cuando intento reservar un bloque de memoria mayor a 65534 (noten que 0x10000 = 65536)

por que pasa esto? como lo puedo resolver?

este es el codigo que desarrolle hasta ahora (prihibido reirse! jaja):

Código:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

void main(void)
{
   FILE *fp;
   char gamename[50];
   int i,RomBanks16kb,VRomBanks8kb,RamBanks8kb;
   unsigned char *mem,*RAM,*ROM,*VRAM,*VROM,*SRAM;
   unsigned long int kbromsize,pc;

   clrscr();
   strcpy(gamename,"demo.nes");
   for(i = 0;i <= strlen(gamename) - 1;i++)
   {
      gamename[i] = toupper(gamename[i]);
   }
   fp = fopen(gamename,"rb");
   if(!fp)
   {
      printf("Error abriendo el archivo %s. Saliendo...",gamename);
      getch();
      exit(1);
   }
   printf("Archivo %s abierto correctamente",gamename);
   rewind(fp);
   fseek(fp,0L,2);
   kbromsize = ftell(fp);
   printf("\nTamano de la rom: %d kb",kbromsize);
   mem = (unsigned char *)malloc(kbromsize);
   rewind(fp);
   fread(mem,1,kbromsize,fp);
   if(!mem)
   {
      printf("\nError alojando la memoria principal. Saliendo...");
      getch();
      exit(1);
   }
   printf("\nArchivo cargado en memoria correctamente");
   if((mem[0] == 'N') && (mem[1] == 'E') && (mem[2] == 'S'))
   {
      printf("\niNes header encontrado");
   }
   else printf("\nEl archivo %s no es una rom de NES. Saliendo...",gamename);
   RomBanks16kb = mem[4];
   VRomBanks8kb = mem[5];
   printf("\n%d banco(s) de memoria ROM",RomBanks16kb);
   printf("\n%d banco(s) de memoria VROM",VRomBanks8kb);
   RAM = (unsigned char *)malloc(0x10000);
   /*ROM = (unsigned char *)malloc(RomBanks16kb * 16 * 1024);
   VRAM = (unsigned char *)malloc(0x4000);
   VROM = (unsigned char *)malloc(VRomBanks8kb * 8 * 1024);
   SRAM = (unsigned char *)malloc(0x100);*/
   if(!RAM)
   {
      printf("\nError alojando la memoria principal. Saliendo...");
      getch();
      exit(1);
   }

   printf("\n\n");
   pc = 0;
   while(pc <= 139)
   {
      if((pc != 0) && (pc % 20 == 0)) printf("\n");
      printf("%2X ",mem[pc]);
      pc++;
   }

   printf("\n\nSaliendo...");
   getch();
   return;
}


se que puedo solucionar este problema usando la libreria "allegro.h", pero tuve problemas para usarla en todos los compiladores C/C++ que probe, salvo en el Dev-C++... que es un espanto...

cualquier ayuda sera bienvenida! saludos :good:

_________________
http://nestate.uuuq.com


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 10 Mar 2010 14:34 
Mike is here
Avatar de Usuario

Registrado: 05 Jun 2002 20:45
Mensajes: 709
Ubicación: Barril 8
El compilador que usas compila a 16 o 32 bits ?

Cual es exactamente el fallo que te muestra ? (copialo y pegalo aca)


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 10 Mar 2010 14:43 
poster a 1200 bps

Registrado: 28 Oct 2009 11:17
Mensajes: 17
ZZMike escribió:
El compilador que usas compila a 16 o 32 bits ?

Cual es exactamente el fallo que te muestra ? (copialo y pegalo aca)

ahi me mataste, ni idea a cuantos bits compila... es el famoso Turbo C++ 4.5 de Borland, ese que el icono es un autito de carreras jeje mala mi descipcion, pero es muy conocido, seguro lo conoces ;)

en realidad no me muestra ningun fallo, pero me dice que la memoria es insuficiente cuando en realidad en mi maquina tengo 512 kb de ram. tiene algo que ver con la cantidad de memoria que el compilador reserva para los ejecutables que genera? a lo mejor estoy superando algo de eso... tendra algo que ver con todo el tema del "heap" y el "farheap" de C? :\

_________________
http://nestate.uuuq.com


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 10 Mar 2010 16:36 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8890
¿por qué no usas algo bastante más moderno? ¿por alguna razón en especial estás programando para DOS en 16 bits, pero que son emulados (vm86), ya que en realidad estás bajo 32 bits?

Al haber preguntado lo de los bits dudo que tengas una razón técnica. Creo que lo mejor sería que uses algo más moderno, compilando en 32 bits, como el mingw32 + algún IDE como el Code:blocks.
Te olvidas de la memoria baja, la memoria alta, y los cientos de problemas asociados.

Por otro lado estás compilando código C en un compilador de C++.

El Code:blocks ya trae integrado un compilador de C y de C++, (el mingw32) junto con la librería standard de C y de C++

_________________
7f 45 4c 46 01 00 00 00 00 00 00 00 00 10 00 00 02 00 03 00 20 10 00 00 20 10 00 00 04 00 00 00 b3 2a 31 c0 40 cd 80 00 34 00 20 00 01


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 10 Mar 2010 16:59 
poster a 1200 bps

Registrado: 28 Oct 2009 11:17
Mensajes: 17
ok gracias por tu respuesta djgera! el tema es q no uso los nuevos compiladores porque siempre por H o por B me terminan por hartar... mas que nada por el tema de como indentan jeje parecera una estupidez, pero soy bastante histerico con ese tema XD
en ese caso voy a probar con el que vos me dijiste. que tengo que bajar? el Code::Blocks nomas?

_________________
http://nestate.uuuq.com


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 11 Mar 2010 06:15 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8890
Un compilador no tiene nada que ver con la sangría, eso es cuestión del editor.
Además tiene una cantidad enorme de opciones de sangrando, no sólo opciones por separadas, sino que también tenes perfiles para ajustarse a estilos de sangrado predefinidos (K&R, GNU, ANSI, Linux, etc.) o personalizados.

http://www.codeblocks.org
http://surfnet.dl.sourceforge.net/proje ... -setup.exe
Ojo: en la página se aclara que el mingw32 (el compilador GCC portado a win32) no anda correctamente en Windows Vista.

_________________
7f 45 4c 46 01 00 00 00 00 00 00 00 00 10 00 00 02 00 03 00 20 10 00 00 20 10 00 00 04 00 00 00 b3 2a 31 c0 40 cd 80 00 34 00 20 00 01


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 11 Mar 2010 09:28 
poster a 1200 bps

Registrado: 28 Oct 2009 11:17
Mensajes: 17
listo ya lo solucione: instale el Code::Blocks.
es cierto djgera que el compilador no tiene nada que ver con el editor, puede que me haya expresado mal, pero creo que se entendio lo que quise decir...
de todas maneras ese Dev-C mmmmm no se de donde le tengo tanto rechazo. lo encuentro terriblemente ¿debil? le tengo tanto rechazo que ni siquiera quiero pensar un calificativo jaja
me quedo con el C::B que anda perfecto y tiene un interfaz muy piola (y ademas indenta bien :lol: )

saludos y gracias a todos por sus respuestas! :D

_________________
http://nestate.uuuq.com


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 12 Mar 2010 00:40 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8890
pequeños detalles...
Código:
   for(i = 0;i <= strlen(gamename) - 1;i++)
   {
      gamename[i] = toupper(gamename[i]);
   }

por
Código:
while ((gamename[i] = toupper(gamename[i]))) i++;

Código:
rewind(fp);
fseek(fp,0L,2);

por (preferible usar la macro)
Código:
fseek(fp,0L,SEEK_END);


Código:
   mem = (unsigned char *)malloc(kbromsize);


En C no es necesario el cast. (pero sí es sugerido en C++), ya que retorna un void* (ya que está presente stdlib.h), idem para los demás.
Código:
mem = malloc(kbromsize);


deberías verificar el valor que retorna fread, puede ser menos de lo que pediste...

Código:
   pc = 0;
   while(pc <= 139)
   {
      if((pc != 0) && (pc % 20 == 0)) printf("\n");
      printf("%2X ",mem[pc]);
      pc++;
   }


por
Código:
printf("%2X ", mem[0]);
for (pc = 1; pc <= 139; pc++) {
    if ((pc % 20 == 0))
        printf("\n");
    printf("%2X ", mem[pc]);
}

_________________
7f 45 4c 46 01 00 00 00 00 00 00 00 00 10 00 00 02 00 03 00 20 10 00 00 20 10 00 00 04 00 00 00 b3 2a 31 c0 40 cd 80 00 34 00 20 00 01


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 12 Mar 2010 09:56 
poster a 1200 bps

Registrado: 28 Oct 2009 11:17
Mensajes: 17
gracias por tus consejos djgera! muchas de esos detalles (buenos o malos) son costumbres que fui agarrando en los años jeje los voy a tener en cuenta!

_________________
http://nestate.uuuq.com


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 12 Mar 2010 10:23 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8890
De nadas.

Otro mínimo detalle: "void main(void)" debería ser a lo sumo, "int main(void)", ya que estás ejecutándolo dentro de un sistema operativo, y se asume que el programa retorna un valor. El "void main(void)" suele usarse en microcontroladores, donde el "main()" no termina. Ejemplo en AVR usando la libc-avr, si retornas del main(), lo que ocurre es que se inhiben las interrupciones y queda en un ciclo infinito que no hace nada. (me fui de tema)

PD: sí, lo se, soy medio rompe con esto.

_________________
7f 45 4c 46 01 00 00 00 00 00 00 00 00 10 00 00 02 00 03 00 20 10 00 00 20 10 00 00 04 00 00 00 b3 2a 31 c0 40 cd 80 00 34 00 20 00 01


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 12 Mar 2010 13:30 
poster a 1200 bps

Registrado: 28 Oct 2009 11:17
Mensajes: 17
djgera escribió:
De nadas.

Otro mínimo detalle: "void main(void)" debería ser a lo sumo, "int main(void)", ya que estás ejecutándolo dentro de un sistema operativo, y se asume que el programa retorna un valor. El "void main(void)" suele usarse en microcontroladores, donde el "main()" no termina. Ejemplo en AVR usando la libc-avr, si retornas del main(), lo que ocurre es que se inhiben las interrupciones y queda en un ciclo infinito que no hace nada. (me fui de tema)

PD: sí, lo se, soy medio rompe con esto.

y si, algo de eso debe haber porque los todos los compiladores C/C++ que funcionan bajo Windows impiden darle el tipo "void" a la funcion "main" (al menos todos los que yo probe). como yo siempre use el viejo compilador Borland C++ de DOS, que dejaba darle el "void", me quedo esa costumbre.
de todas maneras no veo el por que de la negativa de los nuevos compiladores al "void main()" en el caso de que el resultado del "main" no lo este usando para nada... tal vez el SO si lo utiliza indefectiblemente?

_________________
http://nestate.uuuq.com


Arriba
 Perfil  
 
Desconectado 
 Asunto: Re: problema de memoria en C++
NotaPublicado: 12 Mar 2010 22:37 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8890
El standard de C lo permite, pero el SO va a leer basura. Esta basura se debe a que cuando el main() retorna, la rutinita CRT que hay en el ejecutable, va a leer el valor que hay en la pila pasándole este valor, al SO. No es nada grave, pero si encadenas programas y el que lo invoca espera un valor para saber si termino bien, no te va a funcionar.

_________________
7f 45 4c 46 01 00 00 00 00 00 00 00 00 10 00 00 02 00 03 00 20 10 00 00 20 10 00 00 04 00 00 00 b3 2a 31 c0 40 cd 80 00 34 00 20 00 01


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 12 mensajes ] 


  Imprimir vista Tema previo | Siguiente tema 

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


Todos los horarios son UTC - 3 horas


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Buscar:
Saltar a:  
cron
PC++ Style
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë