powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как подружить открытый и динамический массив?
17 сообщений из 17, страница 1 из 1
Как подружить открытый и динамический массив?
    #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
Как подружить открытый и динамический массив?
    #39847790
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтрадалецъЯ конечно могу написать так
Так и надо написать.
...
Рейтинг: 0 / 0
Как подружить открытый и динамический массив?
    #39847793
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъмне кажется есть более кашерный вариант :)

Для этого сначала надо определиться хочешь ли ты использовать с конструктором открытый
массив или сойдёт и динамический. Во втором случае надо изменить параметр конструктора.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как подружить открытый и динамический массив?
    #39847799
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъно мне кажется есть более кашерный вариант :)
А вы хотите хранить ссылку на массив снаружи или копию массива ?
...
Рейтинг: 0 / 0
Как подружить открытый и динамический массив?
    #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
Как подружить открытый и динамический массив?
    #39847807
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтрадалецъПочему?

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

Compiler magic.
...
Рейтинг: 0 / 0
Как подружить открытый и динамический массив?
    #39847843
registered
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В чём разница между открытым и динамическим в данном примере, и почему "это важно"? В чём разница, если просто "определить тип, и всё"?
...
Рейтинг: 0 / 0
Как подружить открытый и динамический массив?
    #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
Как подружить открытый и динамический массив?
    #39847863
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registeredВ чём разница между открытым и динамическим в данном примере, и почему "это важно"?

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

Второе - надмножество первого, поэтому первое принимается там, где ожидается второе, но не
наоборот.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как подружить открытый и динамический массив?
    #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
Как подружить открытый и динамический массив?
    #39847867
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyX-Cite,
Во-первых, они эффективнее, т.к. не требуют выделения-иинициализации-осовобождения памяти.


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

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


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

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

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

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


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