Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   punteros y arrays...Urgente please!! (https://www.clubdelphi.com/foros/showthread.php?t=1961)

ssaavedra 03-07-2003 22:09:19

punteros y arrays...Urgente please!!
 
Que tal amigos, miren :

teniendo esto:

procedure TForm1.Button1Click(Sender: TObject);
var
dwHora: dword;
dato : ^dword;
begin
dwHora := DateTimeToUnix(Now());
dato:=0;
dato := @dwHora;

if (GeneroPaqueteTx(0,PHOR,SizeOf(dwHora),dato)) then
begin

end;
end

al recibirlo en la funcion:

function TForm1.GeneroPaqueteTx(destino: byte; tipoDato:byte; longDato: integer; Buffer:Pointer): Boolean;
var
Aux : array[0..64] of byte;
begin
FillChar(Aux, SizeOf(Aux), 0);

result := False;
Aux[0]:=destino;
Aux[1]:=255;
Aux[2]:=tipoDato;
Aux[3]:=longDato;

result:=True;
end;

......lo que necesito y no comprendo es como meter la hora (en este caso) en formato unix, que me viene en Buffer, a partir de la posicion 4 del vector de bytes Aux,.....tienen idea si me sujieren que lo haga de distinta manera no hay problema. (en este caso como Buffer es un puntero a dword, que son 4 bytes, en el array acupara de la 4 a la 7..).

Muchas gracias a todos. :D

andres1569 03-07-2003 23:33:35

Prueba algo como esto, usando la función lo que devuelve el byte de menor orden, y "corriendo" el número hacia la derecha a saltos de 8 bits mediante shr:
Código:

var
  L : DWORD;
begin
  L := Buffer^; 
  Aux[7] := Lo(L);
  L := L shr 8;
  Aux[6] := Lo(L);
  L := L shr 8;
  Aux[5] := Lo(L);
  L := L shr 8;
  Aux[4] := Lo(L);
  ...
end;

Lo he hecho al revés, desde el 7 al 4, aunque también existe la función Hi que decuelve el Byte de mayor orden, pero ocurre que está pensada para un entero de 2 bytes (Smallint) y no serviría para el tipo DWord.

ssaavedra 04-07-2003 00:30:05

andres1569, que tal.....


mira, lo que tengo el el lugar a donde apunta Buffer, (lo que tu acumulaste en L), viendolo atraves de "Evaluate/Modify", es esto:

1057258743,

que es justamente la hora en formato unix (1970....etc. etc.), bien la funcion que me calcula esa hora me devuelve un Int64, entiendes por eso elegi un dword y un puntero a dword, para pasar como parametro (mi parametro de llamada a la funcion: dato).

bien, luego de hacer lo que tu me indicaste (de Aux[7], a Aux[4]...), me aparecen en cada uno de ellos:
63 - 4 - 126 - 29, respectivamente, o sea que no me paso:
1057258743, por que crees que puede ocurrir, desde ya, andres,....te agradezco enormemente.

SCS

andres1569 04-07-2003 00:56:06

Hola:

Aclarar que el tipo Int64 es un entero de 8 bytes (64 bits) y el DWord es un entero de 4 Bytes (32 Bits). Si la función que te devuelve la fecha realmente devuelve un entero de 8 bytes, deberás cambiar ciartas partes del código.

En cuanto a la forma de almacenar ese valor en el array de bytes, depende de la forma en que se quiera leer; de la manera en que te dije, almacenas byte a byte la secuencia de 4 bytes que componen un DWord, claro que leídos por separado no equivalen al número que tenías al principio. Para recuperar el valor a partir de ea matriz de bytes, habría que invertir el proceso:

L := Aux[4];
L := (L shl 8) + Aux[5];
L := (L shl 8) + Aux[6];
L := (L shl 8) + Aux[7];

Si ahora consultas el valor de L, verás que equivale al del principio.

Todo depende de cómo se quiera codificar el valor, como dijiste que querías utilizar cuatro bytes para ese valor, lo interpreté así, byte a byte. Cuando tú lees ese valor, desde la ventana de Watches, por ejemplo, te aparecen los bytes por separado.

Por cierto a mi me salen los valores 63 - 4 - 124 - 247.

No sé si me he explicado bien.


La franja horaria es GMT +2. Ahora son las 14:36:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi