求助 record 里的string问题 ( 积分: 50 )

  • 主题发起人 主题发起人 hitman007260
  • 开始时间 开始时间
H

hitman007260

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义一个record
type myrecord = record
chr: char;
int: Integer;
longstring: ansistring;
stringa: string[8];
stringb:string;
flg: Boolean;
end;
arrmyrecord= array[0.. 1024] of myrecord;
分别付值后
在程序中使用arrmyrecord数组
从数组中取出来的值
arrmyrecord[0].chr,arrmyrecord[0].int,arrmyrecord[0].stringa,arrmyrecord[0].flg都在
arrmyrecord[0].ansistring,arrmyrecord[0].string得值却不见了
这是为什马?如何解决?
 
贴出对应代码。
 
这是数据结构的基本问题, string,ansistring类型的变量不能用在Record中,而必须使用固定(已知)大小的字符串, 例如string[255];
道理很简单, 编译器必须固定record的大小;
 
把相应代码贴出来
 
那就是不能动态的设定字符串长度了???
 
用 pchar 试试呢?
 
pchar 如何动态申请内存 弄个例子看看?
 
不行么?我用D6可以啊
type myrecord = record
chr: char;
int: Integer;
longstring: ansistring;
stringa: string[8];
stringb:string;
flg: Boolean;
end;
arrmyrecord= array[0.. 1024] of myrecord;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
myarray:arrmyrecord;
begin
for i:=0 to 1024 do
begin
myarray.chr:='A';
myarray.int:=50;
myarray.longstring:='longstring';
myarray.stringa:='stringa';
myarray.stringb:='stringb';
myarray.flg:=True;
end;
// for i:=0 to 1024 do
// begin
// Memo1.Lines.Add(myarray.chr+IntToStr(myarray.int)+
// myarray.longstring+myarray.stringa+myarray.stringb+BoolToStr(myarray.flg));
// end;{全部打印}
Memo1.Lines.Add(myarray[0].chr+#1+IntToStr(myarray[0].int)+#1+
myarray[0].longstring+#1+myarray[0].stringa+#1+myarray[0].stringb+#1+BoolToStr(myarray[0].flg));
 
不行么?我用D6可以啊
type myrecord = record
chr: char;
int: Integer;
longstring: ansistring;
stringa: string[8];
stringb:string;
flg: Boolean;
end;
arrmyrecord= array[0.. 1024] of myrecord;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
myarray:arrmyrecord;
begin
for i:=0 to 1024 do
begin
myarray.chr:='A';
myarray.int:=50;
myarray.longstring:='longstring';
myarray.stringa:='stringa';
myarray.stringb:='stringb';
myarray.flg:=True;
end;
Memo1.Lines.Add(myarray[0].chr+#1+IntToStr(myarray[0].int)+#1+
myarray[0].longstring+#1+myarray[0].stringa+#1+myarray[0].stringb+#1+BoolToStr(myarray[0].flg));
 
不行么?我用D6可以啊
type myrecord = record
chr: char;
int: Integer;
longstring: ansistring;
stringa: string[8];
stringb:string;
flg: Boolean;
end;
arrmyrecord= array[0.. 1024] of myrecord;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i:Integer;
myarray:arrmyrecord;
begin
for i:=0 to 1024 do
begin
myarray.chr:='A';
myarray.int:=50;
myarray.longstring:='longstring';
myarray.stringa:='stringa';
myarray.stringb:='stringb';
myarray.flg:=True;
end;
Memo1.Lines.Add(myarray[0].chr+IntToStr(myarray[0].int)+
myarray[0].longstring+myarray[0].stringa+myarray[0].stringb+BoolToStr(myarray[0].flg));
 
晕倒,第一次发帖,看到他提示错误以为没发出去:(,反而发了这么多,不好意思,怎么删帖呢?
 
刚付完值有
运行一下旧没了
 
[:(]不懂你的意思啊,能把你的代码帖出来么?什么叫“运行一下旧没了”,你的意思是系统自动回收么?
 
“这是数据结构的基本问题, string,ansistring类型的变量不能用在Record中,而必须使用固定(已知)大小的字符串, 例如string[255];
道理很简单, 编译器必须固定record的大小
”这句话我觉得好奇怪啊,string默认是ansistring,这不是指针么?怎么说编译器不知道它的大小呢?他哪个记录大小是32啊。疑惑中,关注ing。。。。。
 
anthony634问得很好, 不过你用心想一想, 一个记录(保存一个数据结构的空间)的大小32字节, 怎么能保存长度不定(可能大于32个字节)的数据呢?
// 所以说在记录结构中不要使用string类型, 而要使用string[xx]固定长度格式;
//如果一定要使用可变长度的字符串, 必须用指针操作(要有内存申请、清除等操作), 比较麻烦一些, 但也不难;
 
TMyRecord = record
AStr: string;
AInt: Integer;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
aRecord: TMyRecord;
begin
SetLength(aRecord.AStr, 10);
aRecord.AInt := 1;
end;

Button1Click结束时调用了System.pas中的
procedure _LStrClr(var S);
清空结构中的AStr分配的空间
 
以前没注意过这个问题 record中加string也没出现过问题
但听各位这么一说 我在现在的项目中都不敢直接用string了 都加了长度
 
我天生就爱在record加string,大家不要用PChar,用了以后要改在delphi.net下,你就烦了。
 
type myrecord = record
[red] chr: char;
int: Integer;
longstring: ansistring;
stringa: string;
stringb:string;
flg: Boolean;[/red]
end;
在上面定义的过程中,不要使用DELPHI里的保留字。

用下面的试一试。
type myrecord = record
_chr: char;
_int: Integer;
_longstring: ansistring;
_stringa: string;
_stringb:string;
_flg: Boolean;
end;
 
以上全部都错!!!!!!!

应该是
type myrecord = packed record

注意不能少Packed这个字!!!!!
只有在Packed里面才能完全保证能按你保证的顺序和size来完完整整的还原到array char~

你sizeof一下record和PackedRecord就知道了
record里面所谓的内容都是一个地址~Pointer的指向,有利提高速度(不过都core年代了..这个嘛...) 所以不能直接copymemory @xxx来返回完整的内容
PackedRecord里面的东西就是真正的值了。。在编译器里面是 mov eax,ebp+8

record并不能直接用PChar等强制类型转换
但是Packed Record是能保证强制转换到你需要的buf的

还有string不能直接声明在packed record里面~只能用完全兼容array char的
string[xxx]形势。因为record可以是动态的长度(内容只是指针嘛~) 而Packed可以说是一个实际意义上的Array~
 
后退
顶部