一个小问题: 记录(16分)

出鬼了!
怎么我这里就是出错呢?
我执行到 Edit1.Text := FloatToStr(A2[0].B[0])
时,就报错:
Access violation at address 0045D653 in module 'Project1.exe'.
Read of address 00000000.
这是为什么呢?

下面是我的代码:
procedure TForm1.Button1Click(Sender: TObject);
type
TADouble = array of Double;
TA = record
B: TADouble;
C: Integer;
end;

var
D1: TADouble;
A1, A2: array of TA;
begin
SetLength(D1, 2);
D1[0] := 1.1;
D1[1] := 1.2;

SetLength(A1, 1)
//这里设置为1,就是会报错
A1[0].B := @D1[0];
A1[0].C := 1;

A2 := Copy(A1, Low(A1), High(A1))
//复制A1-->A2
Edit1.Text := FloatToStr(A2[0].B[0])
//执行到这里报错!!!错误信息见下面
Edit2.Text := FloatToStr(A2[0].B[1])
//
end;

错误:
Access violation at address 0045D653 in module 'Project1.exe'.
Read of address 00000000.
 
我强烈建议你加分!!这么多人都在想这个问题 你是不是应该加点分啊???
 
cwmdelpher:
我实在没有分了,前几天我问了一个问题,我给了200分,我实在没有办法呀!
还有很多问题呢,我现在的可用分就剩下70,要不我加 19 分如何?
顺便问你一下,怎么增加这个帖子的分?
 
现在, 我暂且把那里的维数设置为大于1的数,我用 Copy 复制了
动态数组,因为,这个动态数组里的元素是一个记录类型,而这个记录
内部有又有一个动态数组的域,所以,复制时,也是把这个动态数组的
域的地址复制过去了,增加了一个引用,并没有真正的复制一个记录,
我想,应该复制内存才行,可是我没有作过,谁教教我?
 
算了 我也是刚刚问了一个问题 给了别人500分 心疼啊!!!
 
是专门开贴子给的 真是心疼!!!
 
cwmdelpher:
原来你在线啊,你有没有空,帮我想想这个问题吧 !
 
现在有事 有空我看看吧!再说了 有些东西我也不一定会的!!不过我感觉你的基础知识
还是不错的!!!
 
A2 := Copy(A1, Low(A1), Length(A1))
//复制A1-->A2
我的代码这行和你的不一样。你注意了没有!!!???
你的是不对的
 
是啊,
刚刚发现 !正想说呢,哈哈 !
现在帮我看看复制这个记录好不好?
 
刚才又去测试了一下,
type
TADouble = array of Double;
TA = record
B: TADouble;
C: Integer;
end;

var
D1: TADouble;
A1, A2: array of TA;
begin
SetLength(D1, 2);
D1[0] := 1.1;
D1[1] := 1.2;
SetLength(A1, 2)

A1[0].B := @D1[0];
A1[0].C := 1;
A2 := Copy(A1, Low(A1), Length(A1))
//复制A1-->A2
end;

因为里面的元素B也是一个动态数组,那么,这样复制时,C是可以真正复制的,
而对于B,只是复制了一个指针,它所指向的内容并没有复制,
因此,对A1[0].B的操作,会影响到A2[0].B,不知道理论上可不可以进行“真正的复制”
因为,我就是有这种需要,如果不行,我用最原始的办法,重新new一个了。
大家再帮我看看吧!
 
可以了,
现在实在是穷疯了,分虽然不多,也请各位笑纳,
谢谢大家 !
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
967
SUNSTONE的Delphi笔记
S
顶部