【发布时间】:2021-04-15 16:26:11
【问题描述】:
我使用动态数组来存储密钥、像素和加密像素。该程序在第一次加密期间运行顺利,但在更改图片时,程序崩溃“模块'Project2.exe'中地址00401BF1的访问冲突。写入地址 00000001'。
我认为这是因为我将setLength 程序放在加载图片按钮中。这是我加载图片后使用的代码。注意:还有真彩色图片的代码,我需要将长度设置为大 3 倍setLength(image1.picture.height * image1.picture.width * 3)。但这是加载图片按钮中灰度图片的简单方法
SetLength(ppixels, image1.picture.height * image1.picture.width);
k := 0;
for i := 0 to Image1.picture.height-1 do
begin
PC := Image1.Picture.Bitmap.ScanLine[i];
for j := 0 to Image1.picture.width-1 do
begin
ppixels[k] := PC[j];
k := k + 1;
end;
end;
我试图用它来操纵它
if(Length(ppixels)<0) then setLength(ppixels, image1.picture.height * image1.picture.width);
这仅适用于像素较小的图片,这不是我正在寻找的解决方案。还尝试将长度设置得非常大,例如setLength(ppixels,100000000);,但它给了我错误“内存不足”。也试过setLength(ppixels,0)、ppixels := nil和Finalize(ppixels),但还是没有解决问题,仍然报错。
帮我解决这个问题,大师。非常感谢~
【问题讨论】:
-
地址 $00000000 附近的访问冲突通常意味着正在使用
nil指针。在这种情况下,地址 $00000001 意味着当数组为空时正在访问数组的第二个字节(索引 1)。动态数组在长度为 0 时是一个nil指针。动态数组的Length()永远不会为