Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Процедура Blockread считывает блок информации длиной в Count или меньше записей в область памяти, занимаемую переменной Buf (начиная с ее первого байта). Действительное число считанных полных записей (оно не может превышать значение Count) заносится в параметр Result (если он есть).
Если Result меньше Count, то это значит, что конец файла достигнут до полного окончания передачи. В этом случае, если параметр Result отсутствует, возникает сообщение об ошибке ввода-вывода (поэтому лучше параметр Result использовать).
В результате выполнения процедуры Blockread “окно” файла (текущая позиция файла) передвинется на число записей, равное значению Result.
Объем блока информации, считываемый процедурой Blockread в переменную Buf, занимает
Result* Recsize
байтов. Здесь Recsize – размер записи, определенный при открытии файла. Размер блока информации не должен превышать 64К байта (это размер сегмента данных). В противном случае возникнет сообщение об ошибке ввода-вывода.
Процедура BlockwriteПроцедура Blockwrite имеет следующий формат вызова:
Blockwrite (F, Buf, Count [, Result])
Назначение параметров – то же, что и в предыдущей процедуре.
Процедура записывает одну или несколько записей из области памяти, занимаемой переменной Buf (начиная с ее первого байта), в файл F.
Параметр Result возвращает количество полных записанных записей. Если Result меньше Count, то это значит, что диск переполнился до завершения пересылки данных. В этом случае, если параметр Result отсутствует, возникает сообщение об ошибке ввода-вывода.
В остальном описание процедуры Blockwrite аналогично процедуре Blockread.
Пример 5.10.
Программа быстрого копирования файла F1 в файл F2.
Program CopyFile;
Var
F1, F2: File;
Buf: Array [1..2048] Of Char;
Numr, Numw: Word;
Begin
Assign (F1, ‘DATA1’);
Assign (F2, ‘DATA2’);
Reset (F1, 1); {Размер записи при передаче данных равен одному байту}
Rewrite (F2, 1);
Repeat
Blockread (F1, Buf, Sizeof (Buf), Numr);
Blockwrite (F2, Buf, Numr, Numw);
Until (Numr=0) Or (Numr<>Numw); {Закончился файл F1 или переполнился диск при создании файла F2}
Close (F1);
Close (F2);
End.
5.7. Проверка операций ввода-вывода
По умолчанию при выполнении операций ввода-вывода осуществляется их стандартная проверка системными средствами. Для управления проверкой служит опция компилятора {$I} – проверка ввода-вывода, которая по умолчанию включена ({$I+}). При этом, если произошла ошибка ввода-вывода, то выполнение программы прерывается и выдается сообщение о типе ошибки.
Если нежелательно, чтобы выполнение программы прерывалось по ошибке ввода-вывода, то есть если мы сами хотим обрабатывать данные ошибки, необхотимо отключить стандартную проверку ввода-вывода. С этой целью в тексте программы перед теми операциями ввода-вывода, которые программист желает контролировать сам, необходимо отключить стандартную проверку ввода-вывода опцией {$I-}, а после этих операций снова включить ее опцией {$I+}.
Для контроля операций ввода-вывода в состоянии {$I-} служит специальная функция IOResult (без параметров).
Функция IOResult возвращает целочисленное значение типа Word, которое является состоянием последней выполненной операции ввода-вывода. Если ошибки ввода-вывода не было, то функция возвращает значение ноль, в противном случае – код ошибки.
Если опция {$I} находится в состоянии {$I-} и при некоторой операции ввода-вывода произошла ошибка, то последующие операции ввода-вывода, используемые до вызова функции IOResult, будут игнорироваться.
Таким образом, нежелательно использовать один вызов функции IOResult на несколько операций ввода-вывода, так как неясно, в какой из них произошла ошибка.
Вызов функции IOResult очищает свой внутренний флаг ошибки, (возвращаемое значение устанавливается в ноль). Поэтому нельзя повторно считать одно и то же значение IOResult.
Пример 5.11.
Использование функции IOResult для проверки наличия внешнего файла.
Var
F: File Of Char;
Begin
Assign (F, ’PRIMER’);
{$I-}
Reset(F);
{$I+}
If IOResult = 0 Then
Writeln (‘Размер файла:’, Filesize (F), ‘байт’)
Else
Writeln (‘Файл не обнаружен’);
End.
Раздел 6. Ссылочный тип
(тип указатель)
6.1. Общие сведения
В предыдущих разделах рассматривались автоматические переменные – это переменные, порождаемые непосредственно перед выполнением программы или подпрограммы и существующие в течение всего времени ее выполнения. Объем машинной памяти, необходимой для их размещения, не изменяется по ходу выполнения программы. Автоматические переменные порождаются с помощью соответствующих им описаний в разделе объявлений. Например,
Var
X: Integer;
Здесь X – автоматическая переменная.
Место в памяти для хранения значений автоматических переменных выделяется на этапе трансляции. Обращение к этим переменным в программе осуществляется с помощью указания их имен.
Динамические переменные – это переменные, которые порождаются и уничтожаются в процессе выполнения программы, размер значений которых (область отводимой памяти) определяется и может изменяться при выполнении программы.
Для работы с динамическими переменными в языке Паскаль предусмотрен ссылочный тип (тип указатель). Значением этого типа является ссылка на какой-либо элемент программы. По данной ссылке осуществляется непосредственный доступ к этому элементу. В качестве ссылки используется адрес соответствующего элемента в памяти машины.
Синтаксическая диаграмма задания типа указатель имеет вид, который представляет рисунок 6.1.

