Помощь новичкам

Информация для размышления. Попробуйте так:

  var b: array [,] of byte := ((1, 2, 9), (3, 4), (5, 6)); 
  b.Println;

и так:

  var b: array [,] of byte := ((1, 2), (3, 4, 9), (5, 6)); 
  b.Println;

Видимо, количество столбцов такого массива определяется по первой строке.

Это недавно исправили, обновитесь.

Не успеваю уследить %)

Надо не ожидать чего-то, а читать документацию, чтобы не вести себя, как капризная ученица из пансиона благородных девиц. Не нравится - не пользуйтесь, что за проблема?

Раздел “Помощь новичкам” предполагает, что человек приходит и просит помощи в решении возникшей проблемы. А вовсе не для рассказов, как “тут все плохо и неразумно”.

Нет, там был массив массивов. И логика другая.

var b: array [,] of byte := ((1, 2, 9), (3, 4), (5, 6)); 
  b.Println;

var b: array [,] of byte := ((1, 2), (3, 4, 9), (5, 6)); 
  b.Println;

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

Напишите в Issue.

1 лайк

Тогда и первый вариант должен быть ошибочен?

1 лайк

Действительно, оно теперь нулями строки дополняет. Как было раньше в случае с массивом массивов.

Первый вариант - просто использование умолчаний. Число групп равно 3, в первой группе элементов 3, поэтому массив 3х3. Где не хватает, инициализация не выполняется, остается значение, занесенное .NET, для типа byte это дефолтный ноль. Если когда-нибудь доделают операцию ?, позволяющую дефолт менять, можно будет заносить не нули)))

В C# при инициализации прямоугольного массива требуется одинаковая размерность внутренних массивов. И я этим согласен.

3 лайка

Че злой то такой? Болит чего? Так надо к дохтору, авось поможет.

Не надо грубить.

То есть такое умолчание годится только когда первая строка самая длинная. Немного странно… Я так понял Admin’a, что используется синтаксис описания двумерного массива и синтаксис описания массива массивов (в инициализации). И это нехорошо и должно ловиться на этапе компиляции.

Я и это наверное запрещу:

var a := new byte[](1, 2, 3, 4, 5);

Это C#-стиль, в Паскале и так куча способов это сделать.

2 лайка

Каких? Я вот знаю только Arr, но он создаёт лишнюю копию массива.

Зачем? Не надо.

2 лайка

Динамические массивы не копируются.

+1

Если просто присваивать, но у вас копируются:

function Arr<T>(params a: array of T): array of T;
begin
  Result := new T[a.Length];
  System.Array.Copy(a, Result, a.Length);
end;

А, ну тем более не надо запрещать. В new byte[](1, 2, 3, 4, 5) нет лишнего копирования.

2 лайка

Ну, тогда надо делать аналогичное с

var b := new byte[,]((1, 2), (3,4));

потому что у нас это не работает.

И я говорил, что можно инициализировать еще таким способом - как в Delphi:

var b: array [,] of byte := ((1, 2), (3,4));

Слишком много способов!!!

Вот давайте оставим что-то одно из этих двух. Конечно, я согласен, что только способ

new byte[,]((1, 2), (3,4))

позволяет передать это выражение куда угодно без заведения переменной и указания ее типа. Но тогда надо его делать.

Причем, я подолью масла в огонь - эти оба инициализатора массивов не распознают (1,2) как кортеж, а такое может быть:

var b: array of (integer,integer) := ((1, 2), (3,4));

Сейчас такое не работает

1000