powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как использовать в константах массивы разной длины?
25 сообщений из 27, страница 1 из 2
Как использовать в константах массивы разной длины?
    #39596311
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочется задать константами подобную структуру:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
type
 TChild = record
   Name: string
  end;

 TParent = record
   Name    : string;
   Children: array of TChild
  end;

const
 Children1: array [0..1] of TChild =
  ((Name: '1.1'),
   (Name: '1.2'));

 Children2: array [0..2] of TChild  =
  ((Name: '2.1'),
   (Name: '2.2'),
   (Name: '2.3'));

 Parents: array [0..2] of TParent =
  ((Name: '1';   Children: Children1),
   (Name: '2';   Children: Children2),
   (Name: '3'));


Компилятор Delphi Seattle разумно отшивает меня: "E2010 Incompatible types: 'Dynamic array' and 'Array'"

Что намутить с выделенной строкой (или в другом месте), чтобы это было возможно?
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596313
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока родил только такой костыль. Есть ли варианты лучше?
Код: pascal
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.
49.
50.
51.
52.
type
 PChild = ^TChild;
 TChild = record
   Name: string
  end;

 TParent = record
   Name    : string;
   Children: PChild
  end;

const
 Children1: array [0..2] of TChild =
  ((Name: '1.1'),
   (Name: '1.2'),
   (Name: ''   ));

 Children2: array [0..3] of TChild  =
  ((Name: '2.1'),
   (Name: '2.2'),
   (Name: '2.3'),
   (Name: ''   ));

 Parents: array [0..2] of TParent =
  ((Name: '1';   Children: @Children1),
   (Name: '2';   Children: @Children2),
   (Name: '3'));



procedure TForm1.FormCreate(Sender: TObject);

  procedure Print(const Parent: TParent);
   var
    Child: PChild;
   begin
    Memo1.Lines.Add(Parent.Name);
    Child:=Parent.Children;
    while (Child<>nil) and (Child.Name<>'')
     do   begin
           Memo1.Lines.Add(Child.Name);
           Inc(Child)
          end;
    Memo1.Lines.Add('')
   end;

 var
  Step: Integer;
 begin
  for Step:=Low(Parents) to High(Parents)
   do   Print(Parents[Step])
 end;

...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596315
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
type
  TChild = record
    Name: string
   end;
  TChildArray = array[0..1000] of TChild;
  PChildArray = ^TChildArray;

  TParent = record
    Name    : string;
    Children: PChildArray;
   end;

