DELPHI 自定义数组操作 内存错误 求助
procedureTForm1.spcommReceiveData(Sender:TObject;Buffer:Pointer;BufferLength:Word);//...
procedure TForm1.spcommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word); //这是读串口数据控件中的数据到达方法
var
rbuf:array of word;
temp:Integer;
begin
if BufferLength mod 2<>0 then
begin
Exit;
end;
SetLength(rbuf,temp);
move(buffer^,rbuf,4);
for temp:=1 to (BufferLength div 2)-1 do
begin
showmessage(inttostr(rbuf[temp])); //内存错误在这行,就是对自定义数组的调用
end;
end; 展开
BufferLength: Word); //这是读串口数据控件中的数据到达方法
var
rbuf:array of word;
temp:Integer;
begin
if BufferLength mod 2<>0 then
begin
Exit;
end;
SetLength(rbuf,temp);
move(buffer^,rbuf,4);
for temp:=1 to (BufferLength div 2)-1 do
begin
showmessage(inttostr(rbuf[temp])); //内存错误在这行,就是对自定义数组的调用
end;
end; 展开
4个回答
展开全部
1、SetLength(rbuf, temp);有问题,temp没有被初始化,而它被临时构建在堆栈上,将是随机数(倒不是默认为0,称为“你不确知的数儿”更好理解),如果恰好数儿很大,超过了内存限制,则执行该句就会报内存不足错误,如果恰好是0,则必在后面的数组遍历中报内存访问错误;猜测程序意图,应该是SetLength(rbuf,BufferLength div 2);
2、rbuf的定义是动态数组,动态数组的下标从0开始,下面的for temp := 1 to...的写法并未遍历数组所有元素,虽不是导致内存错误的原因,但估计是逻辑失当。
3、move(buffer^,rbuf,4);这句也有疑问,猜测程序逻辑,应该是move(buffer^,rbuf,BufferLength);,还有,可读性稍差,最好写成move(buffer^,rbuf[0],BufferLength);
4、if BufferLength mod 2<> 0 then这句并不全面,当BufferLength就是0,也能继续执行,当毫无疑问,继续执行没有意义,所以应当追加一个条件,即if ( BufferLength mod 2 <> 0 ) or ( BufferLength = 0 ) then
2、rbuf的定义是动态数组,动态数组的下标从0开始,下面的for temp := 1 to...的写法并未遍历数组所有元素,虽不是导致内存错误的原因,但估计是逻辑失当。
3、move(buffer^,rbuf,4);这句也有疑问,猜测程序逻辑,应该是move(buffer^,rbuf,BufferLength);,还有,可读性稍差,最好写成move(buffer^,rbuf[0],BufferLength);
4、if BufferLength mod 2<> 0 then这句并不全面,当BufferLength就是0,也能继续执行,当毫无疑问,继续执行没有意义,所以应当追加一个条件,即if ( BufferLength mod 2 <> 0 ) or ( BufferLength = 0 ) then
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
showmessage(inttostr(rbuf[temp]));
temp 没有初始化,溢出了。
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
READData:string;
begin
setlength(READData,bufferlength);
move(Buffer^,pchar(READData)^,bufferlength);
showmessage(READData);
temp 没有初始化,溢出了。
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
READData:string;
begin
setlength(READData,bufferlength);
move(Buffer^,pchar(READData)^,bufferlength);
showmessage(READData);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
SetLength(rbuf,temp);
执行这句的时候temp还没有初始化,默认是0.所以你的数组长度是0.
后面执行任何读取操作都会溢出
执行这句的时候temp还没有初始化,默认是0.所以你的数组长度是0.
后面执行任何读取操作都会溢出
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
SetLength(rbuf,temp);//这里的temp是多少。。。并不知道可能默认就是0
move函数是怎么用我不了解,,你看一下是不是这里的问题
move函数是怎么用我不了解,,你看一下是不是这里的问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询