Как подружить открытый и динамический массив?

Страдалецъ
Дата: 10.08.2019 17:06:00
Имеем:
Type
 TMyClass = class
  private
   FStrings: array of String;
  public
   constructor Create(AStrings: array of String);
 end;
...
constructor TMyClass.Create(AStrings: array of String);
begin
 FStrings := AStrings;
end;

получаем [dcc32 Error] Unit1.pas(102): E2010 Incompatible types: 'Dynamic array' and 'array of string'
Я конечно могу написать так:
constructor TMyClass.Create(AStrings: array of String);
var i: Integer;
begin
 SetLength(FStrings, Length(AStrings));
 for i := 0 to High(AStrings) do FStrings[i] := AStrings[i];
end;

но мне кажется есть более кашерный вариант :)
Kazantsev Alexey
Дата: 10.08.2019 17:19:52
Страдалецъ
Я конечно могу написать так

Так и надо написать.
Dimitry Sibiryakov
Дата: 10.08.2019 17:32:49

Страдалецъ
мне кажется есть более кашерный вариант :)

Для этого сначала надо определиться хочешь ли ты использовать с конструктором открытый
массив или сойдёт и динамический. Во втором случае надо изменить параметр конструктора.

Posted via ActualForum NNTP Server 1.5

DimaBr
Дата: 10.08.2019 17:43:49
Страдалецъ
но мне кажется есть более кашерный вариант :)

А вы хотите хранить ссылку на массив снаружи или копию массива ?
Страдалецъ
Дата: 10.08.2019 17:57:16
Нужен открытый, а так бы я просто определил нужный тип и все.
Допустим так и надо делать, но почему же тогда не возникает проблем с типами если делаем так:
Type
 TMyClass = class
  private
   FStrings: array of String;
  public
   constructor Create(AStrings: array of String);
 end;

constructor TMyClass.Create(AStrings: array of String);
var i: Integer;
begin
 for i := 0 to High(AStrings) do FStrings[i] := AStrings[i];
end;

var
  MyClass: TMyClass;
  AStrings: array of String;
begin
 MyClass := TMyClass.Create(['']);
 MyClass := TMyClass.Create(AStrings);
end.

Тут у нас спокойно принимается и открытый и динамический массив. Проблем совместимости нет. Почему?
Dimitry Sibiryakov
Дата: 10.08.2019 18:01:12

Страдалецъ
Почему?

Динамический массив совместим с открытым (может быть к нему приведён). Открытый массив
несовместим с динамическим.

Posted via ActualForum NNTP Server 1.5

Страдалецъ
Дата: 10.08.2019 18:10:23
О как. Гайку на шпильку накрутить можно, а вот шпильку на гайку фигушки. Все как в жизни :)
Dimitry Sibiryakov
Дата: 10.08.2019 18:18:49

Ну да, "фарш невозможно провернуть назад".

Posted via ActualForum NNTP Server 1.5

Kazantsev Alexey
Дата: 10.08.2019 18:43:28
Страдалецъ
Проблем совместимости нет. Почему?


Compiler magic.
registered
Дата: 10.08.2019 21:02:12
В чём разница между открытым и динамическим в данном примере, и почему "это важно"? В чём разница, если просто "определить тип, и всё"?