【问题标题】:Delphi Procedure Array Parameter confusionDelphi 程序数组参数混淆
【发布时间】:2019-03-06 08:26:36
【问题描述】:

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

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 条记录的更大数组时,我收到了 Stack Overflow 错误,所以我尝试并用 Google 搜索...我发现了一些关于使用 const 的信息,所以我将我的程序更改为:

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

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

【问题讨论】:

    标签: arrays delphi procedure


    【解决方案1】:

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

    通过使数组参数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,这些是类,类存储在堆上,只有堆栈上的引用。

    【讨论】:

    • 它的行为是这样的,但实际上,首先传递了一个指针,当参数不是 const 时,被调用者 (THREAD_SYNC) 复制数组,使用那个指针。不过效果是一样的:堆栈溢出。
    • FWIW,记录在案:docwiki.embarcadero.com/RADStudio/Tokyo/en/…:“值和常量 (const) 参数通过值或引用传递,具体取决于参数的类型和大小”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2017-04-15
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多