我想创建一堆记录(RWell)并按特定顺序将它们存储在一个数组中.然后我想创建一个新的数组(不同的布局)并重新排列其中的记录.当然,我不想在RAM中复制数据,所以我在第二个数组中应该将指针放在第一个数组中的记录中.但是,我做不到.任何人都可以告诉我们下面的代码有什么问题?谢谢
Type
RWell= record
x: string;
i: integer;
end;
PWell= ^RWell;
RWellArray= Array[0..12, 0..8] of RWell;
procedure TClass1.CreateWells
var
WellMX: RWellArray;
begin
{ should I initialize the WellXM here? }
{ note: WellXM is a static array! }
other stuff
end;
var Wells: array of PWell;
procedure TClass2.AddWell(aWell: RWell);
begin
aWell.Stuff:= stuff; {aWell cannot be readonly because I need to change it here}
SetLength(Wells, Length(Wells)+ 1); { reserve memory }
Wells[High(Wells)]:= @aWell;
end;
procedure TClass3.DisplayWell;
var CurWell: RWell;
begin
CurWell:= CurPrimer.Wells[iCurWell]^; <--- AV here (but in debugger the address is correct)
end;
Run Code Online (Sandbox Code Playgroud)
由Rob K解决.
在您的AddWell函数中,您将按值传递记录.这意味着该函数获取实际参数的副本.您正在存储一个指向形参的指针,该参数可能只是该函数的本地堆栈上的一个位置.
如果你想要一个指向一个井的指针,那么将指针传递给一个井:
procedure AddWell(AWell: PWell);
begin
SetLength(Wells, Length(Wells) + 1);
Wells[High(Wells)] := AWell;
end;
Run Code Online (Sandbox Code Playgroud)
另一种选择是通过const值传递记录.对于记录,这意味着实际参数作为参考传递.指向形参的指针也是指向实际参数的指针:
procedure AddWell(const AWell: RWell);
begin
SetLength(Wells, Length(Wells) + 1);
Wells[High(Wells)] := @AWell;
end;
Run Code Online (Sandbox Code Playgroud)
不过,我不会真的依赖它.当你想要指针时,传递指针.有些人试图避免在他们的代码中使用指针,但他们没有什么可担心的.
| 归档时间: |
|
| 查看次数: |
3132 次 |
| 最近记录: |