Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как подружить открытый и динамический массив?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1375
Имеем:
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;

но мне кажется есть более кашерный вариант :)
10 авг 19, 17:06    [21946143]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3625
Страдалецъ
Я конечно могу написать так

Так и надо написать.
10 авг 19, 17:19    [21946147]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47967

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

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

Posted via ActualForum NNTP Server 1.5

10 авг 19, 17:32    [21946151]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
DimaBr
Member

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

А вы хотите хранить ссылку на массив снаружи или копию массива ?
10 авг 19, 17:43    [21946157]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1375
Нужен открытый, а так бы я просто определил нужный тип и все.
Допустим так и надо делать, но почему же тогда не возникает проблем с типами если делаем так:
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.

Тут у нас спокойно принимается и открытый и динамический массив. Проблем совместимости нет. Почему?
10 авг 19, 17:57    [21946163]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47967

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

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

Posted via ActualForum NNTP Server 1.5

10 авг 19, 18:01    [21946167]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1375
О как. Гайку на шпильку накрутить можно, а вот шпильку на гайку фигушки. Все как в жизни :)
10 авг 19, 18:10    [21946178]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47967

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

Posted via ActualForum NNTP Server 1.5

10 авг 19, 18:18    [21946184]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3625
Страдалецъ
Проблем совместимости нет. Почему?


Compiler magic.
10 авг 19, 18:43    [21946199]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
registered
Member

Откуда:
Сообщений: 64
В чём разница между открытым и динамическим в данном примере, и почему "это важно"? В чём разница, если просто "определить тип, и всё"?
10 авг 19, 21:02    [21946241]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1515
Какой смысл в открытых массивах?

type
  TA = class
  private
    FValue: TArray<string>;
  public
    constructor Create(const aValue: TArray<string>);
  end;

{ TA }

constructor TA.Create(const aValue: TArray<string>);
begin
  FValue := aValue;
end;

var
  a: TA;
  b: TArray<string>;
begin
  a := TA.Create(['']);
  a := TA.Create(b);
end;
10 авг 19, 21:43    [21946265]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47967

registered
В чём разница между открытым и динамическим в данном примере, и почему "это важно"?

Динамический массив это указатель на массив, расположенный в куче.
Открытый массив это указатель на любой массив вне зависимости от того где он расположен.

Второе - надмножество первого, поэтому первое принимается там, где ожидается второе, но не
наоборот.

Posted via ActualForum NNTP Server 1.5

10 авг 19, 22:05    [21946282]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3625
X-Cite,

Во-первых, они эффективнее, т.к. не требуют выделения-иинициализации-осовобождения памяти.

+ Эффективная статика

procedure test(const astrings : array of string);
begin
end;

procedure proc;
begin

 test(['1', '2', '3']);

end;


Project1.dpr.15: begin
0041B1E8 55               push ebp
0041B1E9 8BEC             mov ebp,esp
0041B1EB 83C4F4           add esp,-$0c
Project1.dpr.17: test(['1', '2', '3']);
0041B1EE B824B24100       mov eax,$0041b224
0041B1F3 8945F4           mov [ebp-$0c],eax
0041B1F6 B834B24100       mov eax,$0041b234
0041B1FB 8945F8           mov [ebp-$08],eax
0041B1FE B844B24100       mov eax,$0041b244
0041B203 8945FC           mov [ebp-$04],eax
0041B206 8D45F4           lea eax,[ebp-$0c]
0041B209 BA02000000       mov edx,$00000002
0041B20E E8C5FFFFFF       call test
Project1.dpr.19: end;
0041B213 8BE5             mov esp,ebp
0041B215 5D               pop ebp
0041B216 C3               ret


+ Неэффективная динамика

procedure test(const astrings : TArray<string>);
begin
end;

procedure proc;
begin

 test(['1', '2', '3']);

end;


