gpt4 book ai didi

delphi - delphi按下按钮时堆栈溢出

转载 作者:行者123 更新时间:2023-12-03 15:50:01 24 4
gpt4 key购买 nike

我正在构建一个减少像素宽度的应用程序。
当我按下该应用程序的按钮两到三次时,会出现消息并显示堆栈溢出。

消息如下:
Popup Message


我的应用程序上的错误行
Error on application
这是我的代码:

procedure TForm1.cariThin();
var
baris_gbr, kolom_gbr, x, y, a, b, i, j, p1, p2, n : integer;
imgval : array [0..500,0..500] of integer;
mark : array [0..500,0..500] of integer;
nb : array [1..9] of integer;
hasdelete: boolean;
R, G, BL, AB : integer;
begin
Image3.Width := Image1.Width;
Image3.Height := Image1.Height;

baris_gbr := Image1.Picture.Height;
kolom_gbr := Image1.Picture.Width;


For kolom_gbr:= 0 To image1.Width - 1 Do
Begin
For baris_gbr:= 0 To image1.Height - 1 Do
Begin
R:= GetRValue(image1.Canvas.Pixels[kolom_gbr, baris_gbr]);
G:= GetGValue(image1.Canvas.Pixels[kolom_gbr, baris_gbr]);
BL:= GetBValue(image1.Canvas.Pixels[kolom_gbr, baris_gbr]);
AB:= (R + G + BL) Div 3;

if (AB > 200) then
begin
Image1.Canvas.Pixels[kolom_gbr, baris_gbr] := rgb(255,255,255);
end
else
begin
Image1.Canvas.Pixels[kolom_gbr, baris_gbr] := rgb(0,0,0);
end;
End;
End;

for y := 0 to baris_gbr-1 do
begin
for x := 0 to kolom_gbr-1 do
begin
if (Image1.canvas.pixels[x,y] = clBlack) then
begin
imgval[x,y] := 1;
end
else
begin
imgval[x,y] := 0;
end;
end;
end;

hasdelete := True;
while (hasdelete) do
begin
hasdelete := False;
for y := 0 to baris_gbr-1 do
begin
for x := 0 to kolom_gbr-1 do
begin
if (imgval[x,y] = 1) then
begin
for n:=1 to 8 do
begin
nb[n] := 0;
nb[1] := imgval[x,y];
nb[2] := imgval[x,y-1];
nb[3] := imgval[x+1,y-1];
nb[4] := imgval[x+1,y];
nb[5] := imgval[x+1,y+1];
nb[6] := imgval[x,y+1];
nb[7] := imgval[x-1,y+1];
nb[8] := imgval[x-1,y];
nb[9] := imgval[x-1,y-1];
a := 0;
end;

for i:= 2 to 8 do
begin
if ((nb[i] = 0) AND (nb[i+1] = 1)) then
begin
inc(a);
end;
end;

if ((nb[9] = 0) AND (nb[2] = 1)) then
begin
inc(a);
end;

b := nb[2] + nb[3] + nb[4] + nb[5] + nb[6] + nb[7] + nb[8] + nb[9];
p1 := nb[2] * nb[4] * nb[6];
p2 := nb[4] * nb[6] * nb[8];

if ((a = 1) AND ((b>=2) AND (b <= 6)) AND (p1 = 0) AND (p2 = 0)) then
begin
mark[x,y] := 0;
hasdelete := true;
end
else
begin
mark[x,y] := 1;
end
end
else
begin
mark[x,y] := 0;
end;
end;
end;

for y:=0 to baris_gbr-1 do
begin
for x:=0 to kolom_gbr-1 do
begin
imgval[x,y] := mark[x,y];
end;
end;
end;
end;

为什么我的应用程序总是显示溢出?有什么解决办法可以解决吗?或者我们可以异常处理程序吗?谢谢

编辑
现在我的应用程序说访问冲突。
Access Violation


此行引发错误:nb[7] := imgval[x-1,y+1];为什么会发生这样的事?

最佳答案

var
imgval : array [0..500,0..500] of integer;
mark : array [0..500,0..500] of integer;

这些变量位于堆栈上并且非常巨大。它们的大小为 501*501*4 = 1,004,004。默认堆栈大小为 1MB。这些大数组是堆栈溢出的原因。

您将需要使用动态分配的数组。或者避免存储包含每个像素信息的 2D 数组的需要,而是以较小的子 block 来处理图像。我不知道这是否可能,因为我不知道代码想要做什么。这就是你要锻炼的地方。

当然,使用动态分配数组的一个优点是您不需要像当前那样面临缓冲区溢出的挑战。如果图像的任一维度超过 501,则缓冲区溢出。我确实希望您在编译器选项中启用了范围检查。

for y := 0 to baris_gbr-1 do

for x := 0 to kolom_gbr-1 do

不可能是正确的。 baris_gbrkolom_gbr 变量未初始化,因为它们最近被用作循环变量。因此,除了打开范围检查之外,您还需要打开提示和警告,然后注意它们。

关于delphi - delphi按下按钮时堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26482045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com