diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs
index 7b5fa98d0..d6eee5dd5 100644
--- a/Configuration/GlobalAssemblyInfo.cs
+++ b/Configuration/GlobalAssemblyInfo.cs
@@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "6";
public const string Build = "3";
- public const string Revision = "2493";
+ public const string Revision = "2494";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
diff --git a/Configuration/Version.defs b/Configuration/Version.defs
index 9dfe090d0..446c9f993 100644
--- a/Configuration/Version.defs
+++ b/Configuration/Version.defs
@@ -1,4 +1,4 @@
-%MINOR%=6
-%REVISION%=2493
%COREVERSION%=3
+%REVISION%=2494
+%MINOR%=6
%MAJOR%=3
diff --git a/InstallerSamples/Graphics/GraphWPF/MandelbrotWPF.pas b/InstallerSamples/Graphics/GraphWPF/MandelbrotWPF.pas
new file mode 100644
index 000000000..66fc93626
--- /dev/null
+++ b/InstallerSamples/Graphics/GraphWPF/MandelbrotWPF.pas
@@ -0,0 +1,44 @@
+// Демонстрация фрактальной графики. Множество Мандельброта
+// Для каждой точки комплексной плоскости z=(x,y) выполняем итерационный процесс z=z*2+c, c=(cx,cy)
+// Считаем количество итераций i до тех пор пока не выполнится условие |z|>max
+// После этого рисуем точку z=(x,y) с насыщенностью красного цвета, пропорциональной i
+uses GraphWPF;
+
+const
+ max = 10;
+ coef1 = 0.5;
+ coef2 = 0.88;
+ scalex = 0.0035;
+ scaley = 0.0035;
+ dx = 430;
+ dy = 300;
+
+begin
+ Window.Title := 'Фракталы: множество Мандельброта';
+ Window.SetSize(600,600);
+ Window.CenterOnScreen;
+ var m := Window.Width.Round;
+ var n := Window.Height.Round;
+ var a := new Color[m,n];
+ for var ix:=0 to m-1 do
+ for var iy:=0 to n-1 do
+ begin
+ var cx := scalex * (ix - dx);
+ var cy := scaley * (iy - dy);
+ var c := Cplx(cx,cy);
+ var z := Cplx(0,0);
+
+ var i := 1;
+ while i<255 do
+ begin
+ z := z*z+c;
+ if z.Magnitude>max then break;
+ i += 1;
+ end;
+ if i>=255 then a[ix,iy] := Colors.Red
+ else a[ix,iy] := RGB(255,255-i,255-i);
+ end;
+ DrawPixels(0,0,a);
+ Writeln('Время расчета = ',Milliseconds/1000,' с');
+end.
+
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array [,] of T.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array [,] of T.html
index c7ab983f3..5d94fff61 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array [,] of T.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array [,] of T.html
@@ -12,7 +12,9 @@
+
+
@@ -22,6 +24,7 @@
+
@@ -32,7 +35,7 @@
procedure SwapRows<T>(Self: array [,] of T; k1, k2: integer);
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array of T.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array of T.html
index a80f46d39..328a31741 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array of T.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Extension methods for array of T.html
@@ -1,5 +1,6 @@
+
@@ -31,6 +32,8 @@
function AdjacentFind<T>(Self: array of T; eq: (T,T)->boolean; start: integer := 0): integer;
, eq, . , -1
+function ArrEqual<T>(Self,b: array of T): boolean;
+ ,
function BinarySearch<T>(Self: array of T; x: T): integer;
function Combinations<T>(Self: array of T; m: integer): sequence of array of T;
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T generation.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T generation.html
index c83e10f71..2e6ac69ed 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T generation.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T generation.html
@@ -1,5 +1,6 @@
+
@@ -19,6 +20,8 @@
,
function Arr(a: CharRange): array of char;
,
+function ArrEqual<T>(a, b: array of T): boolean;
+ ,
function ArrFill<T>(count: integer; x: T): array of T;
count x
function ArrGen<T>(count: integer; gen: integer->T): array of T;
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T.html
index 35d7c5948..2877ad0c6 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for array of T.html
@@ -3,6 +3,7 @@
+
@@ -20,6 +21,8 @@
dim
function Low(a: array of T): integer;
0
+function MatrEqual<T>(a, b: array [,] of T): boolean;
+
procedure Reverse<T>(a: array of T);
procedure Reverse<T>(a: array of T; index, count: integer);
diff --git a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for matrixes.html b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for matrixes.html
index 871a0ba86..fae751101 100644
--- a/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for matrixes.html
+++ b/PABCNetHelp/LangGuide/PABCSystemUnit/Files/Subroutines for matrixes.html
@@ -20,10 +20,18 @@
function MatrByCol<T>(a: sequence of array of T): array [,] of T;
+function MatrByCol<T>(a: sequence of sequence of T): array [,] of T;
+
+function MatrByCol<T>(m,n: integer; a: sequence of T): array [,] of T;
+
function MatrByRow<T>(a: array of array of T): array [,] of T;
function MatrByRow<T>(a: sequence of array of T): array [,] of T;
+function MatrByRow<T>(a: sequence of sequence of T): array [,] of T;
+
+function MatrByRow<T>(m,n: integer; a: sequence of T): array [,] of T;
+
function MatrFill<T>(m, n: integer; x: T): array [,] of T;
m x n, x
function MatrGen<T>(m, n: integer; gen: (integer,integer)->T): array [,] of T;
diff --git a/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF types.html b/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF types.html
index 9ecdc898e..fe79678e4 100644
--- a/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF types.html
+++ b/PABCNetHelp/PABCUnits/GraphWPF/Files/GraphWPF types.html
@@ -4,12 +4,14 @@
+
-
+
+
GraphWPF
Alignment = (LeftTop,CenterTop,RightTop,LeftCenter,Center,RightCenter,LeftBottom,CenterBottom,RightBottom);
@@ -22,10 +24,12 @@
FontStyle = (Normal,Bold,Italic,BoldItalic);
+GBrush = System.Windows.Media.Brush;
+
GColor = System.Windows.Media.Color;
GPoint = System.Windows.Point;
-
+
GRect = System.Windows.Rect;
GWindow = System.Windows.Window;
@@ -34,5 +38,7 @@
Point = System.Windows.Point;
+Vector = System.Windows.Vector;
+
\ No newline at end of file
diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt
index 220fa0217..cfc0f2ffd 100644
--- a/Release/pabcversion.txt
+++ b/Release/pabcversion.txt
@@ -1 +1 @@
-3.6.3.2493
+3.6.3.2494
diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh
index 4d67a78d9..0526cbc51 100644
--- a/ReleaseGenerators/PascalABCNET_version.nsh
+++ b/ReleaseGenerators/PascalABCNET_version.nsh
@@ -1 +1 @@
-!define VERSION '3.6.3.2493'
+!define VERSION '3.6.3.2494'
diff --git a/TestSuite/CompilationSamples/PABCSystem.pas b/TestSuite/CompilationSamples/PABCSystem.pas
index f818ddac8..5fa1b9dcb 100644
--- a/TestSuite/CompilationSamples/PABCSystem.pas
+++ b/TestSuite/CompilationSamples/PABCSystem.pas
@@ -2120,9 +2120,12 @@ procedure Reverse(var s: string);
procedure Reverse(var s: string; index, count: integer);
/// Перемешивает динамический массив случайным образом
procedure Shuffle(a: array of T);
+/// Сравнивает матрицы на равенство
+function MatrEqual(a, b: array [,] of T): boolean;
/// Перемешивает список случайным образом
procedure Shuffle(l: List);
+
// -----------------------------------------------------
//>> Подпрограммы для генерации последовательностей # Subroutines for sequence generation
// -----------------------------------------------------
@@ -2242,6 +2245,9 @@ function ReadArrReal(prompt: string; n: integer): array of real;
/// Выводит приглашение к вводу и возвращает массив из n строк, введенных с клавиатуры
function ReadArrString(prompt: string; n: integer): array of string;
+/// Возвращает, совпадают ли массивы
+function ArrEqual(a, b: array of T): boolean;
+
// -----------------------------------------------------
//>> Подпрограммы для создания двумерных динамических массивов # Subroutines for matrixes
// -----------------------------------------------------
@@ -2249,18 +2255,25 @@ function ReadArrString(prompt: string; n: integer): array of string;
function Matr(m,n: integer; params data: array of T): array [,] of T;
/// Возвращает двумерный массив, заполненный значениями из одномерных массивов
function Matr(params aa: array of array of T): array [,] of T;
+
/// Генерирует двумерный массив по массиву массивов строк
function MatrByRow(a: array of array of T): array [,] of T;
/// Генерирует двумерный массив по последовательности массивов строк
function MatrByRow(a: sequence of array of T): array [,] of T;
/// Генерирует двумерный массив по последовательности последовательностей строк
function MatrByRow(a: sequence of sequence of T): array [,] of T;
+/// Генерирует двумерный массив по строкам из последовательности
+function MatrByRow(m,n: integer; a: sequence of T): array [,] of T;
+
/// Генерирует двумерный массив по массиву массивов столбцов
function MatrByCol(a: array of array of T): array [,] of T;
/// Генерирует двумерный массив по последовательности массивов столбцов
function MatrByCol(a: sequence of array of T): array [,] of T;
/// Генерирует двумерный массив по последовательности последовательностей столбцов
function MatrByCol(a: sequence of sequence of T): array [,] of T;
+/// Генерирует двумерный массив по столбцам из последовательности
+function MatrByCol(m,n: integer; a: sequence of T): array [,] of T;
+
/// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями
function MatrRandom(m: integer := 5; n: integer := 5; a: integer := 0; b: integer := 100): array [,] of integer;
/// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями
@@ -2770,6 +2783,7 @@ const
BAD_COL_INDEX_FROM = 'FromCol выходит за пределы индексов строк двумерного массива!!FromCol is out of range of 2-dim array column indexes';
BAD_COL_INDEX_TO = 'ToCol выходит за пределы индексов строк двумерного массива!!ToCol is out of range of 2-dim array column indexes';
SLICE_SIZE_AND_RIGHT_VALUE_SIZE_MUST_BE_EQUAL = 'Размеры среза и присваиваемого выражения должны быть равны!!Slice size and assigned expression size must be equal';
+ MATR_DIMENSIONS_MUST_BE_EQUAL = 'Размеры матриц должны совпадать!!Matrix dimensions must be equal';
// -----------------------------------------------------
// WINAPI
@@ -4831,6 +4845,21 @@ begin
raise new System.ArgumentException('Функцию ReadArrString запрещено вызывать без параметров')
end;
+function ArrEqual(a, b: array of T): boolean;
+begin
+ Result := True;
+ if a.Length<>b.Length then
+ Result := False
+ else
+ for var i:=0 to a.Length-1 do
+ if a[i]<>b[i] then
+ begin
+ Result := False;
+ exit;
+ end;
+end;
+
+
function ReadSeqInteger(n: integer): sequence of integer;
begin
@@ -10604,6 +10633,29 @@ begin
Result := Self.GetLength(1);
end;
+/// Количество столбцов в двумерном массиве
+function Size(Self: array [,] of T): (integer,integer); extensionmethod;
+begin
+ Result := (Self.GetLength(0),Self.GetLength(1));
+end;
+
+/// Есть ли элемент в матрице
+function operator in(x: T; a: array[,] of T): boolean; extensionmethod;
+begin
+ var (m,n) := a.Size;
+ Result := False;
+ for var i:=0 to m-1 do
+ for var j:=0 to n-1 do
+ if a[i,j]=x then
+ begin
+ Result := True;
+ exit;
+ end;
+end;
+
+/// Есть ли элемент в матрице
+function MatrEqual(Self,b: array[,] of T): boolean; extensionmethod := MatrEqual(Self,b);
+
/// Вывод двумерного массива, w - ширина поля вывода
function Print(Self: array [,] of T; w: integer := 4): array [,] of T; extensionmethod;
begin
@@ -11016,6 +11068,28 @@ begin
Result := res;
end;
+/// Генерирует двумерный массив по строкам из последовательности
+function MatrByRow(m,n: integer; a: sequence of T): array [,] of T;
+begin
+ var res := new T[m,n];
+ var (i,j,num) := (0,0,0);
+ foreach var x in a do
+ begin
+ if num >= m*n then
+ break;
+ res[i,j] := x;
+ num += 1;
+ j += 1;
+ if j >= n then
+ begin
+ j := 0;
+ i += 1;
+ end;
+ end;
+ Result := res;
+end;
+
+
/// Генерирует двумерный массив по массиву массивов столбцов
function MatrByCol(a: array of array of T): array [,] of T;
begin
@@ -11064,6 +11138,27 @@ begin
Result := res;
end;
+/// Генерирует двумерный массив по столбцам из последовательности
+function MatrByCol(m,n: integer; a: sequence of T): array [,] of T;
+begin
+ var res := new T[m,n];
+ var (i,j,num) := (0,0,0);
+ foreach var x in a do
+ begin
+ if num >= m*n then
+ break;
+ res[i,j] := x;
+ num += 1;
+ i += 1;
+ if i >= m then
+ begin
+ i := 0;
+ j += 1;
+ end;
+ end;
+ Result := res;
+end;
+
// Реализация операций с матрицами - только после введения RowCount и ColCount
function MatrRandom(m: integer; n: integer; a, b: integer): array [,] of integer;
begin
@@ -11131,6 +11226,24 @@ begin
Result[i, j] := ReadReal;
end;
+function MatrEqual(a, b: array [,] of T): boolean;
+begin
+ var (m1,n1) := a.Size;
+ var (m2,n2) := b.Size;
+ Result := True;
+ if (m1<>m2) or (n1<>n2) then
+ Result := False
+ else
+ for var i:=0 to m1-1 do
+ for var j:=0 to n1-1 do
+ if a[i,j]<>b[i,j] then
+ begin
+ Result := False;
+ exit;
+ end;
+end;
+
+
// -----------------------------------------------------
//>> Методы расширения одномерных динамических массивов # Extension methods for array of T
// -----------------------------------------------------
@@ -11143,6 +11256,9 @@ end;
// Дополнения май 2020: Combinations, Permutations
+/// Возвращает, совпадают ли массивы
+function ArrEqual(Self,b: array of T): boolean; extensionmethod := ArrEqual(Self,b);
+
/// Заполняет массив случайными значениями в диапазоне от a до b
procedure FillRandom(Self: array of integer; a,b: integer); extensionmethod;
begin
diff --git a/TestSuite/errors/err0363_T_T.pas b/TestSuite/errors/err0363_T_T.pas
new file mode 100644
index 000000000..8ce461f3e
--- /dev/null
+++ b/TestSuite/errors/err0363_T_T.pas
@@ -0,0 +1,8 @@
+type
+ T = class
+ public T: T;
+ end;
+
+begin
+
+end.
\ No newline at end of file
diff --git a/bin/Lib/PABCSystem.pas b/bin/Lib/PABCSystem.pas
index f818ddac8..5fa1b9dcb 100644
--- a/bin/Lib/PABCSystem.pas
+++ b/bin/Lib/PABCSystem.pas
@@ -2120,9 +2120,12 @@ procedure Reverse(var s: string);
procedure Reverse(var s: string; index, count: integer);
/// Перемешивает динамический массив случайным образом
procedure Shuffle(a: array of T);
+/// Сравнивает матрицы на равенство
+function MatrEqual(a, b: array [,] of T): boolean;
/// Перемешивает список случайным образом
procedure Shuffle(l: List);
+
// -----------------------------------------------------
//>> Подпрограммы для генерации последовательностей # Subroutines for sequence generation
// -----------------------------------------------------
@@ -2242,6 +2245,9 @@ function ReadArrReal(prompt: string; n: integer): array of real;
/// Выводит приглашение к вводу и возвращает массив из n строк, введенных с клавиатуры
function ReadArrString(prompt: string; n: integer): array of string;
+/// Возвращает, совпадают ли массивы
+function ArrEqual(a, b: array of T): boolean;
+
// -----------------------------------------------------
//>> Подпрограммы для создания двумерных динамических массивов # Subroutines for matrixes
// -----------------------------------------------------
@@ -2249,18 +2255,25 @@ function ReadArrString(prompt: string; n: integer): array of string;
function Matr(m,n: integer; params data: array of T): array [,] of T;
/// Возвращает двумерный массив, заполненный значениями из одномерных массивов
function Matr(params aa: array of array of T): array [,] of T;
+
/// Генерирует двумерный массив по массиву массивов строк
function MatrByRow(a: array of array of T): array [,] of T;
/// Генерирует двумерный массив по последовательности массивов строк
function MatrByRow(a: sequence of array of T): array [,] of T;
/// Генерирует двумерный массив по последовательности последовательностей строк
function MatrByRow(a: sequence of sequence of T): array [,] of T;
+/// Генерирует двумерный массив по строкам из последовательности
+function MatrByRow(m,n: integer; a: sequence of T): array [,] of T;
+
/// Генерирует двумерный массив по массиву массивов столбцов
function MatrByCol(a: array of array of T): array [,] of T;
/// Генерирует двумерный массив по последовательности массивов столбцов
function MatrByCol(a: sequence of array of T): array [,] of T;
/// Генерирует двумерный массив по последовательности последовательностей столбцов
function MatrByCol(a: sequence of sequence of T): array [,] of T;
+/// Генерирует двумерный массив по столбцам из последовательности
+function MatrByCol(m,n: integer; a: sequence of T): array [,] of T;
+
/// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями
function MatrRandom(m: integer := 5; n: integer := 5; a: integer := 0; b: integer := 100): array [,] of integer;
/// Возвращает двумерный массив размера m x n, заполненный случайными целыми значениями
@@ -2770,6 +2783,7 @@ const
BAD_COL_INDEX_FROM = 'FromCol выходит за пределы индексов строк двумерного массива!!FromCol is out of range of 2-dim array column indexes';
BAD_COL_INDEX_TO = 'ToCol выходит за пределы индексов строк двумерного массива!!ToCol is out of range of 2-dim array column indexes';
SLICE_SIZE_AND_RIGHT_VALUE_SIZE_MUST_BE_EQUAL = 'Размеры среза и присваиваемого выражения должны быть равны!!Slice size and assigned expression size must be equal';
+ MATR_DIMENSIONS_MUST_BE_EQUAL = 'Размеры матриц должны совпадать!!Matrix dimensions must be equal';
// -----------------------------------------------------
// WINAPI
@@ -4831,6 +4845,21 @@ begin
raise new System.ArgumentException('Функцию ReadArrString запрещено вызывать без параметров')
end;
+function ArrEqual(a, b: array of T): boolean;
+begin
+ Result := True;
+ if a.Length<>b.Length then
+ Result := False
+ else
+ for var i:=0 to a.Length-1 do
+ if a[i]<>b[i] then
+ begin
+ Result := False;
+ exit;
+ end;
+end;
+
+
function ReadSeqInteger(n: integer): sequence of integer;
begin
@@ -10604,6 +10633,29 @@ begin
Result := Self.GetLength(1);
end;
+/// Количество столбцов в двумерном массиве
+function Size(Self: array [,] of T): (integer,integer); extensionmethod;
+begin
+ Result := (Self.GetLength(0),Self.GetLength(1));
+end;
+
+/// Есть ли элемент в матрице
+function operator in(x: T; a: array[,] of T): boolean; extensionmethod;
+begin
+ var (m,n) := a.Size;
+ Result := False;
+ for var i:=0 to m-1 do
+ for var j:=0 to n-1 do
+ if a[i,j]=x then
+ begin
+ Result := True;
+ exit;
+ end;
+end;
+
+/// Есть ли элемент в матрице
+function MatrEqual(Self,b: array[,] of T): boolean; extensionmethod := MatrEqual(Self,b);
+
/// Вывод двумерного массива, w - ширина поля вывода
function Print(Self: array [,] of T; w: integer := 4): array [,] of T; extensionmethod;
begin
@@ -11016,6 +11068,28 @@ begin
Result := res;
end;
+/// Генерирует двумерный массив по строкам из последовательности
+function MatrByRow(m,n: integer; a: sequence of T): array [,] of T;
+begin
+ var res := new T[m,n];
+ var (i,j,num) := (0,0,0);
+ foreach var x in a do
+ begin
+ if num >= m*n then
+ break;
+ res[i,j] := x;
+ num += 1;
+ j += 1;
+ if j >= n then
+ begin
+ j := 0;
+ i += 1;
+ end;
+ end;
+ Result := res;
+end;
+
+
/// Генерирует двумерный массив по массиву массивов столбцов
function MatrByCol(a: array of array of T): array [,] of T;
begin
@@ -11064,6 +11138,27 @@ begin
Result := res;
end;
+/// Генерирует двумерный массив по столбцам из последовательности
+function MatrByCol(m,n: integer; a: sequence of T): array [,] of T;
+begin
+ var res := new T[m,n];
+ var (i,j,num) := (0,0,0);
+ foreach var x in a do
+ begin
+ if num >= m*n then
+ break;
+ res[i,j] := x;
+ num += 1;
+ i += 1;
+ if i >= m then
+ begin
+ i := 0;
+ j += 1;
+ end;
+ end;
+ Result := res;
+end;
+
// Реализация операций с матрицами - только после введения RowCount и ColCount
function MatrRandom(m: integer; n: integer; a, b: integer): array [,] of integer;
begin
@@ -11131,6 +11226,24 @@ begin
Result[i, j] := ReadReal;
end;
+function MatrEqual(a, b: array [,] of T): boolean;
+begin
+ var (m1,n1) := a.Size;
+ var (m2,n2) := b.Size;
+ Result := True;
+ if (m1<>m2) or (n1<>n2) then
+ Result := False
+ else
+ for var i:=0 to m1-1 do
+ for var j:=0 to n1-1 do
+ if a[i,j]<>b[i,j] then
+ begin
+ Result := False;
+ exit;
+ end;
+end;
+
+
// -----------------------------------------------------
//>> Методы расширения одномерных динамических массивов # Extension methods for array of T
// -----------------------------------------------------
@@ -11143,6 +11256,9 @@ end;
// Дополнения май 2020: Combinations, Permutations
+/// Возвращает, совпадают ли массивы
+function ArrEqual(Self,b: array of T): boolean; extensionmethod := ArrEqual(Self,b);
+
/// Заполняет массив случайными значениями в диапазоне от a до b
procedure FillRandom(Self: array of integer; a,b: integer); extensionmethod;
begin
diff --git a/bin/PascalABCNET.chm b/bin/PascalABCNET.chm
index 9ec26435a..6a00647bf 100644
Binary files a/bin/PascalABCNET.chm and b/bin/PascalABCNET.chm differ