array of array of Int32
или
array [,] of Int32
для прямоугольного. Сергей опередил
array of array of Int32
или
array [,] of Int32
для прямоугольного. Сергей опередил
понял, спасибо
var массив := new array of array of Int32[3];
массив[0] := new Int32[5];
массив[1] := new Int32[4];
массив[2] := new Int32[10];
Заполнять так:
массив[][] := ...
при таком объявлении, что-то не пашет, Серегин вариант работает.
Нет, так не сработает, внешний массив только через 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.