Delphi - Error d memoria

 
Vista:

Error d memoria

Publicado por Luis Hurtado (6 intervenciones) el 02/08/2001 23:20:53
La ejecucion de este procedimiento me da error y no entiendo porque.
Podrias ayudarme?
type
Bytes = array of byte;
PBytes = ^Bytes;

// convierte un entero a una cadena de bytes
procedure IntToBytes(orig : integer; var dest : PBytes);
var
i,n : integer;
begin
n := sizeof(orig);
try
new(dest);
SetLength(dest^,n);
except
//no se pudo reservar memoria
exit;
end;
for i:=0 to n-1 do
begin
dest^[i] := PBytes(orig)^[i] //aqui me da error de memoria.
end;
end;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error d memoria

Publicado por Toni (36 intervenciones) el 02/08/2001 23:48:03
La verdad es que no estoy familiarizado con los punteros en Delphi pero me llama la atencion la instruccion de dentro del for, Es una especie de cast???
for i:=0 to n-1 do
begin
dest^[i] := PBytes(orig)^[i] //aqui me da error de memoria.
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Error d memoria

Publicado por Luis Hurtado (6 intervenciones) el 03/08/2001 00:02:34
Ahi hago un casting de integer a pbytes, y en tren de bytes apuntado por dest almaceno en la posicion i el contenido (^) de la posicion i del casting que le hice al entero.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Prueba esto a ver...

Publicado por Jose Antonio Guerrero (36 intervenciones) el 03/08/2001 10:53:54
n := sizeof(orig);
Ah{i creo que debe estar el problema, prueba a hacer el size del entero una vez le has hecho el casting, es decir sizeof(PBytes(orig))

Pruebalo y dime que tal
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Prueba esto a ver...

Publicado por Luis Hurtado (6 intervenciones) el 03/08/2001 21:01:22
sizeof(PBytes(orig)) me devuelve el tamaño que ocupa esa variable (Puntero a bytes) en la memoria, yo necesito que el tamaño del arreglo sea del tamaño de la variable que va a contener, es decir del tamaño de un integer (4 bytes), por eso hago sizeof(orig) porque ori es un entero. ¿?.
Gracias.
¿Que opinas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Prueba esto a ver...

Publicado por Luis Hurtado (6 intervenciones) el 03/08/2001 21:01:22
sizeof(PBytes(orig)) me devuelve el tamaño que ocupa esa variable (Puntero a bytes) en la memoria, yo necesito que el tamaño del arreglo sea del tamaño de la variable que va a contener, es decir del tamaño de un integer (4 bytes), por eso hago sizeof(orig) porque ori es un entero. ¿?.
Gracias.
¿Que opinas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

A ver esto

Publicado por Jose Antonio Guerrero (36 intervenciones) el 04/08/2001 11:43:58
Como ya te digo en delphi no suelo manejar punteros pero creo que lo que esta ocurriendo es esto:

Al hacer un cast del entero a puntero estas convirtiendo el tipo, es decir estas dandole el valor del entero al puntero.
Asi no tienes ni idea de que es lo que hay en esa zona de memoria, que si se trata de zona de codigo del programa cascar{a categoricamente (no quiero ni contarte si es en la pila) No se si delphi controla eso (c no lo hace y sufro las consecuencias) al parecer te ha dado el error es probable que si.
Lo que tienes que hacer es crearte un puntero a bytes y hacer que apunte a tu entero y entonces realizar la asignacion con el bucle for. Pruebalo a ver que tal vale ya me cuentas....

SUERTE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Esta es la solución

Publicado por Ernesto D'Spirito (706 intervenciones) el 06/08/2001 11:18:50
Lo que quieres hacer puede hacerse mucho más fácil así:

type
Bytes = array[0..sizeof(integer)-1] of byte;

// convierte un entero a un arreglo de bytes
procedure IntToBytes(orig : integer; var dest : Bytes);
type
PInteger = ^Integer;
begin
PInteger(@dest)^ := orig;
end;

La razón por la que tu código no funciona es porque al hacer

PBytes(orig)

le estás diciendo que convierta un entero (orig: integer) en un PBytes, o sea en un puntero a un arreglo de bytes. En otras palabras, si orig valiera 5, PBytes(orig) también valdrá 5 (pero será un puntero). Lo que tu quieres es el puntero a ese entero, o sea la dirección de orig, por lo que deberías usar el operador "@" para que tu código funcione:

PBytes(@orig)

Espero que te sirva.

Ernesto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar