如何将表示金字塔的数组传入自定义过程以执行后续操作
解决GraphABC中金字塔数组传递与复制的问题
现有代码的核心问题
- 数组索引错误:动态数组默认是0起始索引,但你用
i := 1 to Length(arr)遍历,会导致越界(比如SetLength(arr,4)时,有效索引是0-3,i=4会访问不存在的元素)。 DrawPyramid灵活性不足:固定使用clRed绘制,未充分利用数组传递的优势实现复用。- 未封装金字塔数据:主程序中混合了数组赋值与绘制逻辑,不利于后续复制、修改操作。
修正后的实现方案
1. 优化DrawPyramid过程
增加颜色参数,并使用Low(arr)和High(arr)安全遍历数组:
uses GraphABC; var x, y: integer; procedure kv(x, y: integer; color: TColor); begin Rectangle(x, y, x + 20, y - 50); FloodFill(x + 10, y - 10, color); end; // 优化后的绘制过程:支持自定义颜色,安全遍历数组 procedure DrawPyramid(arr: array of array [1..2] of integer; color: TColor); begin for var i := Low(arr) to High(arr) do begin kv(arr[i][1], arr[i][2], color); end; end;
2. 构造与传递金字塔数组
将金字塔的坐标数组单独构造,再传递给DrawPyramid:
var pyramidSmall: array of array [1..2] of integer; // 小金字塔(3个块) pyramidLarge: array of array [1..2] of integer; // 大金字塔(5个块) begin SetPenColor(clBlack); kv(40, 50, clGreen); // 构造小金字塔数组 x := 80; y := 100; SetLength(pyramidSmall, 3); for var i := 0 to 2 do begin pyramidSmall[i][1] := x - 20 * (i+1); pyramidSmall[i][2] := y; end; DrawPyramid(pyramidSmall, clOrange); // 传递数组并绘制 // 构造大金字塔数组 x := 120; y := 150; SetLength(pyramidLarge, 5); for var i := 0 to 4 do begin pyramidLarge[i][1] := x - 20 * (i+1); pyramidLarge[i][2] := y; end; DrawPyramid(pyramidLarge, clRed); // 传递数组并绘制
3. 实现金字塔复制
通过复制原数组的坐标并添加偏移量,实现同一金字塔在新位置绘制:
var pyramidSmallCopy: array of array [1..2] of integer; begin // 复制小金字塔,x坐标偏移+100(向右移动) SetLength(pyramidSmallCopy, Length(pyramidSmall)); for var i := Low(pyramidSmall) to High(pyramidSmall) do begin pyramidSmallCopy[i][1] := pyramidSmall[i][1] + 100; pyramidSmallCopy[i][2] := pyramidSmall[i][2]; end; DrawPyramid(pyramidSmallCopy, clBlue); // 绘制复制后的金字塔 end.
关键说明
- 数组兼容性:动态数组
array of array [1..2] of integer可以直接传递给开放数组参数array of array [1..2] of integer,类型完全匹配。 - 索引安全:用
Low(arr)和High(arr)遍历数组,无需手动计算长度,避免索引越界问题。 - 复用性:分离数组构造与绘制逻辑后,修改金字塔结构、复制或重新绘制都只需操作数组,无需重复编写绘制代码。
内容的提问来源于stack exchange,提问作者intelligent
相关产品推荐
相关产品推荐

