代码之家  ›  专栏  ›  技术社区  ›  user1937012

Delphi程序数组参数混淆

  •  4
  • user1937012  · 技术社区  · 7 年前

    我有一个我不明白的问题:

    procedure TMain.THREAD_SYNC(
                  AProgressBar: TProgressBar; 
                  ARemoteData: array of RemoteDATA; 
                  ALocalData : array of LocalDATA; 
                  Number : integer; 
                  AInfo : TEdit);
    

    THREAD_SYNC(Remote,Local,0,Edit1)
    

    const 所以我把程序改成:

    procedure TMain.THREAD_SYNC(
                  AProgressBar: TProgressBar; 
                  ARemoteData: array of RemoteDATA; 
                  const ALocalData : array of LocalDATA; 
                  Number : integer; 
                  AInfo : TEdit);
    

    现在它成功了,我的问题是我不明白为什么?
    没有这些有什么区别 ?

    1 回复  |  直到 7 年前
        1
  •  6
  •   Johan    7 年前

    这些数组是按值传递的,这意味着它们被复制到堆栈上并以这种方式传递。因此堆栈溢出错误。

    通过设置阵列参数解决了这个问题 const . 在这种情况下,数组是通过引用而不是值传递的。换句话说,只传递一个指针。

    一般来说,在传递(可能的)大型结构(如数组或记录)时,应该始终通过引用传递它们;使用 常数 var 如果接收器有。这有一个额外的好处,那就是您的代码变得更快,因为不需要复制任何数据。

    procedure TMain.THREAD_SYNC(
                  AProgressBar: TProgressBar; 
                  const ARemoteData: array of RemoteDATA; 
                  const ALocalData : array of LocalDATA; 
                  Number : integer; 
                  AInfo : TEdit);
    

    没有必要使用const TProgressBar TEdit ,这些是类,类存储在堆上,堆栈上只有一个引用。