Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Открытые массивы в параметрах процедур и функций
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Когда мы не знаем какой длины массив и массив надо обрезать,то используем функцию:
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 Обратите внимание, что у вариантной части нет отдельного 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 с.) |