怎么办(100分)

  • 主题发起人 主题发起人 ideafrog
  • 开始时间 开始时间
I

ideafrog

Unregistered / Unconfirmed
GUEST, unregistred user!
我错在哪里了?
type
PTest =^Test;
test =Record
t1: integer;
t2: char;
end
//结构定义
procedure TForm1.Button1Click(Sender: TObject);
var
iTest: array[0..9] of Ptest
i: integer;
begin
for i :=0 to 9 do
begin
iTest^.t1 :=i
//这里就错了
iTest^.t2 :=char(i);
end;
showmessage(intToStr(iTest[1]^.t1));
end;
 
for i :=0 to 9 do
begin
[blue] new(iTest);[/blue]
iTest^.t1 :=i
//这里就错了
iTest^.t2 :=char(i);
end;
 
^iTest.t1 :=i
 
for i :=0 to 9 do
begin
new(iTest)
//分配
iTest^.t1 :=i
//这里就错了
iTest.t2 :=char(i);
end;
showmessage(intToStr(iTest[1]^.t1));
 
使用前应该先分派内存。
 
没有分配变量。
 
谢谢大家
new 了之后它自己会释放吗?
还有另外一个问题:
var
ipTest: Ptest;
begin
 ...接上
ipTest:=iTest[1]+Sizeof(test);  //为什么不能这样进行
showmessage(IntToStr(ipTest^.t1));


 
与new对应的是Dispose,一般要调用它来释放
 
我看不懂
 
调用NEW分配内存,使用完后一定要用Dispose来释放。
 
{解答一}
//================================================
procedure TForm1.Button1Click(Sender: TObject);
var
iTest: array[0..9] of test
i: integer;
begin
for i :=0 to 9 do
begin
iTest.t1 :=i
//这里就错了
iTest.t2 :=char(i);
end;
showmessage(intToStr(iTest[1].t1));
end;
{解答二}
//=============================================
procedure TForm1.Button1Click(Sender: TObject);
var
iTest: array[0..9] of Ptest
i: integer;
begin
for i :=0 to 9 do
begin
getMem(iTest,sizeof(test));
iTest^.t1 :=i
//这里就错了
iTest^.t2 :=char(i);
end;
showmessage(intToStr(iTest[1]^.t1));
for i :=0 to 9 do
begin
freemem(iTest);
end;
end;
 
ipTest:=iTest[1]+Sizeof(test);  //为什么不能这样进行
showmessage(IntToStr(ipTest^.t1));

我想让iptest 指向iTest[2]
 
呵呵,你将C的语法搬到PASCAL中来了。
通过FOR 的GETMEM不一定会取得连续存放的内存块,你的做法已经错了。
更改为这样:
iTest : ptest;//iTest: array[0..9] of Ptest
ipTest : ptest;
getMem(ipTest,sizeof(test)*10);
用inc重新指向。不过,不要使用sizeof。
 
先分配内存
 
// if assigned(ipTest) then
// ipTest :=nil;
dec(ipTest,sizeof(test));
freeMem(ipTest);
//================================看看这个
var
iTest : Ptest;//iTest: array[0..9] of Ptest
ipTest : ptest;
i: integer;
begin
getMem(ipTest,sizeof(test)*10);

iTest := ipTest;
for i :=0 to 9 do
begin
iTest^.t1 := i;
iTest^.t2 := char(i);
inc(iTest)
end;

iTest := ipTest;
showmessage(intToStr(iTest^.t1));
inc(iTest,6);
showmessage(IntToStr(iTest^.t1));

freemem(ipTest);
end;
 
在大家的帮助下,差不多可以结束了,下面是完整的:
type
PTest =^Test;
test =Record
t1: integer;
t2: char;
end
//结构定义
procedure TForm1.Button1Click(Sender: TObject);
var
iTest: array[0..9] of Ptest
ipTest: Ptest;
i: integer;
begin
getmem(ipTest,sizeof(iTest));
for i :=0 to 9 do
begin
ipTest.t1 :=i;
ipTest.t2 :=char(i);
iTest :=ipTest;
inc(ipTest);
end;
ipTest:=iTest[0];
inc(ipTest);
showmessage(IntToStr(ipTest^.t1));
dec(ipTest)
freemem(ipTest,size(iTest));
end;
不知道,对其他像我这样的人有没有帮助,先列出来先

接下去的问题有点麻烦,就是分配分数的,等我吃饭后在考虑
 
to 影子:不是一般的想谢谢你,我又在你的提醒下改了一下
 我是第一次提问题,没想到给了怎么多的分,先在好后悔哦,不过分还是想多给你一点
 我自己只剩下100了
1) 还是用数组,因为这样估计便于使用。
2) 直接用freemem(ipTest),总觉得释放的不干净
3) 给你60分行不行,其他人总要点的
 
多人接受答案了。
 
后退
顶部