|  | Процедуры и функции модуля Level2 – доступ к кластерам
INTERFACE
USES common, level1;
PROCEDURE putCluster(n:INTEGER; s:myCluster); {сохраняет s в кластер с номером n}
FUNCTION  getCluster(n:INTEGER):myCluster; {читает кластер с номером n}
Функция FIRSTSECTOR 
| Содержание задачи | вычисления по формуле |  | Уровень сложности | низкий |  | Модуль | Level2 |  | Входные параметры | n: BYTE – номер кластера |  | Выходные параметры | нет (только результат функции) |  | Тип результата | INTEGER |  | Вызываемые процедуры (функции) | нет |  | Глобальные переменные и константы | константы fs_spc, fs_bi |  | Действия | по номеру кластера рассчитывает номер первого сектора в нем |  | Проверки | нет |  | Комментарии | рассчитывает номер сектора по числу секторов в кластере и с учетом размера каталога |  Функция LASTSECTOR 
| Содержание задачи | вычисления по формуле |  | Уровень сложности | низкий |  | Модуль | Level2 |  | Входные параметры | n: BYTE – номер кластера |  | Выходные параметры | нет (только результат функции) |  | Тип результата | INTEGER |  | Вызываемые процедуры (функции) | firstSector |  | Глобальные переменные и константы | константа fs_spc |  | Действия | по номеру кластера рассчитывает номер последнего сектора в нем |  | Проверки | нет |  | Комментарии | добавляет к номеру начального сектора число секторов в кластере |  Процедура PUTCLUSTER 
| Содержание задачи | записать длинную строку в несколько соседних элементов массива |  | Уровень сложности | средний |  | Модуль | Level2 |  | Входные параметры | n: integer – номер кластера; s:myCluster – содержимое |  | Выходные параметры | нет |  | Вызываемые процедуры (функции) | firstSector, lastSector, putSector (Level1) |  | Глобальные переменные и константы | константа dsk_bps |  | Действия | сохраняет указанное содержимое в виртуальный кластер с заданным номером |  | Проверки | для простоты нет (рассчитываем на Level1) |  | Комментарии | преобразует номер кластера в последовательность номеров секторов и сохраняет последние, используя процедуру putSector;  в ходе записи исходное содержимое разбивает на части по dsk_bps байт противоположна функции getCluster |  Функция GETCLUSTER 
| Содержание задачи | прочитать несколько соседних элементов массива и собрать в общий результат  |  | Уровень сложности | средний |  | Модуль | Level2 |  | Входные параметры | n: integer – номер кластера |  | Выходные параметры | нет (только результат функции) |  | Тип результата | myCluster |  | Вызываемые процедуры (функции) | firstSector, lastSector, getSector (Level1) |  | Глобальные переменные и константы | нет |  | Действия | возвращает содержимое виртуального кластера с заданным номером |  | Проверки | для простоты нет (рассчитываем на Level1) |  | Комментарии | преобразует номер кластера в последовательность номеров секторов и читает последние, используя функцию getSector; результат суммируется в единую переменную противоположна процедуре putCluster |  Текст программыUNIT level2; {Автор Е.А.Еремин. Пермь, 2004}
{доступ к кластерам}
INTERFACE
USES common, level1;
PROCEDURE putCluster(n:INTEGER; s:myCluster);
{сохраняет s в кластер с номером n}
FUNCTION  getCluster(n:INTEGER):myCluster;
{читает кластер с номером n}
IMPLEMENTATION
FUNCTION firstSector(n:BYTE):INTEGER; {первый сектор кластера n}
BEGIN firstSector:=n*fs_spc+fs_bi
{0-й кластер начинается с сектора с номером fs_bi}
END;
FUNCTION lastSector(n:BYTE):INTEGER; {последний сектор кластера n}
BEGIN lastSector:=firstSector(n)+fs_spc-1
END;
FUNCTION  getCluster(n:INTEGER):myCluster;
{читает кластер с номером n}
VAR r:myCluster; i:INTEGER;
BEGIN {добавить проверку}
      r:='';
      FOR i:=firstSector(n) TO lastSector(n) DO
          r:=r+getSector(i); {суммируем все сектора в r}
      getCluster:=r;
END;
PROCEDURE putCluster(n:INTEGER; s:myCluster);
{сохраняет s в кластер с номером n}
VAR i:INTEGER; w:mySector;
BEGIN {добавить проверку}
      FOR i:=firstSector(n) TO lastSector(n) DO
          BEGIN w:=COPY(s,1,dsk_bps); {выделить очередной сектор}
                DELETE(s,1,dsk_bps);  {больше он не нужен}
                putSector(i,w)        {сохранить сектор}
          END;
END;
END. На главную страницу
 |