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

понял, спасибо :slight_smile:

var массив := new array of array of Int32[3];
массив[0] := new Int32[5];
массив[1] := new Int32[4];
массив[2] := new Int32[10];

Заполнять так:

массив[][] := ...
1 лайк

при таком объявлении, что-то не пашет, Серегин вариант работает.

Нет, так не сработает, внешний массив только через SetLength, если не инициализировать всё сразу.

И кроме того, вы не правильно написали. Если через такую запись - new array of integer[3], это должно было бы создать массив массивов, но почему то не работает.

Нет, ну можно ещё так:

begin
  var массив: array of array of integer;
  SetLength(массив,3);
  массив[0] := new integer[5];
  массив[1] := new integer[4];
  массив[2] := new integer[10];
end.

Мне кажется, такое работало раньше. Клясться не буду, но что-то подобное встречал.

Хм, а тут то где еррор?

Uses System;

procedure SetLength<T>(var arr: array of T; length: Int32);
begin
  arr := new T[length];
end;

begin
  var массив: array of array of Int32;
  SetLength(массив, 3);
  массив[0] := new Int32[5];
  массив[1] := new Int32[4];
  массив[2] := new Int32[10];
end.

Сергей, нашёл я уже. var пропустил.

Значит, можно писать так, как предложил Сергей, сперва подписав метод:

procedure SetLength<T>(var arr: array of T; length: Int32);
begin
  arr := new T[length];
end;
type
  t1<T>=class
    
    ///Эта процедура возвращает переменную типа {T}
    function f1 := default(T);
    
  end;

begin
  var a := new t1<byte>;
  a.f1
end.

Можно ли как то сделать описание таким, чтоб {T} в нём заменило на тип шаблона. То есть чтоб описание по наведению на a.f1 показывало byte вместо T?

Есть кортежи, которые особенно удобны для множественного присваивания вроде (a,b):=(b,a). Очевидно, что если переменные a и b обменялись значениями, присваивание происходит “статически” – в “копии” (слепок) памяти на момент вызова, поэтому “динамические” аналоги

(b,a,b):=(a+b, b-a, b-a);
//или xor-аналога
(a,b,a):=(a xor b ,a xor b ,a xor b);

приходиться “разворачивать” в последовательные присваивания, но может есть средства и от такого нюанса?

Какие нюансы? Вы все правильно написали: правая часть статична, все выражения вычисляются и по значению передаются, условно можно считать, одномоментно, в левую часть.

Алекс, так о том и речь – можно ли как-то “динамически” рассчитывать, учитывая предыдущие изменения? Видимо, не очень актуально

Нельзя, кортеж - он ведь конструкция неизменяемая. Read-only. А было бы можно - вообще беда. Тут где можно, везде ленивость организована, плюс есть и оптимизация какая-то. Как при таком хитром присваивании Вы угадаете, в каком порядке присваивание пошло бы?

И - да, актуальности мало. Если так надо, что мешает разбить на операторы, тем более ,что если вопрос места, можно на одной строке записать.

Не все кортежи неизменяемы. Тип System.ValueTuple<T, T2, …> - тому пример. Чтобы не быть голословным, приведу пример его использования:

uses System;
begin
  var (x, y) := (new Tuple&<byte, byte>(0, 0), new ValueTuple&<byte, byte>(0, 0));
  //x.Item1 := 2; // Ошибка, так нельзя. System.Tuple<T, T2> - неизменяемый кортеж.
  y.Item1 := 2; // А так - можно. System.ValueTuple<T, T2> - изменяемый кортеж.
end.

. Кортежи, описываемые в виде (Item1, Item2, …) обладают типом System.Tuple<T, T2, …>:

begin
  var x := (0, 0);
  Writeln(x.GetType());
end.

.

Это не кортеж

Я знаю. Я привел пример сразу двух кортежей.

На всякий случай. Это разворачивается в 6 присваиваний:

var t1 := a+b;
var t2 := b-a;
var t3 := b-a;
b := t1;
a := t2;
b := t3;
type
  TClass = class
    property P: () -> () -> integer read () -> () -> 0; // Program9.pas(3) : Встречено ')', а ожидалось выражение
  end;
  
begin
end.

@Admin, как заставить свойство вернуть функцию, возвращающую integer?

А, понятно

Чуть более ласково и нежно:

type
  TClass = class
    property P: () -> () -> integer read () -> begin Result := () -> 0; end;
  end;
  
begin
end.

Вы можете дать чёткие правила, в каких случаях (подобных данному) ставить begin-end ?