record与字符串转换(100分)

  • 主题发起人 主题发起人 zhanggang73
  • 开始时间 开始时间
Z

zhanggang73

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(!]
以下:
prec=^rec;
rec=record
i:longword;
a:string;
end;
用:
tmp:pchar;
tmp=#0#1'abc';
将rec指针指向tmp(学vc中得做法),却得到:
rec.i=256
//?????
rec.a='abc';
居然高低位顺序颠倒,请问有无良策?谢谢!
 
这是intel的寻址结构决定的,你用tmp:=#1#0'abc';不就行了?
 
谢谢!
[:(]问题是我想把一个字符串直接映射到record上,而字符串已经定义成以上形式。
 
那就prec^.i:=swap(prec^.i);吧。
 
1. 你的定义和赋值是不对的:

prec=^rec;
rec=record
i:longword;
a:string
// 没有分配内存,容易造成操作系统访问不存在的地址
end;

应该为:

prec=^rec;
rec=record
i:longword;
a:string[255]
// 分配足够用
end;

2. 赋值应该是
a. i为4字节,记住顺序为:
低字的低字节,低字的高字节,高字的低字节,高字的高字节
顺序是反的!
b. 字符串a是以串长度开始的,结构为:
长度: Byte;
内容: 其他字节

3. 给你个例子:
Procedure Demo;
type
prec=^rec;
rec=record
i:longword;
a:string[255]
// 分配足够用
end;
var
p:prec;
tmp:pchar;
begin
tmp:=#1#0#0#0#3'abcde';
{ 头4个#1#0#0#0为 i的值, #3为字符串长度, abcde为内容 }
p:=prec(tmp);
showmessage(inttostr(p.i))
// 结果为1
showmessage(p.a)
// 结果是abc不是abcde因为长度为#3 !
end;

 
1. 你的定义和赋值是不对的:

a:string
// 没有分配内存,容易造成操作系统访问不存在的地址
应该为:
a:string[255]
// 分配足够用

2. 赋值应该是:
a. i为4字节,记住顺序为:
低字的低字节,低字的高字节,高字的低字节,高字的高字节
顺序是反的!
b. 字符串a是以串长度开始的,结构为:
长度: Byte;
内容: 其他字节

3. 给你个例子:
Procedure Demo;
type
prec=^rec;
rec=record
i:longword;
a:string[255]
// 分配足够用
end;
var
p:prec;
tmp:pchar;
begin
tmp:=#1#0#0#0#3'abcde';
{ 头4个#1#0#0#0为 i的值, #3为字符串长度, abcde为内容 }
p:=prec(tmp);
showmessage(inttostr(p.i))
// 结果为1
showmessage(p.a)
// 结果是abc不是abcde因为长度为#3 !
end;
 
哦,gold,发了两遍
 
哇!多年了才得到通知!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
898
import
I
后退
顶部