Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как использовать в константах массивы разной длины? / 25 сообщений из 27, страница 1 из 2
04.02.2018, 13:45
    #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
04.02.2018, 13:49
    #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
04.02.2018, 14:04
    #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
04.02.2018, 14:11
    #39596317
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать в константах массивы разной длины?
Dimitry Sibiryakov, как в таком случае получить реальную длину массива?
...
Рейтинг: 0 / 0
04.02.2018, 14:17
    #39596318
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать в константах массивы разной длины?
Никак, объявить константой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.02.2018, 14:24
    #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
04.02.2018, 17:05
    #39596371
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать в константах массивы разной длины?
fd00ch
Код: pascal
1.
((Name: '1';   Children: @Children1;   Len: Length(Children1)),

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

Я что-то упустил в этой жизни? Children1 - это типизированная константа. Следовательно из других констант можно ссылаться только на ее адрес. Или в Сиэтле что-то допилили?
Вроде всю жизнь с типизированными константами можно было делать что угодно, кроме присваивания им значения... (на самом деле и это можно, через хак).
...
Рейтинг: 0 / 0
04.02.2018, 19:18
    #39596422
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать в константах массивы разной длины?
_Vasilisk_Или в Сиэтле что-то допилили?знаю только, что в Сиэтле работает, а уж когда это допилили - х.з.
...
Рейтинг: 0 / 0
04.02.2018, 20:20
    #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
05.02.2018, 00:05
    #39596481
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать в константах массивы разной длины?
Freedoom, не, у меня главный массив - несколько тысяч элементов и сотня вставленных дочерних. нужен короткий и легко поддерживаемый вариант (пока свой так и использую)
...
Рейтинг: 0 / 0
05.02.2018, 09:10
    #39596542
LocksmithPC
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать в константах массивы разной длины?
fd00ch, TStringList?
...
Рейтинг: 0 / 0
05.02.2018, 10:22
    #39596583
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как использовать в константах массивы разной длины?
_Vasilisk_fd00ch
Код: pascal
1.
((Name: '1';   Children: @Children1;   Len: Length(Children1)),

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

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

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

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

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

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

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

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

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

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

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


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