以下代码可以实现用4个char表示一个浮点数,可惜是C代码,谁能帮我翻译成pasical?(50分)

  • 主题发起人 主题发起人 chenzy89
  • 开始时间 开始时间
C

chenzy89

Unregistered / Unconfirmed
GUEST, unregistred user!
以下代码可以实现用4个char表示一个浮点数,可惜是C代码,谁能帮我翻译成pasical?

float chrtodg(char a,char b,char c,char d)
{
char rawbytes[]= { a, b, c,d };
int tmpInt ;
float tmpFloat ;
tmpInt = *( ( int * ) rawbytes ) ;
tmpInt = ntohl( tmpInt ) ;
tmpFloat = *( ( float * )& tmpInt ) ;
float LastValue = tmpFloat * 180.0 / 3.14159 ;

return LastValue;

}
 
花了我大半天的时间,终于搞了出来,大家看看如何,看点意见。
此函数非常有用,可以用4个字符表示一个浮点数。在网络数据传输中常用得上。

function ChrToReal(a,b,c,d: char): single;
var
aa: array[0..3] of char;
tmps: ^single;
tmpi: integer;
begin
aa[0] := a;
aa[1] := b;
aa[2] := c;
aa[3] := d;
tmpi := integer(aa);
tmpi := ntohl(tmpi);
tmps := @tmpi;
result := Tmps^;
//tmps := nil;
end;

function RealToChr(areal: single):pchar;
var
aa: array[0..4] of char;
tmpi: ^integer;
begin
tmpi := @areal;
tmpi^ := htonl(tmpi^);

aa[0] := pchar(tmpi)^;
aa[1] := (pchar(tmpi)+1)^;
aa[2] := (pchar(tmpi)+2)^;
aa[3] := (pchar(tmpi)+3)^;
aa[4] := #0;
result := aa;
end;
 
Single本身就是大小为4个字节的,当然可以和长度为4的Char数组对等,没什么啊。

你的 function RealToChr(areal: single):pchar
函数将函数内部定义的数组地址作为
返回值传了出来——是不是不大妥当啊?(局部变量只在局部有效,一旦脱离有效范围,信
息就不可预测了)
另:用Move函数可以更方便的一次性赋值,代码中的htonl似乎是多余的啊——无论是否
进行高低位的转换,都可以正确的完成Single<->char[4]的变换的。
 
creation-zy:
用move的办法很好,谢谢了!另外有个问题想问下你,function RealToChr(areal: single):pchar;我将函数内部定义的数组地址作为返回值传了出来,这样做法确实有些不妥。你有什么好办法可以告诉我吗?
 
函数内部定义的定长数组应该是存放在栈里的,一旦函数运行完毕,就会变成自由空间。
试想一下——如果运行后没有释放,那么运行该函数1000000次将会造成多大的内存占用?
而事实上,带有定长数组的函数我们都可以无限的调用而不会有任何内存泄漏。
 
后退
顶部