Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Копирование динамического массива, переданного как const / 22 сообщений из 22, страница 1 из 1
09.10.2017, 20:49:08
    #39533678
arCHi_1887
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
есть такой код:
Код: 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
09.10.2017, 21:03:27
    #39533684
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
Да. Любое присвоение массива к переменной вызывает копирование

Код: 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
09.10.2017, 21:33:00
    #39533690
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
Кстати, вызов функции генерирует код лучше

Код: 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
10.10.2017, 09:26:11
    #39533839
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
Для надёжности можно просто Copy или CopyArray.
...
Рейтинг: 0 / 0
10.10.2017, 09:27:22
    #39533840
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
авторЛюбое присвоение массива к переменной вызывает копирование
Очередное сильное и неправильное утверждение.
...
Рейтинг: 0 / 0
10.10.2017, 11:43:01
    #39533928
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
makhaon,

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Ну конечно, тип TStringDynArray = array of string должен работать не так как array of string, верим-верим :) И присваиваться не должен. У меня тоже не компилируется, XE6, почему и спрашивал.
...
Рейтинг: 0 / 0
10.10.2017, 13:35:19
    #39534026
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
автор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
10.10.2017, 13:42:52
    #39534029
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
arCHi_1887,

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

В 10.1 Berlin тоже не компилируется.
...
Рейтинг: 0 / 0
10.10.2017, 14:08:06
    #39534048
arCHi_1887
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
Код: 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
10.10.2017, 14:47:00
    #39534089
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование динамического массива, переданного как const
Все врут (с) Хаус
А я предупреждал сразу.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Копирование динамического массива, переданного как const / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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