gpt4 book ai didi

arrays - 动态数组与静态数组有何不同?

转载 作者:行者123 更新时间:2023-12-03 01:36:07 25 4
gpt4 key购买 nike

我正在尝试使用 GDI 绘制多边形。此代码有效:

type
TPolygon: Array[0..2] of TPoint;

var
ACanvas: TGPGraphics;
MyBrush: TGPLinearGradientBrush;

...

procedure DrawPolygon;
var
Polygon: TPolygon;
begin
Polygon[0].X := 1;
Polygon[0].Y := 5;
Polygon[1].X := 10;
Polygon[1].Y := 15;
Polygon[2].X := 1;
Polygon[2].Y := 5;

ACanvas.FillPolygon(MyBrush, PGPPoint(@Polygon), length(Polygon));
end;

...

此代码会产生 GDI 值溢出错误:

type
TPolygon: Array of TPoint;

var
ACanvas: TGPGraphics;
MyBrush: TGPLinearGradientBrush;

...

procedure DrawPolygon;
var
Polygon: TPolygon;
begin
SetLength(Polygon, 3);

Polygon[0].X := 1;
Polygon[0].Y := 5;
Polygon[1].X := 10;
Polygon[1].Y := 15;
Polygon[2].X := 1;
Polygon[2].Y := 5;

ACanvas.FillPolygon(MyBrush, PGPPoint(@Polygon), length(Polygon));
end;

...

唯一的区别是一个点数组是动态的,另一个是静态的。显然底层内存值是不同的,但具体是怎样的呢?

最佳答案

您的代码无效。 (首先,TCanvas 中没有 FillPolygon,其次,多边形至少需要三个顶点。此外,还存在一些语法错误,例如,在const 声明。)我建议使用示例

Polygon[0].X := 1;
Polygon[0].Y := 1;
Polygon[1].X := 1;
Polygon[1].Y := 100;
Polygon[2].X := 100;
Polygon[2].Y := 1;

这是一个漂亮的三角形。无论如何,同时

Windows.Polygon(Canvas.Handle, Polygon, 3)

适用于静态数组,你必须这样做

Windows.Polygon(Canvas.Handle, Polygon[0], 3)

对于动态数组。原因是静态数组“就地”存储在内存中,即直接存储在@Polygon中,就像数字一样(例如cardinal )被存储,或者一个ShortString,或者这样简单类型的记录。相反,如果Polygon是一个动态数组,那么它实际上是一个指向实际的、可变长度的数据的指针(与普通变量的方式非常相似 -长度字符串有效)。也就是说,在 @Polygon 处,您只有一个指针,即 NativeUInt。实际数据从这个新地址开始,您可以通过编写 @Polygon[0] 来获取该地址。

关于arrays - 动态数组与静态数组有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13398083/

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