const
  Children1: array [0..1] of TChild =
   ((Name: '1.1'),
    (Name: '1.2'));

  Children2: array [0..2] of TChild  =
   ((Name: '2.1'),
    (Name: '2.2'),
    (Name: '2.3'));

  Parents: array [0..2] of TParent =
   ((Name: '1';   Children: @Children1),
    (Name: '2';   Children: @Children2),
    (Name: '3'));


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596317
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, как в таком случае получить реальную длину массива?
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596318
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак, объявить константой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596320
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, ок, если учесть, что использование Length() внутри константы разрешено - тоже рабочий костыль
Код: pascal
1.
2.
3.
4.
  Parents: array [0..2] of TParent =
   ((Name: '1';   Children: @Children1;   Len: Length(Children1)),
    (Name: '2';   Children: @Children2;   Len: Length(Children2)),
    (Name: '3'));
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596371
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch
Код: pascal
1.
((Name: '1';   Children: @Children1;   Len: Length(Children1)),

Я что-то упустил в этой жизни? Children1 - это типизированная константа. Следовательно из других констант можно ссылаться только на ее адрес. Или в Сиэтле что-то допилили?
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596417
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_fd00ch
Код: pascal
1.
((Name: '1';   Children: @Children1;   Len: Length(Children1)),

Я что-то упустил в этой жизни? Children1 - это типизированная константа. Следовательно из других констант можно ссылаться только на ее адрес. Или в Сиэтле что-то допилили?
Вроде всю жизнь с типизированными константами можно было делать что угодно, кроме присваивания им значения... (на самом деле и это можно, через хак).
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596422
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Или в Сиэтле что-то допилили?знаю только, что в Сиэтле работает, а уж когда это допилили - х.з.
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596442
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fd00chХочется задать константами подобную структуру:

Код: pascal
1.
2.
3.
4.
5.
6.
...
 TParent = record
   Name    : string;
   Children: array of TChild
  end;
...


Что намутить с выделенной строкой (или в другом месте), чтобы это было возможно?
Попробуйте как вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
type
 TChild = record
   Name: string
  end;
 tArrChild = array of tChild;
 TParent = record
   Name    : string;
   Children: tArrChild
  end;

const
 Children1: array [0..1] of TChild = ((Name: '1.1'), (Name: '1.2'));
 Children2: array [0..2] of TChild = ((Name: '2.1'), (Name: '2.2'), (Name: '2.3'));

Parents: array [0..2] of TParent =
  ((Name: '1';   Children: nil),
   (Name: '2';   Children: nil),
   (Name: '3'));

initialization
  Parants[0].Children := Children1;
  Parants[1].Children := Children2;
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596481
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoom, не, у меня главный массив - несколько тысяч элементов и сотня вставленных дочерних. нужен короткий и легко поддерживаемый вариант (пока свой так и использую)
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596542
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch, TStringList?
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596583
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_fd00ch
Код: pascal
1.
((Name: '1';   Children: @Children1;   Len: Length(Children1)),

Я что-то упустил в этой жизни? Children1 - это типизированная константа. Следовательно из других констант можно ссылаться только на ее адрес. Или в Сиэтле что-то допилили?

High и Low всегда работали
про Length не помню, но почему бы и нет
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596588
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LocksmithPC,

TStringList'ом не задашь константы. Вопрос: а обязательно ли константы хранить непосредственно в коде как есть. Если, например, задать их Json'ом как сплошную строку, разметка должна быть вполне удобночитаемой, мне кажется. Один раз, во время инициализации модуля, парсить Json в реальные константы, думаю, что в несколько строк можно вполне уложиться.

Read only констант можно временно отключить:

Код: pascal
1.
2.
3.
 {$J+}
 Parents[0].Name := 'test';
 {$J-}
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596596
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon, Зашивать в коде что-либо возможно изменяемое моветон. Даже если в текущий момент кажется, что это на века. Хранить данные в XML, главное не чудить с тегами: <ОченьВажнаяиНужнаяКонстантаОдин>1</ОченьВажнаяиНужнаяКонстантаОдин>
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596599
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LocksmithPC,

не вопрос - можно вообще в отдельный файл кинуть :) я не против - как автору удобно. json может вполне и во внешнем файле лежать. какая разница.
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596759
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LocksmithPC,

Какая тебе разница поправишь ты свой xml или константу в коде?
Если же "константа" предпологается для изменения пользователем то она вообще в интерфейсе должна редактироваться.
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596787
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat, Константу в XML сможет поправить человек не имеющий на руках исходник
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596819
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LocksmithPC,

А тебе как програмиисту оно надо?
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596887
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LocksmithPCrgreat, Константу в XML сможет поправить человек не имеющий на руках исходник
Вы серьёзно думаете, что константу в приложении, не имея исходников, подправить нельзя? Немного сложнее, но и только.
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596891
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, вы сейчас говорите о простом пользователе?
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596914
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch,

В принипе можно воспользоваться Конструкторами динамических массивов, им прописывать размеры не нужно.
Но они не умеют принимать константы типа record, печаль.
Когда мне так захотелось сделать - пришлось пользоваться инлайновой процедурой.
См. самый самый конец https://github.com/the-Arioch/Delphi-XmlLite/blob/master/XmlLite.pas
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39596915
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

ОДНУ константу - да, не сильно сложнее.
Но вот поместить 10 констант туда, где при компиляции было 2 (изменить размер статического массива) - уже сложнее.
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39597101
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fd00chFreedoom, не, у меня главный массив - несколько тысяч элементов и сотня вставленных дочерних. нужен короткий и легко поддерживаемый вариант (пока свой так и использую)
У каждого своё видение. В подобных случаях использую два файла. В одном TParent.Name и TParent.Key, а в другом TParent.Key и TChilld.Name, отсортированные по Key. При желании можно поместить в ресурсы программы. Для ускорения доступа к Child TParen можно расширить и добавить начальный индекс и количество (конечный индекс). Единственное неудобство - единоразовое написание утилиты, перегоняющей тектсовое представление в формат хранения.
...
Рейтинг: 0 / 0
Как использовать в константах массивы разной длины?
    #39597118
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch,

напиши простой генератор .pas - файлов, на вход ему подавай структуру, описывающую твои "деревья". Я бы json попробовал использовать.
Или просто сразу включи в ресурсы приложения json (можно зазипованный), при запуске распаковывай да строй свои структуры.
Второе, имхо, проще и быстрее.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как использовать в константах массивы разной длины?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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