SoloCodigo

Programación General => Pascal => Mensaje iniciado por: aguila3000 en Domingo 19 de Diciembre de 2010, 01:22

Título: punteros
Publicado por: aguila3000 en Domingo 19 de Diciembre de 2010, 01:22
He escrito el siguiente programa, y tengo algunas preguntas:

Código: Pascal
  1. Var p01,p02,p03,p04:^byte;
  2. Begin
  3.   getmem(p01,1024*1024*1024);
  4.   if (p01<>nil) then Writeln('ok 1')
  5.   else Writeln('ko 1');
  6.  
  7.   getmem(p02,1024*1024*1024);
  8.   if (p02<>nil) then Writeln('ok 2')
  9.   else Writeln('ko 2');
  10.  
  11.   getmem(p03,1024*1024*1024);
  12.   if (p03<>nil) then Writeln('ok 3')
  13.   else Writeln('ko 3');
  14.  
  15.   getmem(p04,1024*1024*1024);
  16.   if (p04<>nil) then Writeln('ok 4')
  17.   else Writeln('ko 4');
  18. End.
  19.  

¿Cómo puedo saber que ya no tengo memoria para los punteros?
¿Cómo puedo evitar el error: "runtime error 203 ..."?
¿Cómo puedo crear punteros de 4GB o de tamaño mayor?
Título: Re: punteros
Publicado por: Enko en Domingo 19 de Diciembre de 2010, 04:53
Puntero es solo una variable que apunta a una direccion de memoria... medio dificil que no tengas espacio para punteros. Si te puede pasar que no tengas memoria para reservar.

si getmem te devuelve nil es que ya no hay  memoria para reservar.

Si programas en DOS creo que el limite son 64kb si mal no recuerdo.
En el modo protegido de 32 bin (windows xp) la arquitectura est'a hecha de tal manera del CPU que solo puede redireccionar 4gb de memoria.
Título: Re: punteros
Publicado por: aguila3000 en Domingo 19 de Diciembre de 2010, 12:02
Gracias por tu respuesta.
Si no hay memoria, entonces.
¿Cómo puedo evitar crear más variables dinámicas?

Al usar getmem, se supone que al no haber memoria debe darme nil, pero eso no sucede y sale el error runtime error 203.
Estoy usando Win32 (WindowsXP Pro, Vista) y el compilador freepascal, en Linux tambien me sucede lo mismo.
Título: Re: punteros
Publicado por: DriverOp en Domingo 19 de Diciembre de 2010, 16:29
Deberías usar la estructura try... except para eso:

http://www.freepascal.org/docs-html/ref ... 19000014.2 (http://www.freepascal.org/docs-html/ref/refse78.html#x180-19000014.2" onclick="window.open(this.href);return false;)
Título: Re: punteros
Publicado por: aguila3000 en Lunes 20 de Diciembre de 2010, 03:01
ok, pero en C++, No tengo ese problema, cuando la variable dinámica no se puede crear, entonces me devuelve null o nil =0
En freepascal, porque no es lo mismo.
Probe con gnu y sale lo siguiente: ./a.out: out of heap when allocating 1073741824 bytes (error #853 at 804dc86)

¿ Sabes si este problema sucede con Delphi ?

Código: C++
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. int main ()
  7. {  
  8.   char *p01;
  9.   p01 = (char*) malloc(1024*1024*1024);
  10.   if (p01!=NULL) cout << "ok01n";
  11.   else cout << "ko01n";
  12.  
  13.   char *p02;
  14.   p02 = (char*) malloc(1024*1024*1024);
  15.   if (p02!=NULL) cout << "ok02n";
  16.   else  cout << "ko02n";
  17.  
  18.   char *p03;
  19.   p03 = (char*) malloc(1024*1024*1024);
  20.   if (p03!=NULL) cout << "ok03n";
  21.   else cout << "ko03n";
  22.  
  23.   char *p04;
  24.   p04 = (char*) malloc(1024*1024*1024);
  25.   if (p04!=NULL) cout << "ok04n";
  26.   else cout << "ko04n";
  27.  
  28.   return 0;
  29. }
  30.  
Título: Re: punteros
Publicado por: Enko en Lunes 20 de Diciembre de 2010, 21:21
Citar
he GetMem procedure attempts to get the specified StorageSize bytes of storage, storing a pointer to the storage in StoragePointer.
 
If the allocation fails, then a EOutOfMemory exception is raised.
 
The storage is not initialised in any way.
Por lo visto en Delphi lanza una excepcion tambien en vez de devolver nil.
Título: Re: punteros
Publicado por: aguila3000 en Martes 21 de Diciembre de 2010, 01:25
Y que sería mejor ¿Qué devuelve nil? o ¿Usar excepciones?
Título: Re: punteros
Publicado por: aguila3000 en Martes 21 de Diciembre de 2010, 03:52
Haciendo preguntas por qui y por alla, encontre esto:
  http://www.freepascal.org/docs-html/prog/progsu158.html (http://www.freepascal.org/docs-html/prog/progsu158.html" onclick="window.open(this.href);return false;)
y esto:
  http://www.freepascal.org/docs-html/rtl ... fails.html (http://www.freepascal.org/docs-html/rtl/system/returnnilifgrowheapfails.html" onclick="window.open(this.href);return false;)

en fpc existe una variable ReturnNilIfGrowHeapFails, que define el comportamiento de la administración de memoria, si es true entonces las funciones como getmem, reallocmem y new devuelven nil, en caso contrario devuelve false.
Por defecto es false, No se realmente porque estará en False, si alguien sabe me gustaría saberlo.

El programa quedaría algo así:
Código: Pascal
  1. Var p01,p02,p03,p04:^byte;
  2. Begin
  3.  
  4.   ReturnNilIfGrowHeapFails:=true;
  5.  
  6.   getmem(p01,1024*1024*1024);
  7.   if (p01<>nil) then Writeln('ok 1')
  8.   else Writeln('ko 1');
  9.  
  10.   getmem(p02,1024*1024*1024);
  11.   if (p02<>nil) then Writeln('ok 2')
  12.   else Writeln('ko 2');
  13.  
  14.   getmem(p03,1024*1024*1024);
  15.   if (p03<>nil) then Writeln('ok 3')
  16.   else Writeln('ko 3');
  17.  
  18.   getmem(p04,1024*1024*1024);
  19.   if (p04<>nil) then Writeln('ok 4')
  20.   else Writeln('ko 4');
  21. End.
  22.  
  23.