一个包含字符串的记录类型怎么声明?(50分)

  • 主题发起人 主题发起人 600666
  • 开始时间 开始时间
6

600666

Unregistered / Unconfirmed
GUEST, unregistred user!
这个记录有两个域,第一个是word型,第二个是个结尾为0的字符串。
如果这样写:
Taaa=packed record
x:word;
s:pchar;
end;
但是s却是指向字符串的指针,改成array of char也是指针,
当然array[0..10]of char是可以的。
我要求word后面直接跟不定长度的字符串该怎么声明?
推而广之:所有的数组直接写到记录中怎么声明?
 
Taaa=packed record
x:word;
s:string;
end;
????
 
type
tt=record
i:integer;
p1:pchar;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
t1.i:=10;
t1.p1:='abcdddddaaaffff';
memo1.Lines.Add(inttostr(t1.i));
memo1.Lines.Add(t1.p1);
end;
我刚式了这样是可以的,不知道楼主是啥意思
 
type
aa:array of pchar

Taa=record
x:word;
s:aa;
end;
 
我要的是这种效果,在内存中:
00450BD4 34 12 61 62 63 64 00 00 4.abcd..
上面是$1234后面跟一个'abcd'.而不是跟一个指针.
各位用cpu调试看看,地址用lea eax ,x找(x是记录名)
 
aa:array of pchar
这个要先set一下吧
setlength(aa,1000);
 
我提到了这种方法了;
现在问题简化一下,不用记录类型用其他类型也可以
 
楼主似乎没有好好分析自己的问题:
1、由于 string 类型的结构问题,不能直接将内存中的数据直接赋值给记录类型。问题的关键不在于采用何种类型,而是采用何种读写方式!现有的类型很难满足您的需要,除非您想用下面这个:
Taaa = packed record
x: Word;
s: array[0..MaxInt] of Char;
end;
2、另外令我十分费解的是,既然您的数据是在内存里,为何非要写到一个记录类型里?如果您只是读取内存中的数据,可以直接把指针指向那段内存;如果您想把内存中的数据复制到记录,可以用下面的办法:
Taaa = packed record
x: Word;
s: string;
end;
假设您内存中数据的首地址是 addr,那么可以这样给一个记录赋值:
var
t: Taaa;
p: PChar;
begin
t.x := PWord(addr)^;
p := addr + SizeOf(Word);
SetString(t.s, p, StrLen(p));
end;
3、另外楼主,您究竟是把内存中的数据写到记录中,还是想把记录中的数据写到内存中?您的问题似乎非常让人模糊的说。。。
 
用动态数组
或者指针(内存动态分配)+长度

解决紧挨着排放问题如下
你可以直接动态分配内存,用指针强制转换,比如:word+'hello'共8个字节
p:POINTER;
pW:PWORD;
pc:PCHAR;

你先分配8字节
GetMem(p, 8);
然后
pW := p;
pc := p+2;

通过指针来访问真实内容;
 
感谢vvyang的思考,说白了:
我是在考虑读写pe文件输入查询表的问题,看下面:
004020B0 80 00 45 78 69 74 50 72 6F 63 65 73 73 00 FD 00
 
To 600666:
类型的构造、读入的方法可以参考我的回贴。。。
至于写入,反过来就行了。。。
再重复一遍,您的问题跟采用什么类型根本没有任何关系!只跟读写方法有关!!
只要你给出查询表的地址,读出里面的东西根本不是什么问题,你干吗非要强调“什么什么类型”呢???
 
呵呵,读入写入其实都好办,拆开来分别读写就行。
看来delphi真的无法描述这个‘组合’
 
To 600666:
既然您知道如何读写,何苦非要这种“组合”呢?
 
后退
顶部