高分!!!请教指针、数组高手!!(300分)

  • 主题发起人 主题发起人 wsllb
  • 开始时间 开始时间
W

wsllb

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了三个record,叫做P1,P2,P3
同时,定义P1^.q1为P2,而且,定义P2^.q2为Array of P3,
现在,我的所有数据全部寄存在另外一个指针P4里面,P4为一个TTreeNode.Data,
在找地址时,P1、P2都能得到,但却老是找不到P3的地址,搞的我晕头转向的,
请各位大侠帮帮忙!!!

下面是简短的描述:
New(P1);
TTreeView.AddChildNode(Node,string,P1);
New(P2);
P1(Node.Data)^.q1:=P2
q2 := nil
....
 
p1,p2,p3是记录,如何能用New()呢?!
new()的参数是指针变量。
可以这样:
Var
p11: ^p1;
p21: ^p2;
P31: ^p3;
 
对,我刚才写错了,应该是
P3=^Tzzz
Tzzz=record
..:...;
..:...;

P2=^Tyyy
Tyyy=record
..:...;
..:...;
q2:Array of P3;

P1=^Txxx
Txxx=record
..:...;
..:...;
q1:P2;

然后,New(P1);New(P2);
TTreeView.AddChildNode(Node,string,P1)

P1(Node.Data)^.q1:=P2;
.......
 
P1、P2都是类型啊,类型也可以new吗?
 
>>P1、P2都能得到,但却老是找不到P3的地址
但是你却不把P3的赋值过程写出来。让我们猜呀?:-)
也就是一个指针型类的动态数组.应该是没有问题的.
你不会是没有给动态数组分配内存吧?
我想应该是你操作动态数组时有错误.
 
不好意思,昨晚昏了头,现将一部分相关程序录下:
type
P1 = ^TS1
TS1 = record
i1: string
i2: integer
i3: string
i4: string
i5: string
end


P2 = ^TS2
TS2 = record
j1: integer
j2: string
j3: string
j4: integer
j5: string

j6: Array of P1;
end

P3 = ^TS3;
TS3 = record
k1: integer;
k2: integer;
k3: integer;
k4: integer;
k5: integer;
k6: PInstance
end;

然后,New(P3);New(P2);
TTreeView.AddChildNode(Node,string,P3);
P3^.k1 := ..;
P3^.k2 := ..;
...
P3^.k6 := P2;

P2(P3(Node.Data)^.k6)^.j1 := ..
P2(P3(Node.Data)^.k6)^.j2 := ..
...
P2(P3(Node.Data)^.k6)^.j6 := nil
setlength(P2(P3(Node.Data)^.k6)^.j6,length(P2(P3(Node.Data)^.k6)^.j6));

for i:=0 to length(P2(P3(Node.Data)^.k6)^.j6) do
P1(P2(P3(Node.Data)^.k6)^.j6^.i1 := ...;
P1(P2(P3(Node.Data)^.k6)^.j6^.i2 := ...;
....

很有可能是像wheel大侠所说的动态指针树组的赋值出现了问题,但是我却不知道怎么做

 
我可不是大侠,希望有一天可以做大侠[:P]

怎么看你的代码我也昏了呀。好象有很多错误吧.
>> k6: PInstance
这个PInstance是什么东东?你自己定义的?直接用Pointer吧.
>>TTreeView.AddChildNode(Node,string,P3);
应该是用TTreeView的对象实例,而且应该是用Items.AddChildNodeObject吧.
>>P2(P3(Node.Data)^.k6)^.j6 := nil
>>setlength(P2(P3(Node.Data)^.k6)^.j6,length(P2(P3(Node.Data)^.k6)^.j6));
SetLength时又用Length(j6)作长度,不是等于没写吗?结果j6的长度还是零.

>>for i:=0 to length(P2(P3(Node.Data)^.k6)^.j6) do
>> P1(P2(P3(Node.Data)^.k6)^.j6^.i1 := ...;
>> P1(P2(P3(Node.Data)^.k6)^.j6^.i2 := ...;
在这里的肯定应该会触发异常的,因为你的length(j6)结果为0,会执行一次.
而你居然直接P1.i1:=....,这个时候P1还没创建呢,应该先New(P2.j6),然后P1.i1:=...

而且你里面P1,P2,P3一会作类型用,一会儿做类型用,虽然大家能看懂.但是看起来觉得很乱.
或许正因为这个导致你虽然出了300分但是却没几个人回帖,希望你下次注意。[:)]
 
这个问题我已经解决,谢谢大家!
都怪我没有把问题写清楚。
 
后退
顶部