Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АИСД ШПОРА.docx
Скачиваний:
6
Добавлен:
27.09.2019
Размер:
54.62 Кб
Скачать

11.Массивы как структуры данных. Передача данных через параметры.

Параметры-значения, параметры-переменные

Function FF( a, b : real): integer ;

Procedure PP( var c: integer);

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

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

Procedure PP(const a: real);

Параметры без типа Существуют параметры-переменные и параметры-константы без указания их типа. Передаются такие параметры по адресу. При использовании этих параметров внутри подпрограммы необходимо определить их тип и воспользоваться, например, преобразованием типов.

Type Vect = array of integer; { объявляем тип}

Result := Vect(a)[0]; {обращаемся к переменной a

типа Vect}

Массивы открытого типа. В качестве фактического параметры можно использовать любой одномерный динамический массив целых чисел, размерность этого массива может быть любая.

Параметры по умолчанию. Параметров по умолчанию может быть несколько. Но все они должны быть сосредоточены в конце списка параметров. Параметры

можно опускать начиная с конца. Например:

Function MyFF ( x : byte = 1 ; y : byte = 1; z : byte = 1 ) : byte;

Можно обратиться к функции:

A := MyFF( 2, 2, 2);

A := MyFF( 2, 2);

A := MyFF( 2);

A := MyFF;

Нельзя обратиться к функции:

A := MyFF( , 2, 2);

A := MyFF( 2, , 2);

Параметром по умолчанию может быть только константа или константное выражение, т.е. то, что можно определить на этапе компиляции.

12. Строки. В Делфи существует 5 типов строк: ShortString. Это фактически массив: array[0..255] of char;Память выделяется в 256 байт, а строка размещается динамически, т.е. через адрес.Символы строки содержатся в байтах с 1 по 255. В байте с номером 0 содержится символ, порядковый номер которого представляет собой число фактически имеющихся в строке символов. Данный тип ShortString введен для совместимости с более ранними версиями языка Pascal.

AnsiString и WideString. Переменные типа AnsiString содержат динамические строки символов в ANSI-кодировке. Переменные типа WideString содержат динамические строки символов в кодировке UNICODE. Динамические – переменные этих типов являются адресами, т.е. ссылками на память с соответствующим типом данных. Тип AnsiString: строки имеют фактически неограниченную длину, заботиться о выделении памяти для них не нужно, в их конец автоматически добавляется символ #0. Переменная типа AnsiString — это указатель на первый символ строки. Перед этой строкой в память записывается дополнительная информация: длина строки и счётчик ссылок.Компилятор генерирует код, автоматически выделяющий, перераспределяющий и

освобождающий память, выделяемую для строки.

String. Строка String в зависимости от директивы компилятора {$H} может совпадать с AnsiString {$H+} ( - установлено по умолчанию) или ShortString {$H-}. Для строки String можно задать максимальное количество символов с помощью следующего объявления:

var str: String[25]; т.е. строка содержит не более 25 символов и в памяти занимает 26 байт.

Как только ограничиваем длину {var str: String[25]; } String совпадает с ShortString.

Счётчик ссылок на экземпляр строки. Компилятор гарантирует вам, что счётчик ссылок всегда будет содержать правильное значение (но вы можете и обмануть

компилятор: приведениями типов ). Если строка объявлена в секции var , она начнёт свою жизнь как nil – внутреннее представление пустой строки (''). Когда текст строки ( - экземпляр строки) только создаётся и присваивается переменной, счётчик ссылок на такой текст становится равным 1. Каждое дополнительное присваивание этой строки другой

переменной будет увеличивать счётчик ссылок (никаких данных при этом не копируется).

Если строковая переменная покидает область видимости (когда заканчивается функция или удаляется объект), или же ей присваивают другую строку, то счётчик ссылок уменьшается. Как только счетчик ссылок на текст становиться равным 0, то память выделенная под этот текст освобождается .

Операции со строками.

• Copy( S, pos, len) - копировать

• Length( S ) – длина строки

• SetLength( S, newlen) – задает новую длину строки

• StringOfChar( Ch, Count) – возвращает строку,

заполненную символом Сh в количестве Count

• Trim( S ) –возвращает строку без начальных и

конечных пробелов

• UpperCase( S ) – изменяет символы в строке из нижнего регистра в верхний

• LowerCase( S ) – изменяет символы верхнего регистра в строке в строчные буквы

• Insert(SubStr: String; Str: String; Pos: Integer)

• Delete(Str: String; Start, Length: Integer)

• ReverseString(Str: String) – возвращает строку с противоположным порядком букв

PChar. Переменная PСhar – это ссылка на строку. Строки типа PСhar размещаются в динамической памяти. Динамическая память – это свободная память, которая остается после загрузки программ и данных. Программный элемент получает ее в процессе выполнения программы, а не на этапе компиляции (статическая память).

• Переменная типа PСhar – это ячейка памяти, содержащая адрес строки. По этому адресу

записываются необходимые данные.

• Компилятор выделяет под переменную PChar – адрес строки всего 4 байта, а сама строка

может быть любой длины.

• Если строки не существует, а переменная PChar объявлена, то в эту переменную необходимо записать nil (пустой адрес).

13.Преобразование строк из одного типа в другой. Преобразование между "настоящими" строковыми типами string[n], shortstring, и ansistring выполняются легко, и прозрачно. Никаких явных действий делать не надо, Delphi все сделает за Вас. Надо лишь понимать, что в маленькое большое не влезает.

var

s3 : string[3];

s : ansistring;

begin

...

s := 'abcdef';

s3 := s;

end.

Из PChar в string[], ShortString, S3 : AnsiString просто присваиваем:

var

S1 : string[4];

S2 : ShortString;

S3 : AnsiString;

S : PChar;

begin

S1 := '2011'; S2 := '2011‘; S3 := '2011';

S := '2000';

S1 := S; S2 := S; S3 := S;

end;

В PChar скопировать строку другого типа сложнее:

var

s : ansistring;

p1,p2,p3 :pchar;

begin

...

p1 := pchar(s);

p2 := pointer(s);

p3 := @(s[1]);

end.

• pchar(s). Для выполнения преобразования pchar(s), компилятор вызовет специальную внутренней функции @lstrtopchar. Эта функция проверяет – если строковая переменная имеет значение nil, то вместо него, она возвращает указатель на реально размещенную в памяти пустую строку. Т.е. pchar(s) никогда не вернет указатель равный nil.

• pointer(s) Тут все просто, такое преобразование просто возвращает содержимое строковой переменной. Т.е. если она при пустой строке содержит nil, то и результатом преобразования будет nil. Если же строка не пуста, то результатом будет адрес экземпляра строки.

• @(s[1]) Здесь, все совсем по другому. Перед выполнением такого преобразования, компилятор вставляет код, обеспечивающий ситуацию, когда указатель, хранящийся в s, будет единственным указателем на экземпляр строки в памяти. В нашем примере, если

строка не пуста, то будет создана копия исходной строки. Вот ее-то адрес и будет возвращен как результат такого преобразования. Но, если строка пуста, то результатом будет nil, как и во втором случае.

14. Динамическое выделение буфера. Массив типа A полезен как буфер для небольших строк или строк, ограниченных сверху (т.е. для которых известен максимальный потенциальный размер). В случае, когда размер строки неизвестен во время

компиляции необходимо использовать динамическое выделение буфера для текста:

функции для длинных строк StrAlloc, StrNew – создают буфер (выделяют память в куче),

функцию GetMem для динамических массивов. Освобождать память, когда она вам станет не нужна, используя StrDispose или FreeMem.