Не компилируется... Странно, почему так? Не вижу проблем с реализацией. Или вручную эмулировать подобное, то есть создать несколько массивов разной длины, а потом создать массив указателей и на них указать?
Автор: volvo 4.04.2011 21:53
Цитата
Можно ли сделать что-то такое?
Нет.
Цитата
Пока что пришлось извращаться (по-моему, уродливо вышло).
К тому же ненадежно: Ада не гарантирует порядок вычисления элементов массива...
Цитата(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 5.04.2011 14:27
> Нет.
А запросы были?
> К тому же ненадежно: Ада не гарантирует порядок вычисления элементов массива...
А что же компилятор не предупредил?
> Можно. Только работать придется с динамикой:
Я думал, что статический массив с компонентами разной длины должен компилироваться в нечто подобное.
Автор: volvo 5.04.2011 14:48
Цитата
А запросы были?
Были. Еще до принятия 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 - то все нормально: какая бы разница, каким потоком или каким ядром инициализировано значение, если оно от внешних переменных не зависит?