Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-07-2003
ssaavedra ssaavedra is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina, La Boca
Posts: 16
Poder: 0
ssaavedra Va por buen camino
Unhappy 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.
Responder Con Cita
  #2  
Antiguo 03-07-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
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.
__________________
Guía de Estilo
Responder Con Cita
  #3  
Antiguo 04-07-2003
ssaavedra ssaavedra is offline
Miembro
 
Registrado: jul 2003
Ubicación: Argentina, La Boca
Posts: 16
Poder: 0
ssaavedra Va por buen camino
Unhappy

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
Responder Con Cita
  #4  
Antiguo 04-07-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
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.
__________________
Guía de Estilo
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:19:39.


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
Copyright 1996-2007 Club Delphi