Project1.dpr.15: begin
0041B1E4 55               push ebp
0041B1E5 8BEC             mov ebp,esp
0041B1E7 6A00             push $00
0041B1E9 33C0             xor eax,eax
0041B1EB 55               push ebp
0041B1EC 686EB24100       push $0041b26e
0041B1F1 64FF30           push dword ptr fs:[eax]
0041B1F4 648920           mov fs:[eax],esp
Project1.dpr.17: test(['1', '2', '3']);
0041B1F7 8D45FC           lea eax,[ebp-$04]
0041B1FA 8B15DCBA4000     mov edx,[$0040badc]
0041B200 E8F3CEFEFF       call @DynArrayClear
0041B205 6A03             push $03
0041B207 8D45FC           lea eax,[ebp-$04]
0041B20A B901000000       mov ecx,$00000001
0041B20F 8B15DCBA4000     mov edx,[$0040badc]
0041B215 E8BACDFEFF       call @DynArraySetLength
0041B21A 83C404           add esp,$04
0041B21D 8B45FC           mov eax,[ebp-$04]
0041B220 BA84B24100       mov edx,$0041b284
0041B225 E816B9FEFF       call @UStrAsg
0041B22A 8B45FC           mov eax,[ebp-$04]
0041B22D 83C004           add eax,$04
0041B230 BA94B24100       mov edx,$0041b294
0041B235 E806B9FEFF       call @UStrAsg
0041B23A 8B45FC           mov eax,[ebp-$04]
0041B23D 83C008           add eax,$08
0041B240 BAA4B24100       mov edx,$0041b2a4
0041B245 E8F6B8FEFF       call @UStrAsg
0041B24A 8B45FC           mov eax,[ebp-$04]
0041B24D E886FFFFFF       call test
Project1.dpr.19: end;
0041B252 33C0             xor eax,eax
0041B254 5A               pop edx
0041B255 59               pop ecx
0041B256 59               pop ecx
0041B257 648910           mov fs:[eax],edx
0041B25A 6875B24100       push $0041b275
0041B25F 8D45FC           lea eax,[ebp-$04]
0041B262 8B15DCBA4000     mov edx,[$0040badc]
0041B268 E88BCEFEFF       call @DynArrayClear
0041B26D C3               ret 
0041B26E E9F9ACFEFF       jmp @HandleFinally
0041B273 EBEA             jmp $0041b25f
0041B275 59               pop ecx
0041B276 5D               pop ebp
0041B277 C3               ret



Во-вторых, дефолтный конструктор у динамических появился только в XE7.
10 авг 19, 22:13    [21946284]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1515
Kazantsev Alexey
X-Cite,
Во-первых, они эффективнее, т.к. не требуют выделения-иинициализации-осовобождения памяти.


Сейчас ресурсов столько, что важнее удобство написания, расширения и сопровождения кода. Поэтому сомнительный пункт, учитывая, что инициализация делается где-то один раз.

Kazantsev Alexey
X-Cite,
Во-вторых, дефолтный конструктор у динамических появился только в XE7.


В XE6 если память не изменяет
a := TArray<string>.Create('A', 'B', 'C');

и зачем эти дефолтные конструкторы...
10 авг 19, 22:29    [21946289]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3625
X-Cite,

Сейчас удобнее, расширяемее и моднее писать на JS под Electron. Там вопросы эффективности вооще никого не парят. Ресурсов же дофига.
10 авг 19, 22:46    [21946295]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
ziv-2014
Member

Откуда:
Сообщений: 376
Kazantsev Alexey,
Потом все это глючит, тормозит и тупит, а главное жрет памяти за 3-х
11 авг 19, 16:15    [21946482]     Ответить | Цитировать Сообщить модератору
 Re: Как подружить открытый и динамический массив?  [new]
defecator
Member

Откуда:
Сообщений: 39308
ziv-2014
Kazantsev Alexey,
Потом все это глючит, тормозит и тупит, а главное жрет памяти за 3-х


главное, чтобы X-Cite было удобнее писать Картинка с другого сайта.
12 авг 19, 00:26    [21946719]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить