Дельфийская процедура Array Параметр путаница - PullRequest
0 голосов
/ 01 октября 2018

У меня есть проблема, которую я не понимаю:

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 записей, затем я получаю ошибку переполнения стека, поэтому я попробовал и погуглил ... и я нашел кое-что об использовании const, поэтому я изменил свою процедуру на:

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

И теперь это работает, моя проблема в том, что я не понимаю, почему?
Какая разница без const?

1 Ответ

0 голосов
/ 01 октября 2018

Эти массивы передаются по значению, что означает, что они копируются в стек и передаются таким образом.Следовательно, ошибки переполнения стека.

Проблема решается путем задания параметров массива const.В этом сценарии массив передается по ссылке, а не по значению.Другими словами, передается один указатель.

Как правило, при передаче (потенциально) больших структур, таких как массивы или записи, вы всегда должны передавать их по ссылке;используя const, если метод, получающий их, не изменяет данные, и используя var, если получатель делает.Это дает дополнительное преимущество: ваш код становится быстрее, потому что копировать данные не нужно.

Вероятно, вам следует изменить ваш метод следующим образом:

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

Нет необходимости использовать const дляTProgressBar или TEdit, эти классы и классы хранятся в куче только со ссылкой на стек.

...