![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
TarasBer |
![]()
Сообщение
#1
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Можно ли сделать что-то такое?
Grid_Font : constant array (7 .. 40) of HFONT := (
others i => Create_Font ("Lucida Console", i + 4)
);
Пока что пришлось извращаться (по-моему, уродливо вышло).
Index : integer;
function Set_I(i: integer) return integer is
begin
Index := i;
return Index;
end;
function Get_I return integer is
begin
Index := Index + 1;
return Index;
end;
Grid_Font : constant array (7 .. 40) of HFONT := (
Create_Font ("Lucida Console", Set_I(7) + 4),
others => Create_Font ("Lucida Console", Get_I + 4)
);
Можно ли создавать многомерные массивы с компонентами разной длины?
type TPattern_Array is array (Positive range <>, Positive range <>) of boolean;
Patterns : constant TPAttern_Array := (
(true, true),
(true, false),
(true, true, true, false, false),
(true, true, true, false, false, false, true, false, false, false));
Не компилируется... Странно, почему так? Не вижу проблем с реализацией. Или вручную эмулировать подобное, то есть создать несколько массивов разной длины, а потом создать массив указателей и на них указать? -------------------- |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Можно ли сделать что-то такое? Нет.Цитата Пока что пришлось извращаться (по-моему, уродливо вышло). К тому же ненадежно: Ада не гарантирует порядок вычисления элементов массива...Цитата(Ada RM) The evaluation of an array_aggregate of a given array type proceeds in two steps: , так что подобную инициализацию ни один вменяемый тестировщик не пропустит...1. Any discrete_choices of this aggregate and of its subaggregates are evaluated in an arbitrary order, and converted to the corresponding index type; 2. The array component expressions of the aggregate are evaluated in an arbitrary order and their values are converted to the component subtype of the array type; an array component expression is evaluated once for each associated component. Цитата Можно ли создавать многомерные массивы с компонентами разной длины? Можно. Только работать придется с динамикой: type SubArr is array (Natural range <>) of Boolean;
type TPattern_Array is array (Positive range <>) of access SubArr;
Patterns : constant TPattern_Array := (
1 => (new SubArr'(true, true)),
2 => (new SubArr'(true, false)),
3 => (new SubArr'(true, true, true, false, false)),
4 => (new SubArr'(true, true, true, false, false, false, true, false, false, false))
);
, статически этого сделать нельзя (Стандарт запрещает). |
TarasBer |
![]()
Сообщение
#3
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Нет.
А запросы были? > К тому же ненадежно: Ада не гарантирует порядок вычисления элементов массива... А что же компилятор не предупредил? > Можно. Только работать придется с динамикой: Я думал, что статический массив с компонентами разной длины должен компилироваться в нечто подобное. -------------------- |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата А запросы были? Были. Еще до принятия A95, просили возможности сделать так:E : constant Matrix(1 .. 5, 1 .. 5) :=
(for I in 1 .. 5 => (for J in 1 .. 5 => (if I = J then 1.0 else 0.0)));
, или хотя бы дать возможность определить в агрегате, какой именно элемент сейчас инициализируется, чтобы можно было использовать функции. Предложение было отклонено, формулировку не помню. С тех пор подобные предложения не возникали.Цитата А что же компилятор не предупредил? Приоритет - у Стандарта. Компилятор не может обо всем знать. Даже если у тебя на машине оно нормально откомпилируется, и даже отработает - это еще не значит, что на другой машине оно отработает так же. Например, никто не запрещает компилятору сгенерировать код, который при наличии нескольких ядер (я уж не говорю о мультипроцессорных системах) будет инициализировать разные элементы массива разными ядрами (одновременно). Представляешь, что будет получено в твоем случае? Если же не выходить за рамки разрешенного в RM - то все нормально: какая бы разница, каким потоком или каким ядром инициализировано значение, если оно от внешних переменных не зависит? |
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 7:03 |