Delphi程序数组参数混淆

use*_*012 4 arrays delphi procedure

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

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

如果我为它指定"较小的数组",以下过程可以完美地工作

THREAD_SYNC(Remote,Local,0,Edit1)
Run Code Online (Sandbox Code Playgroud)

当我尝试为它分配一个更大的数组超过30.000条记录然后我得到一个Stack Overflow错误,所以我尝试了googled ...我发现了一些关于使用的东西const所以我把我的程序改为:

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

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

Dav*_*nan 6

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

通过创建数组参数解决了该问题const.在那种情况下,数组通过引用而不是值传递.换句话说,传递单个指针.

通常,当传递(可能)大型结构(如数组或记录)时,应始终通过引用传递它们; 使用const,如果该方法接收它们不改变数据,并且使用var如果接收器.这样做的另一个好处是您的代码变得更快,因为不需要复制数据.

您可能应该改变您的方法:

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

没有必要使用const TProgressBar或者TEdit,这些类和类存储在堆上,只有堆栈上的引用.

  • 它的行为方式,但实际上,*first*传递单个指针,当参数不是const时,被调用者(THREAD_SYNC)使用该指针复制数组.但效果是相同的:堆栈溢出. (2认同)