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 @@ function ColCount<T>(Self: array [,] of T): integer;
         function Cols<T>(Self: array [,] of T): array of array of T; -
         +
         function ColSeq<T>(Self: array [,] of T; k: integer): sequence of T;
        k- function ColsSeq<T>(Self: array [,] of T): sequence of sequence of T; @@ -61,10 +64,14 @@
         , function Indices<T>(Self: array [,] of T; cond: (T,integer,integer) -> boolean): sequence of (integer, integer);
         , +function MatrEqual<T>(Self,b: array[,] of T): boolean; +
         function MatrSlice<T>(Self: array[,] of T; RowIndex: array of integer; ColIndex: array of integer): array[,] of T;
         . RowIndex ColIndex function MatrSlice<T>(Self: array[,] of T; FromRow, ToRow, FromCol, ToCol: integer): array[,] of T;
         FromRow, ToRow FromCol, ToCol +function operator in<T>(x: T; a: array[,] of T): boolean; +
         function Print<T>(Self: array [,] of T; w: integer := 4): array [,] of T;
         , w - function Print(Self: array [,] of real; w: integer := 7; f: integer := 2): array [,] of real; @@ -91,6 +98,8 @@
         k procedure SetRow<T>(Self: array [,] of T; k: integer; a: sequence of T);
         k +function Size<T>(Self: array [,] of T): (integer,integer); +
         procedure SwapCols<T>(Self: array [,] of T; k1, k2: integer);
         k1 k2 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