Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как подружить открытый и динамический массив? / 17 сообщений из 17, страница 1 из 1
10.08.2019, 17:06
    #39847786
Страдалецъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
Имеем:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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'
Я конечно могу написать так:
Код: pascal
1.
2.
3.
4.
5.
6.
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;


но мне кажется есть более кашерный вариант :)
...
Рейтинг: 0 / 0
10.08.2019, 17:19
    #39847790
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
СтрадалецъЯ конечно могу написать так
Так и надо написать.
...
Рейтинг: 0 / 0
10.08.2019, 17:32
    #39847793
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
Страдалецъмне кажется есть более кашерный вариант :)

Для этого сначала надо определиться хочешь ли ты использовать с конструктором открытый
массив или сойдёт и динамический. Во втором случае надо изменить параметр конструктора.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2019, 17:43
    #39847799
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
Страдалецъно мне кажется есть более кашерный вариант :)
А вы хотите хранить ссылку на массив снаружи или копию массива ?
...
Рейтинг: 0 / 0
10.08.2019, 17:57
    #39847804
Страдалецъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
Нужен открытый, а так бы я просто определил нужный тип и все.
Допустим так и надо делать, но почему же тогда не возникает проблем с типами если делаем так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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.


Тут у нас спокойно принимается и открытый и динамический массив. Проблем совместимости нет. Почему?
...
Рейтинг: 0 / 0
10.08.2019, 18:01
    #39847807
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
СтрадалецъПочему?

Динамический массив совместим с открытым (может быть к нему приведён). Открытый массив
несовместим с динамическим.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2019, 18:10
    #39847813
Страдалецъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
О как. Гайку на шпильку накрутить можно, а вот шпильку на гайку фигушки. Все как в жизни :)
...
Рейтинг: 0 / 0
10.08.2019, 18:18
    #39847816
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
Ну да, "фарш невозможно провернуть назад".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2019, 18:43
    #39847823
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
СтрадалецъПроблем совместимости нет. Почему?

Compiler magic.
...
Рейтинг: 0 / 0
10.08.2019, 21:02
    #39847843
registered
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
В чём разница между открытым и динамическим в данном примере, и почему "это важно"? В чём разница, если просто "определить тип, и всё"?
...
Рейтинг: 0 / 0
10.08.2019, 21:43
    #39847853
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
Какой смысл в открытых массивах?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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;
...
Рейтинг: 0 / 0
10.08.2019, 22:05
    #39847863
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
registeredВ чём разница между открытым и динамическим в данном примере, и почему "это важно"?

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

Второе - надмножество первого, поэтому первое принимается там, где ожидается второе, но не
наоборот.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2019, 22:13
    #39847864
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
X-Cite,

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

Эффективная статика
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure test(const astrings : array of string);
begin
end;

procedure proc;
begin

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

end;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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



Неэффективная динамика
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure test(const astrings : TArray<string>);
begin
end;

procedure proc;
begin

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

end;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
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.
...
Рейтинг: 0 / 0
10.08.2019, 22:29
    #39847867
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
Kazantsev AlexeyX-Cite,
Во-первых, они эффективнее, т.к. не требуют выделения-иинициализации-осовобождения памяти.


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

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


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

и зачем эти дефолтные конструкторы...
...
Рейтинг: 0 / 0
10.08.2019, 22:46
    #39847871
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
X-Cite,

Сейчас удобнее, расширяемее и моднее писать на JS под Electron. Там вопросы эффективности вооще никого не парят. Ресурсов же дофига.
...
Рейтинг: 0 / 0
11.08.2019, 16:15
    #39847945
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
Kazantsev Alexey,
Потом все это глючит, тормозит и тупит, а главное жрет памяти за 3-х
...
Рейтинг: 0 / 0
12.08.2019, 00:26
    #39848052
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как подружить открытый и динамический массив?
ziv-2014Kazantsev Alexey,
Потом все это глючит, тормозит и тупит, а главное жрет памяти за 3-х

главное, чтобы X-Cite было удобнее писать
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как подружить открытый и динамический массив? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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