Рисунок 6.1 – Синтаксическая диаграмма
задания типа указатель
На данной диаграмме <Идентификатор_типа> - это тип динамически размещаемой переменной. В качестве типа может быть использовано имя стандартного или описанного отдельно типа.
Из диаграммы видно, что в Паскале имеется два вида указателей – указатель на элемент некоторого типа (верхнее ребро синтаксической диаграммы) и указатель, не связанный с типом (Pointer).
Пример 6.1.
Использование указателей при объявлении программных элементов.
Type
Mas = Array [1..10] Of Integer;
Admas = ^Mas; {Admas – тип указателя на массив типа Mas}
P1 = ^Integer; {P1 – тип указателя на тип Integer}
Var
P: ^Integer; {в указателе P будет храниться адрес динамической переменной целого типа}
Q: ^Char; {в указателе Q будет храниться адрес динамической переменной типа Char}
Pp: P1; {в указателе Pр будет храниться адрес динамической переменной целого типа}
Pt: Pointer; {в указателе Pt может храниться адрес динамической переменной произвольного типа}
Adrm: Admas; {в указателе Adrm будет храниться адрес динамического массива типа Mas}
Указатели являются автоматическими переменными ссылочного типа.
Динамические переменные не объявляются в программе. Поэтому единственным средством доступа к ним являются указатели.
Связь указателя Р с динамической переменной схематически отображает рисунок 6.2.

Рисунок 6.2 - Связь указателя Р с динамической переменной
Указатель занимает четыре байта памяти.
Иногда необходимо в качестве значения указателя принять пустую ссылку – ссылку, которая не связывает с данным указателем никакой динамической переменной. Для этого служит предопределенная константа Nil. Константа Nil является совместимой по типу с любым типом указателя.
Например, для указателей, объявленных в примере 6.1, можно записать:
Pt := Nil;
P := Nil;
Q := Nil;
Adrm := Nil;
Над значениями ссылочного типа в Паскале нет операций, которые давали бы результат этого же типа.
Над значениями ссылочного типа определены только присваивание и две операции сравнения: = и <>.
Два значения ссылочного типа равны, если они оба есть Nil либо указывают на одну и ту же переменную. Во всех остальных случаях имеет место неравенство.
При присваивании значения ссылочной переменной в правой части оператора присваивания используется ссылочное выражение того же типа, что и тип переменной в левой части. В качестве ссылочного выражения может использоваться:
- пустая ссылка Nil; ссылочная переменная; ссылочная функция (функция, значением которой является ссылка).
Например, встроенная функция Addr(X) – возвращает адрес элемента X. Здесь X – любая переменная, процедура или функция. Результат функции Addr(X) совместим по присваиванию со всеми типами “указатель”. Поэтому можно, например, написать такие операторы присваивания (для переменных типа указатель, объявленных в примере 6.1):
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |


