Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 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