Delphi过程数组参数混淆

时间:2018-10-01 08:52:25

标签: arrays delphi procedure

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

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

如果我像这样分配“较小的数组”,则下面的过程可以很好地工作

THREAD_SYNC(Remote,Local,0,Edit1)

当我尝试为其分配更大的数组时,记录超过30.000条记录,然后出现堆栈溢出错误,因此我尝试并用google搜索...,我发现了一些有关使用const的信息,因此将过程更改为:

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

现在可以了,我的问题是我不明白为什么?
没有const有什么区别?

1 个答案:

答案 0 :(得分:6)

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

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

通常,当传递(潜在地)大型结构(如数组或记录)时,应始终通过引用传递它们;如果接收它们的方法不会改变数据,则使用const;如果接收者这样做,则使用var。这样做还有一个好处,因为不需要复制数据,因此代码变得更快。

您可能应该像这样更改您的方法:

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

TProgressBarTEdit不需要使用const,它们是类,并且类存储在堆中,而堆栈中只有一个引用。