PDA

Ver la Versión Completa : Convertir un Single en 4 char


cmurua71
14-06-2007, 10:25:17
Hola ! Tengo un problema que no sé como resolver, he intentado de cientos de formas sin exito.

Debo enviar por el puerto serie un Single, pero para enviarlo debo convertirlo en 4 caracteres (chars)

Seria lo contrario a lo que preguntaba en otro post:


http://www.clubdelphi.com/foros/showthread.php?t=30929

Me urge solucionar este tema, CUALQUIER ayuda urgente sera bienvenida

Desde ya muchisimas GRACIASS

Carlos

Mick
14-06-2007, 12:23:51
Hay varias formas de hacerlo, por ejemplo usando nuestros amigos los punteros:


var
ptr :PChar;
number:single;
c1,c2,c3,c4:char;
begin

number:= 13.34;
ptr:= @number;
c1:= ptr[0];
c2:= ptr[1];
c3:= ptr[2];
c4:= ptr[3];

// O Directamente sin variables intermedias
c1:= PChar(@number)[0];
c2:= PChar(@number)[1];
c3:= PChar(@number)[2];
c4:= PChar(@number)[3]

end;



Saludos

cmurua71
14-06-2007, 12:56:09
Hay varias formas de hacerlo, por ejemplo usando nuestros amigos los punteros:


var
ptr :PChar;
number:single;
c1,c2,c3,c4:char;
begin

number:= 13.34;
ptr:= @number;
c1:= ptr[0];
c2:= ptr[1];
c3:= ptr[2];
c4:= ptr[3];

// O Directamente sin variables intermedias
c1:= PChar(@number)[0];
c2:= PChar(@number)[1];
c3:= PChar(@number)[2];
c4:= PChar(@number)[3]

end;


Saludos

No me funciona así... me da el error ¨Array type required¨ en las 4 lineas c1:=ptr[0] y subsiguientes

y no se como solucionarlo

cmurua71
15-06-2007, 05:51:36
Hola... alguein que me tire una idea ??

seoane
15-06-2007, 11:25:26
Si te fijas un poco en el hilo anterior, yo creo que la solución es evidente.

En el hilo anterior convertíamos un String en PChar de la siguiente manera:

function StrToSingle(Str: String): Single;
begin
if length(Str) = 4 then
Result:= PSingle(@Str[1])^
else
Result:= 0;
end;


Asi que si aplicamos el paso inverso:

function SingleToStr(S: Single): String;
begin
// Creamos el espacio suficiente en memoria
Result:= StringOfChar(#0,4);
// Y aplicamos el paso inverso
PSingle(@Result[1])^:= S;
end;