数组(指向记录的指针)

时间:2009-09-08 19:01:47

标签: delphi

我想创建一堆记录(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;

由Rob K解决。

1 个答案:

答案 0 :(得分:6)

AddWell函数中,您按值传递记录。这意味着该函数获取实际参数的副本。您正在存储一个指向形参的指针,该参数可能只是该函数的本地堆栈上的一个位置。

如果你想要一个指向井的指针,那么将一个指针传递给一个井:

procedure AddWell(AWell: PWell);
begin
  SetLength(Wells, Length(Wells) + 1);
  Wells[High(Wells)] := AWell;
end;

另一种选择是通过 const value 传递记录。对于记录,这意味着实际参数作为参考传递。指向形参的指针也是指向实际参数的指针:

procedure AddWell(const AWell: RWell);
begin
  SetLength(Wells, Length(Wells) + 1);
  Wells[High(Wells)] := @AWell;
end;
但是,我不会真的依赖它。当你想要指针时,传递指针。有些人试图避免在他们的代码中使用指针,但他们没什么好害怕的。