加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数组 – Delphi程序数组参数混淆

发布时间:2020-12-15 09:26:30 所属栏目:大数据 来源:网络整理
导读:我有一个我不明白的问题: procedure TMain.THREAD_SYNC( AProgressBar: TProgressBar; ARemoteData: array of RemoteDATA; ALocalData : array of LocalDATA; Number : integer; AInfo : TEdit); 如果我为它指定“较小的数组”,以下过程可以完美地工作 THRE
我有一个我不明白的问题:

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

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

THREAD_SYNC(Remote,Local,Edit1)

当我尝试用超过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);

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

解决方法

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读