数组 – 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,如果接收器使用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,这些类和类存储在堆上,只有堆栈上的引用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |