Открытые массивы в параметрах процедур и функций 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Открытые массивы в параметрах процедур и функций



function IntArrayMax(const A: array of integer): Integer;

var i: integer;

Begin

Result:= A[Low(A)];

for i:=Succ(Low(A)) to High(A) do

if Result<A[i] then

Result:= A[i];

end;

 

M:= IntArrayMax(B);

M:= IntArrayMax(Slice(B,N));

M:= IntArrayMax([0,I,I+J,J]);

Когда знаем размер массива то просто пишем в кв скобках диапозон

2Когда мы не знаем какой длины массив и массив надо обрезать,то используем функцию:

Описание
Функция Slice создает подмассив из первых Count элементов массива SourceArray. Эта функция может использоваться ТОЛЬКО как аргумент для параметра с типом "открытый массив" в процедуре или функции. Параметр с типом "открытый массив" имеет неизвестное число элементов на момент компиляции. Это позволяет процедурам работать с массивами переменной длины.
 

 

Пример кода: Передача сектора массива в процедуру
var i: Integer; Source: array[0..4] of Integer; begin // Создание исходного массива с значениями элементов 0..4 для элементов 0..4 for i:= 0 to 4 do Source[i]:= i; // Использование команды Slice, чтобы передать только первые 3 элемента // Source как открытый массив в процедуру ShowSlice. ShowSlice(Slice(Source, 3)); end; // Показ массива неизвестного размера - он передан как 'Открытый' массив procedure TForm1.ShowSlice(SubArray: array of Integer); var i: Integer; begin // Показ каждого элемента этого массива for i:= 0 to Length(SubArray)-1 do ShowMessage('SubArray['+IntToStr(i)+']: '+ IntToStr(SubArray[i])); end;
SubArray[0]: 0 SubArray[1]: 1 SubArray[2]: 2

3И можно еще (3ий способ передачи массива!)просто в квадратных скобках указать те элементы массива,которые нам надо будет потом использовать!

Функция Format использует этот прием для того,чтобы передавать аргументы.

http://www.programmersclub.ru/array/

http://www.transl-gunsmoker.ru/2009/09/of-const.html (ПРО ОТКР МАССИВ)

 

Тип данных запись. Способы работы с записями и их полями в коде. Упакованные и неупакованные записи.

Записи

Запись — это структура данных, доступ к элементам которой осуществляется по

имени (названию элемента). Элементы записи могут иметь разный тип, поэтому

при описании записи надо указывать и название каждого элемента, и его тип.

Описание записи имеет следующий вид:

type название-типа-записи =

record

название-элемента: тип-элемента,-

end,-

Урок 1. Язык Delphi (Object Pascol) и его использование

В качестве названий элементов выступают обычные идентификаторы Паскаля —

так же, как при описании переменных. Например, описание записи, характеризу-

ющей футбольную команду (содержащую название команды, города, страны и год

создания) может выглядеть так:

type TFootballTeamRecord =

record

Name: TFootballTeam;

City, Country: string;

Year: 1800..3000;

end;

Элемент записи Year (год) можно описать как имеющий тип Integer, но более кор-

ректно явно указать его допустимый диапазон значений.

Для обращения к элементу записи сначала указывается имя переменной, затем

точка и название соответствующего элемента.

var T: TFootballTeamRecord;

begin

Т.Name:= Spartak;

Т.City:= 'Москва';

Когда надо задать значения большому числу элементов переменной-записи, каждый

раз предварительно указывать ее имя неудобно. Б Паскале имеется ключевое слово

with, которое позволяет опускать имя переменной в логическом блоке. При этом

перед каждым упоминанием элемента в этом блоке имя переменной будет ставиться

автоматически.

with T do

Begin

Name := Spartak,-

City:= 'Москва';

end,-

Если в логическом блоке, охваченном словом with, требуется использовать также

переменную, имя которой совпадает с названием одного из элементов записи, перед

ней необходимо указать название модуля (или программы), в котором эта перемен-

ная описана.

var T: TFootballTeamRecord;

Name: string;

Begin

Name:= 'Москва';

with T do

begin

Name:= Spartak;

City:= Projectl.Name;

end;

Определение собственных типов дойных 45

Если в блоке with модуль для конкретной переменной не указан, то компилятор

прежде всего ищет ее имя в списке названий элементов записи, и только потом -

среди обычных переменных.

После ключевого слова with можно указывать но одно, а несколько имен перемен-

ных-записей:

with T, MyTeam, Foo do

begin

Записи с вариантами

Строго фиксированная структура записи ограничивает возможность ее применения. Поэтому в языке Delphi имеется возможность задать для записи несколько вариантов структуры. Такие записи называются записями с вариантами. Они состоят из необязательной фиксированной и вариантной частей.

Вариантная часть напоминает условный оператор case. Между словами case и of записывается особое поле записи – поле признака. Оно определяет, какой из вариантов в данный момент будет активизирован. Поле признака должно быть равно одному из расположенных следом значений. Каждому значению сопоставляется вариант записи. Он заключается в круглые скобки и отделяется от своего значения двоеточием. Пример описания записи с вариантами:

type
TFigure = record
X, Y: Integer;
case Kind: Integer of
0: (Width, Height: Integer); // прямоугольник
1: (Radius: Integer); // окружность
end;

Обратите внимание, что у вариантной части нет отдельного end, как этого можно было бы ожидать по аналогии с оператором case. Одно слово end завершает и вариантную часть, и всю запись.

На этом мы пока закончим рассказ о записях, но хотим надеяться, что читатель уже догодался об их потенциальной пользе при организации данных с более сложной структурой.

Вне зависимости от того, каким способом была определена запись (на основе таблицы, курсора или явного использования оператора TYPE для записи), работа со всеми записями ведется одинаково. Вы можете ра­ботать с данными, хранящимися в записи, на уровне записи (запись воспринимается как единое целое), а также обращаться напрямую к ее отдельным полям.

Операции на уровне записи

Когда вы работаете на уровне записи, то какие бы то ни было ссылки на отдельные поля отсутствуют. На текущий момент PL/SQL поддер­живает следующие операции над записями:

• Вы можете копировать содержимое одной записи в другую (в слу­чае совместимости их структур, то есть у них должно быть одинако­вое количество полей и одинаковые или взаимно преобразуемые ти­пы данных).

• Вы можете присваивать записи значение NULL простым присваива­нием.

• Вы можете определять и передавать запись как аргумент в списке параметров.

• Вы можете возвращать (оператором RETURN) запись из функции.

Операции на уровне записей можно применять к любым записям с со­вместимыми структурами. Другими словами, записи должны иметь одинаковое количество полей и одинаковые или взаимно преобразуе­мые типы данных, но они не обязаны быть одного типа. Предполо­жим, что мы создали такую таблицу:

CREATE TABLE cust_sales_roundup (customer_id NUMBER (5), customer_name VARCHAR2 (100), total_sales NUMBER (15,2)

);

Три записи, определенные подобным образом, имеют совместимые структуры, и я могу перемешивать и сопоставлять данные в этих за­писях:

DECLARE

cust_sales_roundup_rec cust_sales_roundup%ROWTYPE;

CURSOR cust_sales_cur IS SELECT * FROM cust_sales_roundup; cust_sales_rec cust_sales_cur%ROWTYPE;

TYPE customer_sales_rectype IS RECORD (customer_id NUMBER(5), customer_name customer.name%TYPE, total_sales NUMBER(15,2)

);

prefererred_cust_rec customer_sales_rectype;

BEGIN

Присвоить одну запись другой. cust_sales_roundup_rec:= cust_sales_rec; prefererred_cust_rec:= cust_sales_rec;

END;

Операции на уровне поля

Если вам необходимо получить доступ к полю записи (чтобы прочи­тать или изменить значение), необходимо использовать точечную но­тацию, в точности как при ссылке на столбец определенной таблицы базы данных. Синтаксис ссылки на поле будет таким:

[имя_схемы.][имя_пакета.]имя_записи. имя_поля

Имя пакета должно быть указано только в том случае, если запись оп­ределяется в спецификации пакета, отличного от того, в котором вы работаете в настоящий момент. Имя схемы следует указывать лишь в том случае, если пакет принадлежит не той схеме, в которой вы ком­пилируете свой код.

После того как вы определили поле с помощью точечной нотации, вы можете ссылаться на значение этого поля и изменять его в соответст­вии с обычными правилами, принятыми в PL/SQL.

Упакованные типы

При описании массива (или других структурных типов) можно указать зарезерви-

рованное слово packed, которое означает, что переменные этого типа будут разме-

щаться в памяти компьютера плотно и компактно. Такой подход позволяет сэконо-

мить оперативную память, отведенную для данных, но значительно понижает

скорость работы программы при работе с упакованными массивами.

type TpA = packed arraylL.S] of integer;

type TpR = packed record

N: integer;

S: etring[50];

end;

Упакованные записи

Пару слов о том, что такое упакованные записи, и с чем их едят. По умолчанию память под записи выделяется не очень экономно - помимо самих данных добавляются и служебные байты, которые отделяют блоки данных друг от друга. Существует принудительный способ заставить Delphi упаковать запись, т.е. минимизировать занимаемую ей память. Делается это указанием слова packed перед словом record. Разница порой может быть достаточно ощутимой. Пример: запись из строки длиной 5 символов, одного символа и трёх чисел разного типа. Объявим две разные записи: одна обычная, а другая упакованная:

TRecord1 = packed record Name: String[5]; A: LongInt; C: Char; D: Double; N: Integer;end; TRecord2 = record Name: String[5]; A: LongInt; C: Char; D: Double; N: Integer;end;

А теперь самое интересное: посмотрим, сколько памяти занимает каждая из записей. Сделаем это функцией SizeOf():

var R1: TRecord1; R2: TRecord2;begin ShowMessage(IntToStr(SizeOf(R1))); ShowMessage(IntToStr(SizeOf(R2)));end;

В первом сообщении мы увидим 24, а во втором 32. Обычная запись занимает на треть больше памяти, чем упакованная! А теперь представьте, что у вас 100 000 таких записей?

Тем не менее, не стоит пренебрегать этим способом экономии памяти. В некоторых случаях использование пакованных записей может создавать разные ошибки в работе программы. Понять, что дело именно в packed, удаётся далеко не сразу. Так что, если храните десяток отрезков - не торопитесь паковать - если и выиграете, то не сильно.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 205; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.12.172 (0.025 с.)