• Martes 14 de Julio de 2020, 16:05

Autor Tema:  punteros  (Leído 1855 veces)

aguila3000

  • Miembro activo
  • **
  • Mensajes: 26
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.conoce3000.com
punteros
« en: Domingo 19 de Diciembre de 2010, 01:22 »
0
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?

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: punteros
« Respuesta #1 en: Domingo 19 de Diciembre de 2010, 04:53 »
0
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.

aguila3000

  • Miembro activo
  • **
  • Mensajes: 26
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.conoce3000.com
Re: punteros
« Respuesta #2 en: Domingo 19 de Diciembre de 2010, 12:02 »
0
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.

DriverOp

  • Miembro MUY activo
  • ***
  • Mensajes: 201
    • Ver Perfil
Re: punteros
« Respuesta #3 en: Domingo 19 de Diciembre de 2010, 16:29 »
0
Deberías usar la estructura try... except para eso:

http://www.freepascal.org/docs-html/ref ... 19000014.2

aguila3000

  • Miembro activo
  • **
  • Mensajes: 26
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.conoce3000.com
Re: punteros
« Respuesta #4 en: Lunes 20 de Diciembre de 2010, 03:01 »
0
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.  

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: punteros
« Respuesta #5 en: Lunes 20 de Diciembre de 2010, 21:21 »
0
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.

aguila3000

  • Miembro activo
  • **
  • Mensajes: 26
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.conoce3000.com
Re: punteros
« Respuesta #6 en: Martes 21 de Diciembre de 2010, 01:25 »
0
Y que sería mejor ¿Qué devuelve nil? o ¿Usar excepciones?

aguila3000

  • Miembro activo
  • **
  • Mensajes: 26
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.conoce3000.com
Re: punteros
« Respuesta #7 en: Martes 21 de Diciembre de 2010, 03:52 »
0
Haciendo preguntas por qui y por alla, encontre esto:
  http://www.freepascal.org/docs-html/prog/progsu158.html
y esto:
  http://www.freepascal.org/docs-html/rtl ... fails.html

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.