谁能看出为什么这段代码问题处在什么地方?(100分)

  • 主题发起人 主题发起人 zyf23
  • 开始时间 开始时间
Z

zyf23

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure Tcommmain.aaa(aa: variant);

interface

procedure Tcommmain.Button1Click(Sender: TObject);
var
aay :array of byte;
i:integer;
begin
setlength(aay ,6);
for i :=0 to 14 do //此处改为5时就不会有问题出现,我是说程序最后
begin
aay:=12
//为什么问题不再此处
end;
aaa(aay);
end;
procedure Tcommmain.aaa(aa: variant);
var
aad:array of byte;
i:integer;
begin
setlength(aad,10)
aad:=aa;
for i :=0 to 10 do //此处不为5也可以,不会提示出错
begin
showmessage(inttostr(i)+':'+inttostr(aad));
end;
end;


//提示时:无效的指针操作!

 
上面代码在D6下运行,没有提示错误啊
 
你的程序多处越界。
>for i :=0 to 10 do //此处不为5也可以,不会提示出错
改为:
for i:=0 to 9 do

> aay:=12
//为什么问题不再此处
你对申明范围以外的内存进行了改写。
 
这个有什么好讨论,有意义么?
非要让她越界么?
无聊!!!
[:(]
 
怎么看,我怎么只看到问题的标题,代码在哪里?
 
比如,每天你过马路的时候,看到绿灯再过马路,你一般是不会让过路的出租车撞到的,

你如果过马路闯红灯,就有可能会让车子撞到,当然,有几次可能不会撞到你,

但是不能保证每次都不撞到你呀。
 
其实,我想传递一个动态数组,又想在aaa这个函数中操作其中的数据(字节),
可能各位,没有切实的操作过串口,一位一位或字节的操作很烦的,我就想把这些做成函数,
这个时候就涉及到传递不知数目的数据,



//下面为什么又不能赋值
procedure Tcommmain.aaa(var aa: array of byte);
var
aad:array of byte;
a:array[0..10] of byte;
i:integer;
begin
setlength(aad,6);
aad:=aa
//出错,传递aa时,不带var就不会出错,为什么?怎样解决?
for i :=0 to 10 do
begin
showmessage(inttostr(i)+':'+inttostr(aad));
end;
end;
 
這樣:aad:=@aa;
 
for i:=low(aa) to High(aa) do begin

end;
这样写,就不会有问题了

procedure Tcommmain.Button1Click(Sender: TObject);
var
aay :array of byte;
i:integer;
begin
setlength(aay ,15)

for i:=low(aay) to High(aay) do begin
aay:=12;
end;
aaa(aay);
end;

procedure Tcommmain.aaa(aa: variant);
var
aad:array of byte;
i:integer;
begin
setlength(aad,aa.length);
aad:=aa;
for i:=low(aad) to High(aad) do begin
showmessage(inttostr(i)+':'+inttostr(aad));
end;
end
 
low ,high能判断出动态数组的上下界?

那指针的上下界能返回么?

还真没这样用过!
试试!
 
在D5下没出现://提示时:无效的指针操作 ?
但通过运行结果可以看出0--5 aad值是正确的 12,但是 6--10 的aad值是随机的。
你的数组越界太多啦,用多少就设多少嘛。



 
setlength(aay ,6);
已经设了界,而for i:=0 to 14 do
越界了,改为5没有越界,当然没问题了。
 
写是可以写入,只是你写到了别的变量的内存里面去了,所以别的变量给破坏了,所以出错的结果很古怪
 

Similar threads

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