【问题标题】:Initial Array of pointer to pointer in DelphiDelphi中指向指针的初始数组
【发布时间】:2013-08-15 04:33:32
【问题描述】:

我如何初始化此代码?

type
  PPNode = ^PNode;
  PNode  = ^Node;
  CNode = array of PPNode;

  Node = record
    key: Integer;
    next: PNode;
    prev: PNode;
  end;

我用这种方式:

function TForm1.chained_hash_init(n: Integer): CNode;
var
  A: Cnode;
begin
  ...
  SetLength(A, N);
  Result := A;
  ...
end;

但我在内存中有错误对于此访问:

procedure TForm1.btn1Click(Sender: TObject);
var
  pcnArr: CNode;
begin    
  SetLength(pcnArr, 19);
  pcnArr := chained_hash_init(19);
  ShowMessage( IntToStr(pcnArr[i]^^.key)) );     // I have Problem Here :(     
end;

如何初始化节点?

【问题讨论】:

  • 听起来好像您的本地 var A: Cnode 设置不正确,因此您必须展示更多 chained_hash_init 的功能。
  • 我不知道如何初始化 Cnode。
  • 还有什么是 i 在您的 TForm1.btn1Click 过程中。它是一个全局变量吗?
  • 先生们,我相信OP的意思是说“初始化”。
  • 问题已解决(感谢 valex),但这段代码有更好的实现吗?

标签: delphi pointers hashtable


【解决方案1】:

您没有在 ShowMessage 之前初始化 pcnArr[i]。所以你得到“访问冲突”错误。

所以你应该初始化pcnArr 例如:

function TForm1.chained_hash_init(n: Integer): CNode;
var
  A: Cnode;
  i:integer;
  P:PNode;
begin
  ...
  SetLength(A, N);

  for i:=0 to N-1 do
  begin
    new(A[i]);
    new(A[i]^);
    with A[i]^^ do
    begin
        key:=0; 
        next:=nil; 
        prev:=nil; 
    end;  
  end;

  Result := A;
  ...
end;

【讨论】:

  • 你确定你可以做A[i]^^吗?我没试过,但看起来很可疑。
  • @mg30rg something^^ 可以,但你不能这样做 ^^someType。前一种情况可以在每一步解析类型,但后一种情况不会强制在“中间”使用类型。
  • @J... 谢谢,很高兴知道!我对 Delphi 很陌生(多年来一直使用 C++ 和 C# 进行开发,但最近搬到了一家使用 Delphi 的企业),而且我对指针操作充满了无限的怀疑,这似乎有点过于复杂。
猜你喜欢
  • 2010-10-11
  • 2015-04-28
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多