Советы по Delphi. Версия 1.0.6 - [13]
>--
>*)
>unit DynArray;
>INTERFACE
>uses SysUtils;
>Type TDynArrayBaseType = double;
>Const vMaxElements = (High(Cardinal) – $f) div sizeof(TDynArrayBaseType);
>{= гарантирует максимально возможный массив =}
>Type
> TDynArrayNDX = 1..vMaxElements;
> TArrayElements = array[TDynArrayNDX] of TDynArrayBaseType;
> {= самый большой массив TDynArrayBaseType, который мы может объявить =}
> PArrayElements = ^TArrayElements;
> {= указатель на массив =}
> EDynArrayRangeError = CLASS(ERangeError);
> TDynArray = CLASS
> Private
> fDimension: TDynArrayNDX;
> fMemAllocated: word;
> Function GetElement(N: TDynArrayNDX): TDynArrayBaseType;
> Procedure SetElement(N: TDynArrayNDX; const NewValue: TDynArrayBaseType);
> Protected
> Elements : PArrayElements;
> Public
> Constructor Create(NumElements : TDynArrayNDX);
> Destructor Destroy; override;
> Procedure Resize(NewDimension : TDynArrayNDX); virtual;
> Property dimension: TDynArrayNDX read fDimension;
> Property Element[N : TDynArrayNDX] : TDynArrayBaseType read GetElement write SetElement; default;
> END;
>Const
> vMaxMatrixColumns = 65520 div sizeof(TDynArray);
> {= построение матрицы класса с использованием массива объектов TDynArray =}
>Type
> TMatrixNDX = 1..vMaxMatrixColumns;
> TMatrixElements = array[TMatrixNDX] of TDynArray;
> {= каждая колонка матрицы будет динамическим массивом =}
> PMatrixElements = ^TMatrixElements;
> {= указатель на массив указателей… =}
> TDynaMatrix = CLASS
> Private
> fRows : TDynArrayNDX;
> fColumns : TMatrixNDX;
> fMemAllocated : longint;
> Function GetElement(row: TDynArrayNDX; column: TMatrixNDX): TDynArrayBaseType;
> Procedure SetElement(row: TDynArrayNDX; column: TMatrixNDX; const NewValue: TDynArrayBaseType);
> Protected
> mtxElements: PMatrixElements;
> Public
> Constructor Create(NumRows : TDynArrayNDX; NumColumns : TMatrixNDX);
> Destructor Destroy; override;
> Property rows: TDynArrayNDX read fRows;
> Property columns: TMatrixNDX read fColumns;
> Property Element[row : TDynArrayNDX; column : TMatrixNDX] : TDynArrayBaseType read GetElement write SetElement; default;
> END;
>IMPLEMENTATION
>(*
> --
> -- методы TDynArray
> --
>*)
>Constructor TDynArray.Create(NumElements : TDynArrayNDX);
>BEGIN {==TDynArray.Create==}
> inherited Create;
> fDimension:= NumElements;
> GetMem(Elements, fDimension*sizeof(TDynArrayBaseType));
> fMemAllocated:= fDimension*sizeof(TDynArrayBaseType);
> FillChar(Elements^, fMemAllocated, 0);
>END; {==TDynArray.Create==}
>Destructor TDynArray.Destroy;
>BEGIN {==TDynArray.Destroy==}
> FreeMem(Elements, fMemAllocated);
> inherited Destroy;
>END; {==TDynArray.Destroy==}
>Procedure TDynArray.Resize(NewDimension: TDynArrayNDX);
>BEGIN {TDynArray.Resize==}
> if (NewDimension < 1) then raise EDynArrayRangeError.CreateFMT('Индекс вышел за границы диапазона : %d', [NewDimension]);
> Elements:= ReAllocMem(Elements, fMemAllocated, NewDimension*sizeof(TDynArrayBaseType));
> fDimension:= NewDimension;
> fMemAllocated:= fDimension*sizeof(TDynArrayBaseType);
>END; {TDynArray.Resize==}
>Function TDynArray.GetElement(N: TDynArrayNDX) : TDynArrayBaseType;
>BEGIN {==TDynArray.GetElement==}
> if (N < 1) OR (N > fDimension) then raise EDynArrayRangeError.CreateFMT('Индекс вышел за границы диапазона : %d', [N]);
> result:= Elements^[N];
>END; {==TDynArray.GetElement==}
>Procedure TDynArray.SetElement(N: TDynArrayNDX; const NewValue: TDynArrayBaseType);
>BEGIN {==TDynArray.SetElement==}
> if (N < 1) OR (N > fDimension) then raise EDynArrayRangeError.CreateFMT('Индекс вышел за границы диапазона : %d', [N]);
> Elements^[N]:= NewValue;
>END; {==TDynArray.SetElement==}
>(*
> --
> -- методы TDynaMatrix
> --
>*)
>Constructor TDynaMatrix.Create(NumRows: TDynArrayNDX; NumColumns: TMatrixNDX);
>Var col : TMatrixNDX;
>BEGIN {==TDynaMatrix.Create==}
> inherited Create;
> fRows:= NumRows;
> fColumns:= NumColumns;
> {= выделение памяти для массива указателей (т.е. для массива TDynArrays) =}
> GetMem(mtxElements, fColumns*sizeof(TDynArray));
> fMemAllocated:= fColumns*sizeof(TDynArray);
> {= теперь выделяем память для каждого столбца матрицы =}
> for col := 1 to fColumns do BEGIN
> mtxElements^[col]:= TDynArray.Create(fRows);
> inc(fMemAllocated, mtxElements^[col].fMemAllocated);
> END;
>END; {==TDynaMatrix.Create==}
>Destructor TDynaMatrix.Destroy;
>Var col : TMatrixNDX;
>BEGIN {==TDynaMatrix.Destroy;==}
> for col:= fColumns downto 1 do BEGIN
> dec(fMemAllocated, mtxElements^[col].fMemAllocated);
> mtxElements^[col].Free;
> END;
> FreeMem(mtxElements, fMemAllocated);
> inherited Destroy;
>END; {==TDynaMatrix.Destroy;==}
>Function TDynaMatrix.GetElement(row: TDynArrayNDX; column: TMatrixNDX): TDynArrayBaseType;
>BEGIN {==TDynaMatrix.GetElement==}
> if (row < 1) OR (row > fRows) then raise EDynArrayRangeError.CreateFMT('Индекс строки вышел за границы диапазона : %d', [row]);
> if (column < 1) OR (column > fColumns) then raise EDynArrayRangeError.CreateFMT('Индекс столбца вышел за границы диапазона : %d', [column]);
> result:= mtxElements^[column].Elements^[row];
>END; {==TDynaMatrix.GetElement==}
>Procedure TDynaMatrix.SetElement(row: TDynArrayNDX; column: TMatrixNDX; const NewValue: TDynArrayBaseType);
Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Когда приходится инкапсулировать, то иногда лучше меньше, чем большеЯ начну со следующего утверждения: Если вы пишете функцию, которая может быть выполнена или как метод класса, или быть внешней по отношению к классу, Вы должны предпочесть ее реализацию без использования метода. Такое решение увеличивает инкапсуляцию класса. Когда Вы думаете об использовании инкапсуляции, Вы должны думать том, чтобы не использовать методы.Удивлены? Читайте дальше.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Embedded system software. General requirements for development and documentationСтандарт подготовлен в развитие ГОСТ Р ИСО/МЭК 12207-99 «Информационная технология. Процессы жизненного цикла программных средств» с целью учета специфики разработки и документирования программного обеспечения встроенных систем реального времени.
«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.