powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Копирование динамического массива, переданного как const
22 сообщений из 22, страница 1 из 1
Копирование динамического массива, переданного как const
    #39533678
arCHi_1887
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть такой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TSomeClass.Proc(const B: array of string);
begin
  FA := B;
end;

<...>
  someObj.proc(b);
<...>



в этом случае получится скопировать значения из b в а, а не ссылку на него? Код компилируется :).
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533684
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Любое присвоение массива к переменной вызывает копирование

Код: pascal
1.
2.
3.
4.
5.
6.
7.
*.dpr.17: FA := B;
0041AD53 B8D0584200       mov eax,$004258d0
0041AD58 8B55FC           mov edx,[ebp-$04]
0041AD5B B90B000000       mov ecx,$0000000b
0041AD60 51               push ecx
0041AD61 8B0DA0114000     mov ecx,[$004011a0]
0041AD67 E8BCDDFEFF       call @CopyArray



Так же. Можно и в ручную скопировать нужную длину

Код: pascal
1.
CopyArray(@Dest, @Source, TypeInfo(string), 5); // Копируем  5 элементов типа string 
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533690
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, вызов функции генерирует код лучше

Код: pascal
1.
2.
3.
4.
5.
6.
Project1.dpr.18: CopyArray(@Dest, @Source, TypeInfo(string), Length(Source));
0041AD4F 6A0B             push $0b
0041AD51 8BD0             mov edx,eax
0041AD53 B8D0584200       mov eax,$004258d0
0041AD58 8B0DA0114000     mov ecx,[$004011a0]
0041AD5E E8F1DFFEFF       call CopyArray
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533839
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для надёжности можно просто Copy или CopyArray.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533840
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЛюбое присвоение массива к переменной вызывает копирование
Очередное сильное и неправильное утверждение.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533928
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Что вижу - то и говорю.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533939
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonДля надёжности можно просто Copy или CopyArray.

Для аргументов ? А какая там может быть ненадежность ?
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533957
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

Для того, что бы не думать, как передано - const, указателем, либо еще как-то. Завтра модификатор кто-то (в том числе автор) поменяет, и всё посыпется.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533965
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonschi,

Для того, что бы не думать, как передано - const, указателем, либо еще как-то. Завтра модификатор кто-то (в том числе автор) поменяет, и всё посыпется.

Извини, не понимаю. Пример был бы уместен.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533970
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топик стартеру: кинь тип FA, а лучше, весь TSomeClass.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533973
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

procedure TSomeClass.Proc(b: TStringDynArray);
begin
FA := B;
end;

вызывает: call @DynArrayAsg
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533984
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonschi,

procedure TSomeClass.Proc(b: TStringDynArray);
begin
FA := B;
end;

вызывает: call @DynArrayAsg

А с const ?
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533987
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,

Так я уже писал. Что пока ничего не меняется - то всё хорошо. А завтра поменялось что-то - и всё посыпалось. Причём совершенно не очевидно. Ну а Игорю лишний повод поспорить
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533988
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C const тоже самое. Да, меня такое поведение тоже раздражает. Лучше всего, что бы TStringDynArray, array of string и TArray<string> был одним, присваеваемым и однозначно работающим типом. Однако это не так.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533992
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonC const тоже самое. Да, меня такое поведение тоже раздражает. Лучше всего, что бы TStringDynArray, array of
string и TArray<string> был одним, присваеваемым и однозначно работающим типом. Однако это не так.

А у меня пример TC не компилируется :-(
FA объявлен как array of string.
В примере параметром передается не динамический массив, а открытый.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39533998
ойойойой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonC const тоже самое. Да, меня такое поведение тоже раздражает. Лучше всего, что бы TStringDynArray, array of string и TArray<string> был одним, присваеваемым и однозначно работающим типом. Однако это не так.

array of string не может быть тем же самым, т.к. это открытый массив, созданный и работающий по другому, в отличии динамических массивов. В общем случае при передаче в функцию открытый массив работает лучше чем динамические массивы.

schiА у меня пример TC не компилируется :-(
FA объявлен как array of string.
В примере параметром передается не динамический массив, а открытый.


версию делфи наверное нужно по-новее.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39534016
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ойойойой,

Ну конечно, тип TStringDynArray = array of string должен работать не так как array of string, верим-верим :) И присваиваться не должен. У меня тоже не компилируется, XE6, почему и спрашивал.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39534026
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторarray of string не может быть тем же самым, т.к. это открытый массив, созданный и работающий по другому, в отличии динамических массивов

Если уж придерживаться терминологии - то array of string и есть динамический массив:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TForm2.Button1Click(Sender: TObject);
var
 s: string;
 b: array of string;
begin
 s := b;
end;



[dcc32 Error] Unit2.pas(47): E2010 Incompatible types: 'string' and 'Dynamic array'
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39534029
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arCHi_1887,

В коде не динамический, а открытый масcив.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39534034
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ойойойойверсию делфи наверное нужно по-новее.

В 10.1 Berlin тоже не компилируется.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39534048
arCHi_1887
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
type
  TMyStringArray = array of string;

  TMyRecord = record
    FA: TMyStringArray;
    constructor Create(const AArr: TMyStringArray);
  end;

<...>

  constructor TMyRecord.Create(const AArr: TMyStringArray);
  begin
     FA := AArr;
  end;



Delphi XE.
...
Рейтинг: 0 / 0
Копирование динамического массива, переданного как const
    #39534089
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все врут (с) Хаус
А я предупреждал сразу.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Копирование динамического массива, переданного как const
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]