Приложение 1

Приложение A - объясняет как получить техническую поддержку и
консультации при использовании Clipperа.


Приложение B - содержит лицензионные соглашения фирмы.

Приложение C - содержит список команд dBASE III PLUS, не
поддерживаемые Clipperом.

Приложение D - содержит сообщения об ошибках при компиляции.

Приложение E - содержит сообщения об ошибках при линковке
посредством линкера PLINK86-Plus.

Приложение F - содержит сообщения об ошибках при выполнении
программы.

Приложение G - содержит таблицу кодов ASCII и список значений
функции inkey().

Приложение H - содержит список зарезервированных слов.

Приложение I - содержит список команд линкера PLINK86-Plus.

Приложение J - содержит примеры программирования.

ПРИЛОЖЕНИЕ C.

СПИСОК КОМАНД dBASE III PLUS, НЕ ПОДДЕРЖИВАЕМЫХ CLIPPERОМ

Некоторые команды и функции dBASE III PLUS не поддерживаются
Clipperом. Clipper не поддерживает любые команды, которые вызываются
в интерактивном режиме.


APPEND MODIFY QUERY
ASSIST MODIFY REPORT
BROWSE MODIFY SCREEN
CHANGE MODIFY STRUCTURE
CLEAR FIELDS MODIFY VIEW
CREATE LABEL ON ERROR/ESCAPE/KEY
CREATE REPORT RESUME
CREATE QUERY RETRY
CREATE SCREEN RETURN TO MASTER
CREATE VIEW SET
DISPLAY FILES SET CARRY
DISPLAY MEMORY SET CATALOG
DISPLAY STATUS SET COLOR ON/OFF
DISPLAY STRUCTURE SET DEBUG
DISPLAY USERS SET DO HISTORY
EDIT SET ECHO
ERROR() SET ENCRYPTION
EXPORT TO SET FIELDS
HELP SET HEADING
IMPORT FROM SET HELP
INSERT SET HISTORY
LIST FILES SET MEMO WIDTH

- 259 -
LIST HISTORY SET MENUS
LIST MEMORY SET SAFETY
LIST STATUS SET STATUS
LIST STRUCTURE SET STEP
LOAD SET TALK
LOGOUT SET TITLE
MESSAGE SET TYPEAHEAD
MODIFY COMMAND SET VIEW
MODIFY LABEL

Многие команды dBASE III PLUS поддерживаются Clipperом не прямо,
а посредством его утилит, описанных в главе 12.


ПРИЛОЖЕНИЕ D.

СООБЩЕНИЯ ОБ ОШИБКАХ КОМПИЛЯЦИИ

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

ACCEPT/INPUT error
APPEND error
ASSIGNMENT error
AVERAGE error
AVERAGE number of expressions and variables
CALL error
CLEAR error
CLOSE error
COPY error
COUNT error
CREATE error
DELETE error
DO error
FILTER error
FOR error
LABEL error
LIST error
LOCATE error
PARAMETER error
RECALL error
RELATION error
RELEASE
REPLACE error
RESTORE error
SAVE error
SET error
SET not recognised
SET switch error
SUM error
USE error
WAIT error

Следующие сообщения относятся к специфическим ошибкам и
ситуациям.


- 260 -
Case w/o do case
Не найден предшествующий DO CASE.

else w/o if
Не найден предшествующий IF <условие>.

endcase w/o do case
Не найден предшествующий DO CASE.

enddo w/o while
Не найден предшествующий DO WHILE.

endif w/o if
Не найден предшествующий IF <условие>.

exit w/o do while
- Не найден предшествующий DO WHILE <условие>.

Fatal at <n> invalid procedure name
Два процедурных файла содержат процедуры с одним и тем же
именем.
Замечание: это сообщение выдается только на экран и не может
записываться в файл сообщений об ошибках.

illegal device
Неверная опция SET DEVICE TO <SCREEN/PRINT>

illegal value
Левая часть оператора присвоения содержит неверное имя. Нельзя
присваивать при помощи оператора STORE значения числу (например, 12
присвоить 100+1). Нельзя присвоить значение функции (например,
INKEY()=12).
loop w/o do while
Оператор LOOP должен быть внутри структуры DO WHILE ... ENDDO.

missing 2nd quote
Не найден конечный разделитель стринга.

next w/o for
Оператор NEXT должен соответствовать оператору FOR.

otherwise w/o do case
Оператор OTHERWISE должен быть внутри структуры DO CASE ...
ENDCASE.

rest of line ignored
Написание остатка строки не поддерживается и игнорируется
компилятором.
symbol redefinition error
Все файлы и процедуры должны иметь уникальные имена. Сообщение
обычно высвечивается когда файл процедуры и имя процедуры в нем имеют
одно и то же имя.

too many constants
Компилятор нашел слишком много констант при разборе исходного
кода. Нужно компилировать программу по секциям и объединять при
линковке.

- 261 -
too many symbols
Компилятор нашел слишком много символов при разборе исходного
кода. Нужно компилировать программу по секциям и объединять при
линковке.

unbalanced DO CASE
Не найден оператор ENDCASE. Возможно это вызвано
несбалансированностью условного оператора.

unbalanced DO WHILE
Не найден оператор ENDDO. Возможно это вызвано
несбалансированностью условного оператора.

unbalanced FOR/NEXT
Не найден оператор NEXT для предыдущего оператора FOR. Возможно
это вызвано несбалансированностью условного оператора.

unbalanced IF/ELSE
Не найден оператор ENDIF для предыдущего оператора FOR. Возможно
это вызвано несбалансированностью условного оператора.

verb not recognized
Команда не поддерживается Clipperом. Нужно проверить написание и
синтаксис.




ПРИЛОЖЕНИЕ E.
ОШИБКИ И ПРЕДУПРЕЖДЕНИЯ ЛИНКЕРА PLINK86-PLUS.
Во время линковки линкером PLINK86-Plus находятся ошибки и
потенциальные трудности выполнения программ. В случае нахождения
ошибки или потенциальной трудности выполнения на дисплее
высвечивается сообщение. Кроме того, высвечивается номер кода ошибки
или предупреждения. Ниже приведен список кодов и описаний ошибок и
предупреждений.
В случае, если нижеприведенного списка недостаточно, ни в коем
случае не просите помощи у фирмы Phoenix Technologies, Ltd.

1. Сообщения о предупреждениях
Линкер может выявлять ситуации, которые могут вызвать трудности
во время выполнения программы.

Код предупреждения 1.
Попытка использовать 16-битовый адрес для ссылки на ячейку,
удаленную более чем на 64 К байт, или используется 8-битовая
адресация для ссылки на адрес, удаленный более чем на 256 байт.
Другая способность - адрес, на который ссылаются, меньше чем
используемый регистр сегмента. Для примера, ближайший адрес обращения
ниже чем текущее состояние CS или случай вызова неверного адреса
сегмента. Начало адрес "зациклено" внутри некоторого диапазона, так
что клиппер-программа, возможно, будет обращаться к неверному адресу.
Код предупреждения 2.
В DOSе желаемая позиция стека программы хранится в области
указателей .EXE-файла. Это используется для установки SS и SP-
регистров при выполнении программы. Линкер PLINK86-Plus находит
сегмент стека, помеченый таковым либо компилятором, либо ассемблером.

- 262 -
В случае нахождения его адрес помещается в "хедер". В противном
случае используются нули и клиппер-программа возможно не будет
функционировать правильно, если ею не установлены регистры SS и SP.
Даже в этом случае клиппер-программа будет функционировать неверно, если
произошло прерывание перед установкой стека.
Код предупреждения 3.
Группа это совокупность сегментов, которые должны быть
перераспределены внутри участка памяти объема 64 килобайта. Это
позволяет использовать 16-битовую адресацию внутри группы. К части
элементов внутри группы нельзя адресоваться, если группа слишком
велика и в этом случае нужно уменьшить размер группы. Иногда такое
предупреждение появляется даже если размер группы менее 64 килобайт.
В этом случае нужно посмотреть таблицу размещения сегментов группы в
памяти и найти посторонние сегменты, входящие в выделенный раздел
объема 64 килобайта.
Такая ситуация возникает часто возникает при смешивании модулей
на ассемблере и языке высокого уровня. Имена используемых сегмента и
класса должны быть такими же, как в языке высокого уровня. В
противном случае сегментам ассемблера могут присвоится адреса в конце
секции и слишком удаленные от других членов группы.
Для уменьшения требования к памяти могут применятся оверлеи.

Код предупреждения 4.
В команде MODULE использовался модуль с некоторым именем, но
линкер PLINK86-Plus не нашел этого имени в списке входных файлов.

Код предупреждения 5.
Микропроцессор 8086 использует дуальную схему адресации. Начало
длинной адресации относится к физическим 64К сегмента, выбранного
данной частью параграфа. Поэтому, хотя точка отсчета может быть
определена во время линковки, адрес параграфа представляет собой
абсолютный физический адрес и должен настраиваться в соответствии с
тем, где операционная система загружает программу в память. DOS
делает это по мере того, как клиппер-программа загружается в память для
выполнения. Линкер PLINK86-Plus выдает длинный адрес относительно
начала программы и непрерывной линковки.
Код предупреждения 6.
Это предупреждение не возникает при использовании операционной
системы MS DOS, а только при использовании CP/M-86.
Код предупреждения 7.
Названный модуль содержит тип строки, незнакомый линкеру
PLINK86-Plus. Вся запись будет пройдена. Это сообщение появляется
после небольшого объема выдачи на принтер. Это обычно случается при
включении расширения .PRG для идентификации файлов в BATCH-клиппер-программах
(CL.BAT).

Код предупреждения 8.
Каждая запись объектного файла содержит в конце контрольное
поле. Это сообщение указывает на неверную контрольную сумму, но
линковка продолжается. Это сообщение появляется после небольшой
выдачи на принтер. Если объектный файл был записан на диск перед
линковкой, проверяется контрольная сумма. Ряд библиотечных средств
также позволяют проверить контрольную сумму. Если объектный файл
действительно запорчен, после этого сообщения появится сообщение о
фатальной ошибке.
Код предупреждения 9.
Каждая запись объектного файла содержит слово, дающее размер

- 263 -
строки (что можно увидеть при помощи утилита DUMP). Эта ошибка
означает, что линкер PLINK86-Plus достиг конца строки и нашел, что
количество байт не совпадает с записанным размером строки. Вероятно
объектный файл запорчен, но линкер PLINK86-Plus будет пытаться
продолжать процесс линковки.
Код предупреждения 10.
Используется 16-битовая адресация, тогда как объект цели удален
более чем на 64 К от именованного модуля (или 8-битовая адресация при
расстоянии более чем на 256 байт). Поэтому цель не может быть
достигнута. Используемый адрес будет "зациклен" в соответствии с
необходимой размером. Если есть группа более 64К, ее нужно сделать
меньше для обеспечения корректного доступа.

Код предупреждения 11.
Допустимо только одно определение для каждого глобального
символа в линкуемой программе. Было найдено другое определение
именованного символа. Линкер PLINK86-Plus игнорирует повторное
определение, возвращает первое и продолжает линковку.
Код предупреждения 12.
Именованный глобальный сегмент был присвоен более чем одной
группе. Один модуль размещает сегмент в одной группе, а затем другой
модуль определяет другую группу для того же сегмента. Ссылка к
сегменту может быть вычислена неверно.
Код предупреждения 13.
Именованный сегмент был сначала определен как глобальный, а
зптем переопределен как общий блок (или наоборот). Нужно убедиться,
что все определения сегмента изменяются к одному и тому же типу. Эта
проблема обычно возникает при линковке ассемблерных модулей.
Код предупреждения 14.
Был определен повторно сегмент стека внутри именованного модуля.
Линкер PLINK86-Plus использует последнее определение стека для
определения стека в .EXE-хедере. Если сегмент стека пуст или слишком
мал, клиппер-программа возможно будет выполняться неверно. Так как предыдущий
сегмент стека игнорируется, нет возможности иметь более одного
сегмента стека. Нужно убедиться, что все определения сегментов стека
используют одинаковые имена и имена классов. Тогда они будут
объединены в один сегмент с размером, равным сумме размеров исходных
сегментов.

Код предупреждения 19.
Не достаточно памяти для пути. Линкер PLINK86-Plus сообщит имя
недостижимого пути файла. Если не хватает памяти для строки этого
стринга, будет предупреждение 19 и будет совершена вторая попытка.
Код предупреждения 20.
Неверный размер размещения в секции #_. Если вычисленный размер
секции не совпадает с действительным, появляется предупреждение 20.
Код предупреждения 21.
Плохой счетчик в секции #_. Если счетчик на первом проходе не
совпадает со счетчиком на втором проходе, появляется предупреждение
20.

2. Сообщения об ошибках

Ошибки синтаксиса команд
Эти ошибки ошибки обусловлены неверной информацией на входе
линкера PLINK86-Plus. Будет высвечен номер строки программы вместе с
содержимым и знаком вопроса после того места, которое вызвало ошибку.

- 264 -
К сожалению, линкер PLINK86-Plus может не найти ошибку, если не
обработал текст до конца. Если знак вопроса появился в начале строки,
нужно проверить оставшуюся часть строки.
Код ошибки 1
"@"-файлы вложены слишком плотно. Допустимо только три уровня
"@"-файлов в один момент. Нужно проверить также цикл ссылках
"@"-файлов.
Код ошибки 2
Встретилась ошибка диска при чтении "@"-файла. Нужно попытаться
переделать файл.
Код ошибки 3
Линкер PLINK86-Plus не может найти имя файла после символа "@".
Код ошибки 5
Параметр входа слишком велик. Максимальный допустимый размер
составляет 64 К символов.
Код ошибки 6
Неверная цифра в числе. Верная цифра зависит от основания (по
умолчанию используется шестнадцетиричная для адресации и десятичная в
друугом случае).

Код ошибки 10
Неверное имя файла. Вход должен содержать правильное в рамках
DOSа имя файла.
Код ошибки 11
Ожидается оператор. Должно быть ключевое слово, которое начинает
оператор.

Код ошибки 14
Ожидается идентификатор. В этой точке должны быть имена секции,
модуля, сегмента.
Код ошибки 15
Ожидается знак = (равенства).
Код ошибки 16
Ожидается числовая величина. В этом месте должна быть 16-битовое
число.
Код ошибки 17
Для линковки не были даны файлы. Нужно с использованием
оператора FILE задать хотя бы один входной файл.
Код ошибки 18
Ожидается правая скобка в конце оператора CLASS. Список имен
сегментов должен быть заключен в скобки.
Ошибки работы с файлами
В том случае, когда линкер PLINK86-Plus не вмещается в
оперативную память, он использует дисковый файл PLINK86.WRK для
строки описания программы. Ниже приведены коды ошибок при работе с
этим рабочим файлом.

Код ошибки 30
Рабочий файл не может быть создан. Возможно нет места на диске.
Код ошибки 31
Ошибка ввода/вывода при строки в рабочий файл.
Код ошибки 32
Ошибка ввода/вывода при чтении из рабочего файла.
Код ошибки 33
Ошибка ввода/вывода при репозиции рабочего файла, например, при
поиске в рабочем файле.


- 265 -
Код ошибки 34
Слишком много объектов (символов, сегментов, групп, ...)
определено в программе (может быть создано около 35000). Программа
слишком велика для работы линкера PLINK86-Plus.

Ошибки входных объектных файлов
Эти ошибки относятся к объектным файлам, который подаются на
вход линкеру PLINK86-Plus. Обычно такие ошибки появляются при
какой-либо порче файла. Нужно попытаться перекомпилировать программу.
Если этот файл - фирменная библиотека, нужно взять свежую копию.
Код ошибки 41
Встретился непредвиденный конец файла. Возможно, файл был
обрезан при копировании при помощи программы, которая в конце файла
предполагает символ Ctrl-Z (1AH). Обычно это бывает при включении
расширения .PRG при задании имени в DOS-овском BATCH-файле (CL.BAT).
Код ошибки 42
Фатальная ошибка при чтении объектного файла.

Код ошибки 43
Линкер не может найти объектный файл. Обычно в такой ситуации
линкер PLINK86-Plus запрашивает како-либо префикс имени файла,
например, имя драйва, путь (см. оператор FILE). Сообщение об ошибке
появляется при прекращении процесса линковки. В случае применения
BATCH-команды это сообщения появляется немедленно без запроса о
префиксах имени файла.

Ошибки выходных файлов
Эти ошибки возникают при создании выходного файла или файла
распределения памяти (при строки на диск). Часто такая ошибка бывает
при переполнении диска или директории, при установленной на диске
защите от строки, или при какой-либо поломке диска.

Код ошибки 45
Невозможно создать выходной файл. Либо диск переполнен, либо
защищен от строки.
Код ошибки 46
Неверный тип выходного файла. Тип выходного файла должен быть
лиюо .EXE либо .CMD.

Код ошибки 47
Фатальная ошибка при строки на диск выходного файла. Либо диск
переполнен, либо защищен от строки, или какая-либо поломка диска.
Код ошибки 48
Фатальная ошибка при чтении с диска выходного файла. Возможно
какая-либо поломка диска.

Код ошибки 49
Невозможно закрыть выходной файл. Либо диск защищен от строки,
или какая-либо поломка диска.
Код ошибки 50
Невозможно создать файл распределения загрузки памяти. Либо диск
переполнен, либо защищен от строки, или какая-либо поломка диска.

Разные ошибки
Код ошибки 51
Существует неопределенный символ. Возможно перепутано написание
процедур или функций. Перечисленные символы в одном или большем числе

- 266 -
модулей нигде не определены. Они будут определены как внутренние в
некотором модуле.
Код ошибки 54
Не достаточно оперативной памяти компьютера для работы линкера
PLINK86-Plus. Для линкера необходимо не менее 256 килобайт.
Код ошибки 57
Проблема с файлом OVERLEY.LIB. Необходимо убедиться, что
используется последняя версия. При создании нового файла OVERLEY.LIB
необходимо его правильно форматировать.
Код ошибки 58
Сегмент стека слишком велик (больше 64 килобайт). Необходимо
помнить, что сегменты стека, определенные в каждом модуле, соединены
вместе как глобальные сегменты.


Ошибки объектных файлов по формату Intel
Эти ошибки обусловлены форматом объектных файлов. Объектные
файлы должны быть в формате Intel.
Возможно запортился перемещаемый объектный файл. Можно
попробовать перекомпилировать программу.

Код ошибки 61
LTL сегмент появился в интеловском модуле. Линкер не примет
такой входной файл.

Код ошибки 62
Запись REGINT определила регистр, который должен быть
инициализирован в виде, не поддерживаемом форматом .EXE. Только CS:IP
и SS:IP (адрес старта программы и поинтер стека) могут быть
преинициализированы записью REGINT.
Код ошибки 63
Подзапись LIDATA повторяет счет нулей.

Код ошибки 64
Была использована интеловская объектная библиотека, которая
имеет неверный индекс. Может быть полезным перестроить библиотеку с
использованием линкера PLINK86-Plus.
Код ошибки 65
В данном модуле был определен абсолютный стартовый адрес. Линкер
требует, чтобы адреса были заданы относительно некоторого сегмента.
Код ошибки 66
Данный модуль содержит группу элементов, тип которых не
поддерживается линкером. В группу могут включаться только сегменты
(код описания компонент группы = FFH).

Код ошибки 70
Было определено неверное положение для организации. Поле LOG
больше 4 для относительной организации сегмента.
Код ошибки 71
Было определено неверное положение для организации. Поле LOG
больше 1 для полуотносительной организации сегмента.
Код ошибки 73
Использовался тип фрейма, не поддерживаемый линкером
PLINK86-Plus (5 или 7).

Ошибки структуры программы
Эти ошибки возникают из-за ошибок структуры программы.

- 265 -
Код ошибки 80
Слишком много оверлеев. Имеется слишком много уровней в
структуре оверлея.
Код ошибки 81.
Имеется слишком много операторов ENDAREA, больше чем операторов
BEGINAREA.
Код ошибки 82.
Несбалансированы операторы BEGINAREA и ENDAREA. Их должно быть
одинаковое число.
Код ошибки 83.
Слинкованная клиппер-программа не вмещается в 1 мегабайт адресуемого
пространства, что поддерживается микропроцессором 8086. Необходимо
использовать оверлеи.


Ошибки диагностики линкера PLINK86-Plus
(коды 200-206)
Эта ошибка указывает на проблему внутри линкера PLINK86-Plus.
Эта проблема не по вине пользователя. Во-первых, нужно попытаться
запустить линкер снова и в случае неудачи нужно скопировать линкер с
дистрибутивной дискеты и запустить его снова. Если и в этом случае
будет ошибка, нужно сообщить об этом фирме Nuntucket, но ни в коем
случае не фирме Phoenix Technologies, Ltd.












ПРИЛОЖЕНИЕ G.

Таблица G-1. Таблица кодов ASCII.
Коды Символ Коды Символ Коды Символ Коды Символ
0 00 NUL 64 40 @ 128 80 А 192 C0 ?
1 01 SOH 65 41 A 129 81 Б 193 C1 ?
2 02 STX 66 42 B 130 82 В 194 C2 ?
3 03 ETX 67 43 C 131 83 Г 195 C3 ?
4 04 EOT 68 44 D 132 84 Д 196 C4 ?
5 05 ENQ 69 45 E 133 85 Е 197 C5 ?
6 06 ACK 70 46 F 134 86 Ж 198 C6 ?
7 07 BEL 71 47 G 135 87 З 199 C7 ?
8 08 BS 72 48 H 136 88 И 200 C8 ?
9 09 HT 73 49 I 137 89 Й 201 C9 ?
10 0A LF 74 4A J 138 8A К 202 CA ?
11 0B VT 75 4B K 139 8B Л 203 CB ?
12 0C FF 76 4C L 140 8C М 204 CC ?
13 0D CR 77 4D M 141 8D Н 205 CD ?
14 0E SO 78 4E N 142 8E О 206 CE ?
15 0F SI 79 4F O 143 8F П 207 CF ?
16 10 DLE 80 50 P 144 90 Р 208 D0 ?
17 11 DC1 81 51 Q 145 91 С 209 D1 ?

- 268 -
18 12 DC2 82 52 R 146 92 Т 210 D2 ?
19 13 DC3 83 53 S 147 93 У 211 D3 ?
20 14 DC4 84 54 T 148 94 Ф 212 D4 ?
21 15 NAK 85 55 U 149 95 Х 213 D5 ?
22 16 SYN 86 56 V 150 96 Ц 214 D6 ?
23 17 ETB 87 57 W 151 97 Ч 215 D7 ?
24 18 CAN 88 58 X 152 98 Ш 216 D8 ?
25 19 EM 89 59 Y 153 99 Щ 217 D9 ?
26 1A SUB 90 5A Z 154 9A Ъ 218 DA ?
27 1B ESC 91 5B [ 155 9B Ы 219 DB ?
28 1C FS 92 5C \ 156 9C Ь 220 DC ?
29 1D GS 93 5D ] 157 9D Э 221 DD ?
30 1E RS 94 5E ^ 158 9E Ю 222 DE ?
31 1F US 95 5F _ 159 9F Я 223 DF ?
32 20 SP 96 60 ` 160 A0 а 224 E0 р
33 21 ! 97 61 a 161 A1 б 225 E1 с
34 22 " 98 62 b 162 A2 в 226 E2 т
35 23 # 99 63 c 163 A3 г 227 E3 у
36 24 $ 100 64 d 164 A4 д 228 E4 ф
37 25 % 101 65 e 165 A5 е 229 E5 х
38 26 & 102 66 f 166 A6 ж 230 E6 ц
39 27 ' 103 67 g 167 A7 з 231 E7 ч
40 28 ( 104 68 h 168 A8 и 232 E8 ш
41 29 ) 105 69 i 169 A9 й 233 E9 щ
42 2A * 106 6A j 170 AA к 234 EA ъ
43 2B + 107 6B k 171 AB л 235 EB ы
44 2C , 108 6C l 172 AC м 236 EC ь
45 2D - 109 6D m 173 AD н 237 ED э
46 2E . 110 6E n 174 AE о 238 EE ю
47 2F / 111 6F o 175 AF п 239 EF я
48 30 0 112 70 p 176 B0 ? 240 F0 Ё
49 31 1 113 71 q 177 B1 ? 241 F1 ё
50 32 2 114 72 r 178 B2 ? 242 F2 Є
51 33 3 115 73 s 179 B3 ? 243 F3 є
52 34 4 116 74 t 180 B4 ? 244 F4 Ї
53 35 5 117 75 u 181 B5 ? 245 F5 ї
54 36 6 118 76 v 182 B6 ? 246 F6 Ў
55 37 7 119 77 w 183 B7 ? 247 F7 ў
56 38 8 120 78 x 184 B8 ? 248 F8 °
57 39 9 121 79 y 185 B9 ? 249 F9 ?
58 3A : 122 7A z 186 BA ? 250 FA ·
59 3B ; 123 7B { 187 BB ? 251 FB ?
60 3C < 124 7C | 188 BC ? 252 FC №
61 3D = 125 7D } 189 BD ? 253 FD ¤
62 3E > 126 7E ~ 190 BE ? 254 FE ?
63 3F ? 127 7F  191 BF ? 255 FF





Таблица G-2. Таблица значений, возвращаемых функцией INKEY() при
нажатии функциональных клавиш.


Функциональная Возвращаемое
клавиша значение

- 269 -
F1 28
F2 -1
F3 -2
F4 -3
F5 -4
F6 -5
F7 -6
F8 -7
F9 -8
F10 -9
F11 (Shift-F1) -10
F12 (Shift-F2) -11
F13 (Shift-F3) -12
F14 (Shift-F4) -13
F15 (Shift-F5) -14
F16 (Shift-F6) -15
F17 (Shift-F7) -16
F18 (Shift-F8) -17
F19 (Shift-F9) -18
F20 (Shift-F10) -19
F21 (Ctrl-F1) -20
F22 (Ctrl-F1) -21
F23 (Ctrl-F1) -22
F24 (Ctrl-F1) -23
F25 (Ctrl-F1) -24
F26 (Ctrl-F1) -25
F27 (Ctrl-F1) -26
F28 (Ctrl-F1) -27
F29 (Ctrl-F1) -28
F30 (Ctrl-F10) -29
F31 (Alt-F1) -30
F32 (Alt-F2) -31
F33 (Alt-F3) -32
F34 (Alt-F4) -33
F35 (Alt-F5) -34
F36 (Alt-F6) -35
F37 (Alt-F7) -36
F38 (Alt-F8) -37
F39 (Alt-F9) -38
F40 (Alt-F10) -39



Таблица G-3. Таблица значений, возвращаемых функцией INKEY()
при нажатии функциональных клавиш.

Клавиша Альтернатива Возвращаемое
значение
Стрелкавправо Ctrl-D 4
Стрелкавлево Ctrl-S 19
Стрелкавверх Ctrl-E 5
Стрелкавниз Ctrl-X 24
Ctrl-Стрелкавправо Ctrl-B 2
Ctrl-Стрелкавлево Ctrl-Z 26
Ins Ctrl-V 22
Del Ctrl-G 7
Home Ctrl-A 1

- 270 -
PgUp Ctrl-R 18
PgDn Ctrl-C 3
Ctrl-Home Ctrl-] 29
Ctrl-End Ctrl-W 23
Ctrl-PgUp Ctrl-hyphen 1
Ctrl-PgDn Ctrl-Ctrl 30
End 6
Tab 9





ПРИЛОЖЕНИЕ H

ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА

Следующие слова зарезервированы при использовании Clipperа или
линкера PLINK86. Слова, помеченные звездочкой, не могут
применятся ни в какой сокращенной форме. Для примера,
LIBRARY,LIBRAR,LIBRA,LIBR,LIB, LI,L - все зарезервированные слова.
Хотя большинство имен функций может быть переопределено,
предполагается, что они не используются как имена пользовательских
процедур и функций. Наконец, нельзя использовать символ подчеркивания
(_) внутри имен процедур, форматов, функций или программ.

Таблица H-1. Зарезервированные слова

* BATCH * NOBELL
* BEGINAREA * OUTPUT
CODE PROCFILE
DATA READEXIT
* DEBUG READINSERT
* ENDAREA * SEARCH
ERRORLEVEL * SECTION
INDEXEXT SETPRC
INDEXORD SUMMER87
* FILE SYSTEM
* HEIGHT * UPPERCASE
* LIBRARY * VERBOSE
* LOWERCASE * WIDTH
* MAP * WIRKFILE
NETERR



ПРИЛОЖЕНИЕ I
КОМАНДЫ ЛИНКЕРА PLINK86


#
Маркер комментария, используемый программой PMAKER.

BATCH
Заставляет линкер заканчивать работу с сообщением о фатальной
ошибке если не найдены необходимые .OBJ- и .LIB-файлы. (По умолчанию
высвечивается оператор если не найден файл).

- 271 -

BEGINAREA
(Сокращенно BEGIN). Определяет начало области оверлея. Каждая
область оверлея должна начинаться с оператора BEGINAREA и
заканчиваться оператором ENDAREA.

DEBUG
Предоставляет информацию, помогающую отладке. Высвечивает имена
оверлеев по мере их загрузки при выполнении программы.
ENDAREA
(Сокращено END). Определяет конец области оверлея. Каждая
область оверлея должна начинаться с оператора BEGINAREA и
заканчиваться оператором ENDAREA.

FILE
( Сокращено FI). Определяет .OBJ-файлы при линковке. Расширение
.OBJ определять не нужно. Каждый .OBJ-модуль должен определяться
одной командой FILE; отдельный модули отделяются запятыми.
HEIGHT
Изменяет высоту страницы протокола загрузки памяти на число,
которое стоит после оператора HEIGHT. По умолчанию 65 строк в одной
странице.

LIBRARY
(Сокращено LIB). Определяет библиотечные процедуры, которые для
линковки. Эта команда требует для файла расширения .LIB, если не
оговорено противное.
Линкер PLINK86-Plus будет автоматически просматривать библиотеку
CLIPPER.LIB. Если используются оверлеи, линкер будет также
автоматически просматривать библиотеку OVERLEY.LIB. Не нужно
использовать эту команду, если требуются для линковки только эти две
библиотеки.

LOWERCASE
Переводит все идентификаторы и символы в малые буквы.

MAP
Производит протокол загрузки памяти, который описывает выходной
файл, использование памяти, размер и адреса информации. Команда MAP
полезна для отладки на программ на ассемблере, для управления и
планирования размещения в памяти, тестирования линковки, отладки.
Команда MAP вводится следующим образом:
MAP = <имя файла> [A][,G][,M][,S]
PLINK86-Plus будет присваивать расширения .MAP заданным именам.
Различные протоколы определяются следующим образом:
A - Все сегменты. Распечатывает секции в порядке ввода, а
сегменты в секциях в порядке возрастания алресов памяти.
G - Глобальныые символы. Распечатывает глобальные символы в
алфавитном порядке с адресами каждого.
M - Модули. Распечатывает модули программ в порядке адресов и и
размеров. Каждый сегмент, содержащийся в модуле, и каждый символ,
содержащийся в сегменте, также распечатывается в порядке адресов и
размеров. Этот протокол производит наиболее детальную информацию.
S - Секции. Распечатывает секции программы в алфавитном порядке
с краткой информацией о каждой секции.
Можно заказать один или все режимы из вышеперечисленных. По
умолчанию будет печататься протокол типа A.

- 272 -

NOBELL
Отменяет звуковой сигнал при сообщениях линкера.

OUTPUT
Определяет имя загрузочного файла. По умолчанию имя выходного
файла совпадает с именем первого файла в команде FILE. Расширение
файла задавать не нужно. Оверлеи определяют имена классов сегментов,
которые будут загружаться.

SEARCH
Аналогичен оператору LIB, но заставляет линкер PLINK86
просматривать несколько раз библиотечные файлы, если найдены
неопределенные идентификаторы после прочтения файлов. По умолчанию
предполагается расширение .LIB.

SECTION
Определяет объектные модули, содержащиеся во внутреннем оверлее.

SECTION INTO
Определяет объектные модули, содержащиеся в внешнем оверлее.
UPPERCASE
Переводит все символы в заглавные.

VERBOSE
Высвечивает на экране текущие операторы линкера на последней
строке экрана. Следует заметить, что это значительно замедляет работу
линкера.

WIDTH
Изменяет ширину страницы протокола загрузки памяти на заданное
число символов в строке. По умолчанию используется 80 символов.
WORKFILE
При необходимости переадресует файлы.




ПРИЛОЖЕНИЕ J.

ПРИМЕРЫ br /br /ПРОГРАММ
В этом приложении представлены несколько пользовательских
программ и функций, служащих примерами, а также являющиеся задачами,
с которыми сталкиваются многие программисты.

Совместимость с dBASE III PLUS
Dbf() - имя текущей рабочей области.
FlLabel() - имя функциональной клавиши.
FxMax() - число функциональных клавиш.
Mod() - модуль двух чисел.
Os() - имя операционной системы.
ReadKey() - аналогична таковой из dBASE III PLUS.
Version() - версия Clipperа.

Интерфейс пользователя
Dup_Chk() - дублирование.
Multi_Form() - многостраничные форматы экрана.

- 273 -
ValidTime() - проверка правильности времени.
AcceptAT() - ввод с клавиатуры в заданном месте экрана.

Ввод/вывод низкого уровня
Philes.prg - копирование файлов.

Стринговые функции
Currency() - число в формате доллара.
StrZero() - числовой стринг с ведущими нулями.

Функции времени
AmPm() - стринг времени 12-часового формата.
Days() - секунды в днях.
ElapTime()- разница между временными стрингами.
Secs() - секунды с полуночи до данного момента (в стринге).
Tstring() - секунды в стринге времени.

Числовая функция (FUNC)
LenNum() - суммарная длина числа.

Массивы
Dim2() - двумерный массив.



Совместимость с dBASE III PLUS
Следующие функции обеспечивают дополнительные возможности
совместимости с dBASE III PLUS. Эти процедуры находятся в файле
Examplep.prg и в библиотеке EXTEND.LIB.

FUNCTION Dbf
* Написание ...: string = Dbf()
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
RETURN ALIAS()


FUNCTION FkLabel
* Написание.: string = FkLabel(<Числовое выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_1
RETURN IF(cl_1 <= 40 .AND. cl_1 > 0, "F" + LTRIM(STR(cl_1)), [])

FUNCTION FkMax
* Написание.: n = FkMax()
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
RETURN 40 && IBM specific

FUNCTION Mod
* Написание.: n = Mod(<Числовое выражение1>, <Числовое выражение2>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86

- 274 -
*
PARAMETERS cl_num, cl_base
PRIVATE cl_result
cl_result = cl_num % cl_base
RETURN IF(cl_base = 0, cl_num,;
IF(cl_result * cl_base<0, cl_result + cl_base, cl_result))

FUNCTION Os
* Написание.: string = Os()
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
RETURN "MS/PC-DOS" && определяет DOS , MicroSoft или IBM

FUNCTION ReadKey
* Написание.: n = ReadKey()
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
DO CASE
CASE LASTKEY() = 18 && PgUp
RETURN 6 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 3 && PgDn
RETURN 7 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 27 && Esc
RETURN 12 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 23 && Ctrl-W
RETURN 14 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 13 && Enter
RETURN 15 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 31 && Ctrl-PgUp
RETURN 34 + IF(UPDATED(), 256, 0)
CASE LASTKEY() = 30 && Ctrl-PgDn
RETURN 35 + IF(UPDATED(), 256, 0)
CASE LASTKEY() >= 32 && type past end
RETURN 15 + IF(UPDATED(), 256, 0)
ENDCASE


FUNCTION Version
* Написание.: string = Version()
*
RETURN "Clipper, Лето '87"


*** Интерфейс пользователя

* Следующие функции демонстрируют различные
* приложения интерфейса пользователя.

FUNCTION Dup_Chk
* Написание.: logical = Dup_Chk(<переменная>, <рабочая область>)
* Автор ...: Ray Love
* Дата .....: Июнь 1, 1986 модифицировано Сентябрь 1, 1987
*
PARAMETERS dup_no, workarea


- 275 -
* Приемлемо пустое значение.
IF EMPTY(dup_no)
RETURN .T.
ENDIF

* Проверка целостности.
IF LEN(TRIM(dup_no)) < LEN(dup_no)
Err_msg("Поле не полностью заполнено")
RETURN .F.
ENDIF

* Проверка на дублирование.
lastarea = SELECT()
SELECT workarea
SEEK dup_no
IF FOUND()
Err_msg("Уже в файле")
validation = .F.
ELSE
validation = .T.
ENDIF
SELECT (lastarea)
RETURN validation

FUNCTION Err_msg
PARAMETERS msg
SAVE SCREEN
row = 7
msg = msg + ", нажать любую клавишу..."
col = INT((80 - LEN(msg))/2) - 2
@ row, col CLEAR TO row + 2, col + LEN(msg) + 4
@ row, col TO row + 2, col + LEN(msg) + 4 DOUBLE
@ row + 1, col + 2 SAY msg
INKEY(0)
RESTORE SCREEN
RETURN ""


FUNCTION Multi_Form
* Написание.: n = Multi_Form(<Символьный массив>)
* Автор ...: Ira Emus
* Дата .....: Декабрь 3, 1986, модифицировано Сентябрь 1, 1987
* Note(s) ..: Страничный механизм экранного формата.
*
PARAMETERS scr_arry
PRIVATE pg_count, form
*
maxpage = LEN(scr_arry)
pg_count = 1
DO WHILE .T.
CLEAR
form = scr_arry[pg_count]
SET FORMAT TO &form.
READ
DO CASE
CASE LASTKEY() = 27
*

- 276 -
* Esc клавиша.
EXIT
CASE LASTKEY() = 18
*
* PgUp key.
IF pg_count > 1
pg_count = pg_count - 1
ELSE
EXIT
ENDIF
OTHERWISE
*
* Любая другая клавиша.
IF pg_count < maxpage
pg_count = pg_count + 1
ELSE
EXIT
ENDIF
ENDCASE
ENDDO
RETURN pg_count

FUNCTION ValidTime
* Написание.: logical = ValidTime(<стринг времени>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS timestring
RETURN VAL(timestring) < 24 .AND.;
VAL(SUBSTR(timestring, 4)) < 60 .AND.;
VAL(SUBSTR(timestring, 7)) < 60

FUNCTION AcceptAt
* Написание.: string = AcceptAt(<строка>, <столбец>, <приглашение>)
* Автор (s).: Ray Love и Fred Ho
* Дата .....: Декабрь 1, 1986 модифицировано Сентябрь 1, 1987
*
PARAMETERS row, col, prompt
PRIVATE char, string
*
STORE "" TO char, string
@ row,col SAY prompt
DO WHILE .T.
char = INKEY(0)
DO CASE
CASE char = 13
*
* Возвращает клавишу.
EXIT
CASE char > 31 .AND. char < 127
*
* Печатуемые символы.
string = string + CHR(char)
@ ROW(), COL() SAY CHR(char)
CASE (char = 8 .OR. char = 19) .AND. LEN(string) > 0
*
* Backspace или Стрелка влево клавиши.

- 277 -
@ ROW(), COL() - 1 SAY " "
@ ROW(), COL() - 1 SAY ""
string = SUBSTR(string, 1, LEN(string) - 1)
ENDCASE
ENDDO
RETURN string

* Program ...: Philes.prg
* Date ......: September 1, 1987
* Note(s) ...: This program demonstrates the use of the low-level
* file I/O functions to a copy a file.
*
? "Copy a file..."

size = 512
buffer = SPACE(size)
total = 0
remaining = 0

ACCEPT "Source file: " TO source
ACCEPT "Target file: " TO target
?

shandle = FOPEN(source)
IF FERROR() = 0

thandle = FCREATE(target)
IF FERROR() = 0


* Get total source file size.
total = FSEEK(shandle, 0, 2)
remaining = total

* Reset file position.
FSEEK(shandle, 0)

DO WHILE (remaining > 0)

IF (remaining < size)
size = remaining && Last part of file.
ENDIF

scount = FREAD(shandle, FWRITE(thandle, buffer, size)
IF tcount <> size
? "Error writing", target
EXIT
ENDIF

remaining = remaining - size

ENDDO

FCLOSE(thandle)

ELSE
? "Cannot create", target, ", DOS error", FERROR()

- 278 -
ENDIF

FCLOSE(shandle)

ELSE
? "Cannot open", source, ", DOS error", FERROR()
ENDIF

? "Total of", total - remaining, "bytes transfered."

* EOP Philes.prg


*** Стринговые функции

FUNCTION Currency
* Написание.: string = Currency(<Числовое выражение>)
* Дата ...: Сентябрь 1, 1987
*
PARAMETERS p1
PRIVATE outstr
outstr = LTRIM(TRANSFORM(p1, "999,999,999,999.99"))
RETURN(SPACE(LEN(STR(p1)) - LEN(outstr) + 1) + "$" + outstr)

FUNCTION StrZero
* Написание.: string = StrZero(<Числовое выражение1>
* [,<Числовое выражение2> [,<Числовое выражение3>]])
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_num, cl_len, cl_dec
PRIVATE cl_str
*
DO CASE
CASE PCOUNT() = 3
cl_str = STR(cl_num, cl_len, cl_dec)
CASE PCOUNT() = 2
cl_str = STR(cl_num,cl_len)
OTHERWISE
cl_str = STR(cl_num)
ENDCASE

IF "-" $ cl_str
* Отрицательное число, минус помещает перед нулями.
RETURN "-" + REPLICATE("0", LEN(cl_str) - LEN(LTRIM(cl_str))) +;
SUBSTR( cl_str, AT("-", cl_str) + 1)
ELSE
* Положительное число.
RETURN REPLICATE("0", LEN(cl_str) - LEN(LTRIM(cl_str))) + LTRIM(cl_str)
ENDIF

*** Функции времени

FUNCTION AmPm
* Написание.: string = AmPm(<стринг времени>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86

- 279 -
*
PARAMETERS cl_time
RETURN IF( VAL(cl_time) < 12, cl_time + " am",;
IF( VAL(cl_time) = 12, cl_time + " pm",;
STR(VAL(cl_time) - 12, 2) + SUBSTR(cl_time, 3) + " pm" ))

FUNCTION Days
* Написание.: n = Days(<Числовое выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_secs
RETURN INT(cl_secs / 86400)

FUNCTION ElapTime
* Написание.: timestring =
* ElapTime(<символьной выражение1>, <символьное выражение2>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_start, cl_end
RETURN Tstring(IF(cl_end < cl_start, 86400 , 0) +;
Secs(cl_end) - Secs(cl_start))

FUNCTION Secs
* Написание.: n = Secs(<символьное выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_time
RETURN VAL( cl_time ) * 3600 +;
VAL(SUBSTR(cl_time,4)) * 60 +;
VAL(SUBSTR(cl_time,7))

FUNCTION Tstring
* Написание.: time string = Tstring(<Числовое выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_secs
RETURN StrZero(INT(Mod(cl_secs/3600, 24)), 2, 0) + ":" +;
StrZero(INT(Mod(cl_secs/ 60, 60)), 2, 0) + ":" +;
StrZero(INT(Mod(cl_secs , 60)), 2, 0)

FUNCTION LenNum
* Написание.: n = LenNum(<Числовое выражение>)
* Автор ...: Tom Rettig
* Дата .....: 11/01/85, 09/01/86
*
PARAMETERS cl_number
RETURN LEN(LTRIM(STR(cl_number)))

*** Массивы

FUNCTION Dim2
* Написание: n = Dim2(<Числовое выражение1>, <Числовое выражение2>)
* Автор ...: Fred Ho

- 280 -
* Дата ....: Сентябрь 9, 1986
*
PARAMETERS x, y
RETURN (((x - 1) * rows) + y)



ГЛОССАРИЙ.
----------

Algorithm
- описание последовательности шагов для решения поставленной
задачи.

Allias
- имя рабочей области; синоним имени файла; это понятие часто
используется для того, чтобы дать файлам базы данных описательные
имена, причем присваивается открытому файлу; если это понятие не
определено для открытого файла, то им становится само имя файла.

Application
- система программ, предназначенных для решения класса
взаимосвязанных задач.
Argument
- величина или переменная, являющаяся входом процедуры или
функции.

Array
- структура данных фиксированной длины к элементам которых можно
обращаться по номеру позиции.
Assignment
- оператор, который копирует величину в переменную; в Clipperе
этот оператор задается знаком = или командой STORE.
Atribute
- 1) при цветном дисплее соответствует интенсивности,
инверсности, подчеркиванию;
2) в формализме СУБД описывает столбец в таблице или поле в базе
данных.

Beginning-of-file
- начало файла; в Clipperе нет строки, соответствующей началу
файла; начало файла индицируется посредством функции BOF(), которая
возвращает значение (.T.) при попытке продвинуть поинтер выше первой
строки или в случае пустого файла.
Buffer
- временное хранилище данных в памяти.

Clause
- режим или требуемый раздел в команде Clipperа, начинающаяся с
ключевого слова, которая модифицирует или улучшает команды.
Column
- число, соответствующее позиции столбца на дисплее или
принтере.

Comment
- часть строки или вся строка, игнорируемая компилятором.
Concatenate

- 281 -
- объединение двух групп символьных данных в одну группу.

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

Constant
- конкретное значение, например, .T. для логической изменяемой,
за исключением переменных типа MEMO.
Control Structure
- любая структура программы, изменяющая выполнение, например, DO
WHILE...ENDDO, DO CASE... ENDCASE, FOR...NEXT, IF...ELSE...ENDIF.
Controlling Master Index
-индекс, который идентифицирует строки по ключу или
последовательность выполнения команды.
Crash Master
- член команды разработки развития программного обеспечения,
который ищет неопределенные граничные условия и фундаментальные
направления разработки программ.

Data Type
- в Clipperе имеется пятть типов данных: символьный, числовой,
тип даты, логический и тип MEMO; переменные могут быть любого типа
кроме MEMO; все операторы с символьными данными, однако, могут
выполняться и с полями типа MEMO.
Database
- совокупность связанных данных, используемая прикладной
системой; база данных может содержать один или несколько файлов.
DBMS
- аналог русской абревиатуры СУБД.

Decrement
- уменьшение величины на фиксированное значение.
Delimeter
- символ для пометки границы.

Destination
- рабочая область или устройство, куда пересылаются данные.
Drive
- буква для обозначения накопителя.

Element
- единичная компонента массива, на которую обычно ссылаются по
индексу.

End-of-file
- конец файла базы данных; в Clipperе это LASTREC()+1 и
индицируется функцией EOF(), возвращающей значение (.T.).

Escape key
- любая клавиша для завершения работы.

Evaluate
- процесс выполнения выражения и возвращения результата.
ExpC
- обозначение символьного выражения.

- 282 -

ExpD
- обозначение выражения типа даты.

ExpL
- обозначение логического выражения.

ExpN
- обозначение числового выражения.

Expression
- комбинация из символов, операторов, идентификаторов, которые
нужно вычислить.

Ext
- расширение имени файла.

Field
- столбец базы данных, который имеет следующие атрибуты: имя,
тип, длину, количество позиций после десятичной точки для численного
типа.

Filename
- имя файла на диске, которое может включать или не включать имя
накопителя, а также расширение.
Function
- в Clipperе есть два типа функций - внутренние и определенные
пользователем; определенная пользователем функция (FUNC) начинается со слова
FUNCTION и содержит RETURN в качестве аргумента.
Identifier
- определенное пользователем имя.

Increment
- увеличение значения на фиксированное число.

Index
- множество ключевых величин, организованных в виде древовидной
структуры, каждый из которых указывает на определенную запись в
реляционной базе данных; в Clipperе индекс содержится в специальном
файле с расширением (.NTX), один индекс в одном файле.
Integer
- число без десятичной точки; в Clipperе нет целого типа.
Iteration
- один из трех основных компонент алгоритма (другие -
последовательность и выбор); итерация это повторение операции,
которая как выбор, позволяет управлять выполнением программы в
зависимости от обстоятельств.
Join
- операция над двумя таблицами, дающая в результате одну
таблицу; это комбинация двух операций - выбора и проекции.
Key expression
- выражение, которое используется в командах INDEX и TOTAL.

Kludge
- неэлегантное решение из-за выхода за основные пределы
программного обеспечения.
List

- 283 -
- список объектов, разделенных запятыми; объектами могут быть
переменные, поля, выражения, имена файлов.
Macro
- идентификатор перемнной, который подставляется по его
содержимому.

Memvar
- имя изменяемой.

Mnemonic
- при вычислениях является идентификатором, который дает
логическое имя объекту.
Module
- самостоятельная процедура или алгоритм, которые имеют
независимые данные и общие функции.
Natural order
- порядок записей, вводимых в базу данных; в таком же порядке,
как без индекса.

Normalization
- процесс выявления и объединения выпадающих элементов данных.
Operand
- терм, существующий по другую сторону оператора.

Operator
- символы, определяющие операции над данными; в Clipperе имеется
четыре класса операторов: логические, математические, реляционные и
стринговые; кроме того, имеется два типа операторов: одинарные и
двоичные: одинарные требуют только одного операнда, а двоичные два.

Parameter
- параметры подразделяются на формальные и фактические;
формальные - переменные, определенные командой PARAMETERS;
фактические - аргументы команды DO...WITH или определенной
пользователем функции.
Существует два метода передачи параметров: по значению и по
ссылке. При передаче по значению фактические параметры принимают
значения из памяти. При выполнении команды PARAMETERS значения
передаются получающим переменным. Передача по ссылке означает, что
передается указатель на фактическое значение, а не само значение. В
Clipperе нет проверяющих аргументов, поэтому нет требования о
совпадении числа формальных и фактических параметров.

Path
- указатель директории. Включает в себя список всех директорий
из корневой, отделенных обратной наклонной чертой.
Procedure
- любая выполнимая последовательность команд, начинающаяся с
оператора PROCEDURE <имя процедуры>.
Procedure file
- файл, содержащий процедуры или определенные пользователем
функции.
Projection
- Термин СУБД, определяющий подмножество полей.

Prompt
- последовательность символов, высвеченных на дисплее,

- 284 -
указывающих на ожидание ввода с клавиатуры.
Queue
- структура данных изменяемой длины, в которой добаляются в один
конец, а извлекаются с другого. Часто описывается как "первый пришел,
первый вышел".

Record
- строка базы данных, состоящая из одного или большего числа
полей.
Recursion
- процесс вызова процедуры или функции самой себя.

Reference
- метод передачи изменяемой в процедуру или определенную
пользователем функцию. Передача по ссылке является локальным
переименованием глобальных переменных.

Row
- числовое выражение, указывающее позицию строки на дисплее или
принтере.
Runtime error
- ошибка при выполнении программы.

Scope
- 1. Часть команды, определяющая диапазон записей к которым
адресуется команда. Для этого используются слова ALL, NEXT, RECORD,
REST.
2. Часть программы, где определяется переменная. В Clipperе есть
две разновидности этого понятия: публичные и приватные переменные.
Публичные переменные определяются в процедурах и функция (FUNC)х,
определенных пользователем. Приватные переменные, определенные в
процедурах или функция (FUNC)х после их выполнения теряются.

Scoreboard
- область экрана на 0 строке, начинающаяся с 60 колонки, где
высвечивается сообщение "<insert>", когда включен режим вставки при
выполнении команд READ и MEMOEDIT(). Здесь же высвечивается сообщение
об ошибке оператора RANGE. Цвет соответствует цвету оператора SAY.

Selection
- 1. Одна из трех компонент алгоритма (другие -
последовательность и итерация). Выбор позволяет управлять выполнением
программы наряду с числом возможных действий, причем действие зависит
от случившихся обстоятельств.
2. Термин СУБД, который определяет подмножество записей в
условии. Выбор задается специальным оператором (в Clipperе -
оператором FOR).
Separator
- Символ или множество символов, котрые определяют поля или
строки друг от друга.
Sequence
- Одна из трех компонент алгоритма (другие два - выбор и
итерация), которая имеет два свойства - дискретность и порядок. В
алгоритме имеется, во-первых, множество дискретных шагов, необходимых
для достижения цели и, во-вторых, некоторое множество шагов, которые
должны быть сделаны перед другими, то есть, устанавливается порядок.
Для примера, перед работой с полями необходимо открыть файл оператором

- 285 -
USE.

Skeleton
- Шаблон, использующийся для определения группы имен полей или
переменных. Символ "*" используется для определения одного или
болшего числа символов, а символ "?" - для одного.

Stack
- Структура данных изменяемой длины, элементы которой
добавляются и извлекаются с одного и того же конца, что
описывают выражением "первым пришел, последним вышел".

String
- Последовательность символов, включающая числа, буквы и
символы.

Stub
- Процедура, использующаяся для отладки, которая имитирует
желаемые действия реальной процедуры. Она может высвечивать
сообщения, возвращать постоянные, но ничего не делать.

Subscript
- Числовое выражение, результат которого указывает на
определенный элемент массива. Его также называют индексом.


Tuple
- Термин СУБД, который относится к строке таблицы или строки в
базе данных. В файлах типа DIF относится также к эквиваленту
строки.

Unary
- Относится к оператору с одним операндом. Типичный пример -
оператор .NOT., который имеет синтаксис .NOT. <условие>.

Undefined
- переменная, которая существует, но которой не присвоено
значение.

User Function
- Определенная пользователем функция (FUNC), которая вызывается командами
ACHOICE() или DBEDIT(). Пользовательская функция (FUNC) передается
посредством стринга.

User-defined function
- Выполняемая совокупность команд, начинающаяся словом FUNCTION
<имя> и содержащая команду RETURN с аргументом. В Clipperе все
определенные пользователем функции должны возвращать значения,
хотя внутренние функции этого не делают.

Value
- Способ, по которому передаются переменные в процедуру и
определенные пользователем функции. Передача по значению
подразумевает, что фактический параметр получает значение и
помещается в память. Когда выполняется команда PARAMETERS,
значение передается получающей изменяемой.


- 286 -
Variable
- идентификатор, имеющий некоторое содержимое;
в Clipperе - переменная или поле.

Vector
- компонента файла типа DIF; эквивалентен полю Clipperа.

View
- термин СУБД для виртуальной таблицы;
физически эта таблица не существует, но определяется по
существующим таблицам; записывается в отдельный файл или как
элемент в системный словарь-файл.

Wait State
- состояние ожидания ввода с клавиатуры; определяется командой
SET KEY; к этому состоянию приволят команды ACCEPT, INPUT, MENU
TO, READ, WAIT.

Work Area
- рабочая область, в которой могут содержаться файлы базы данных
и индексы; именуются по ALIAS, номеру, символу.
Приложение A - объясняет как получить техническую поддержку и
консультации при использовании Clipperа.

Приложение B - содержит лицензионные соглашения фирмы.

Приложение C - содержит список команд dBASE III PLUS, не
поддерживаемые Clipperом.

Приложение D - содержит сообщения об ошибках при компиляции.

Приложение E - содержит сообщения об ошибках при линковке
посредством линкера PLINK86-Plus.

Приложение F - содержит сообщения об ошибках при выполнении
программы.

Приложение G - содержит таблицу кодов ASCII и список значений
функции inkey().

Приложение H - содержит список зарезервированных слов.

Приложение I - содержит список команд линкера PLINK86-Plus.

Приложение J - содержит примеры программирования.


ПРИЛОЖЕНИЕ C.

СПИСОК КОМАНД dBASE III PLUS, НЕ ПОДДЕРЖИВАЕМЫХ CLIPPERОМ

Некоторые команды и функции dBASE III PLUS не поддерживаются
Clipperом. Clipper не поддерживает любые команды, которые вызываются
в интерактивном режиме.


APPEND MODIFY QUERY
ASSIST MODIFY REPORT
BROWSE MODIFY SCREEN
CHANGE MODIFY STRUCTURE
CLEAR FIELDS MODIFY VIEW
CREATE LABEL ON ERROR/ESCAPE/KEY
CREATE REPORT RESUME
CREATE QUERY RETRY
CREATE SCREEN RETURN TO MASTER
CREATE VIEW SET
DISPLAY FILES SET CARRY
DISPLAY MEMORY SET CATALOG
DISPLAY STATUS SET COLOR ON/OFF
DISPLAY STRUCTURE SET DEBUG
DISPLAY USERS SET DO HISTORY
EDIT SET ECHO
ERROR() SET ENCRYPTION
EXPORT TO SET FIELDS
HELP SET HEADING
IMPORT FROM SET HELP
INSERT SET HISTORY
LIST FILES SET MEMO WIDTH

- 259 -
LIST HISTORY SET MENUS
LIST MEMORY SET SAFETY
LIST STATUS SET STATUS
LIST STRUCTURE SET STEP
LOAD SET TALK
LOGOUT SET TITLE
MESSAGE SET TYPEAHEAD
MODIFY COMMAND SET VIEW
MODIFY LABEL

Многие команды dBASE III PLUS поддерживаются Clipperом не прямо,
а посредством его утилит, описанных в главе 12.


ПРИЛОЖЕНИЕ D.

СООБЩЕНИЯ ОБ ОШИБКАХ КОМПИЛЯЦИИ

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

ACCEPT/INPUT error
APPEND error
ASSIGNMENT error
AVERAGE error
AVERAGE number of expressions and variables
CALL error
CLEAR error
CLOSE error
COPY error
COUNT error
CREATE error
DELETE error
DO error
FILTER error
FOR error
LABEL error
LIST error
LOCATE error
PARAMETER error
RECALL error
RELATION error
RELEASE
REPLACE error
RESTORE error
SAVE error
SET error
SET not recognised
SET switch error
SUM error
USE error
WAIT error

Следующие сообщения относятся к специфическим ошибкам и
ситуациям.


- 260 -
Case w/o do case
Не найден предшествующий DO CASE.

else w/o if
Не найден предшествующий IF <условие>.

endcase w/o do case
Не найден предшествующий DO CASE.

enddo w/o while
Не найден предшествующий DO WHILE.

endif w/o if
Не найден предшествующий IF <условие>.

exit w/o do while
- Не найден предшествующий DO WHILE <условие>.

Fatal at <n> invalid procedure name
Два процедурных файла содержат процедуры с одним и тем же
именем.
Замечание: это сообщение выдается только на экран и не может
записываться в файл сообщений об ошибках.

illegal device
Неверная опция SET DEVICE TO <SCREEN/PRINT>

illegal value
Левая часть оператора присвоения содержит неверное имя. Нельзя
присваивать при помощи оператора STORE значения числу (например, 12
присвоить 100+1). Нельзя присвоить значение функции (например,
INKEY()=12).
loop w/o do while
Оператор LOOP должен быть внутри структуры DO WHILE ... ENDDO.

missing 2nd quote
Не найден конечный разделитель стринга.

next w/o for
Оператор NEXT должен соответствовать оператору FOR.

otherwise w/o do case
Оператор OTHERWISE должен быть внутри структуры DO CASE ...
ENDCASE.

rest of line ignored
Написание остатка строки не поддерживается и игнорируется
компилятором.
symbol redefinition error
Все файлы и процедуры должны иметь уникальные имена. Сообщение
обычно высвечивается когда файл процедуры и имя процедуры в нем имеют
одно и то же имя.

too many constants
Компилятор нашел слишком много констант при разборе исходного
кода. Нужно компилировать программу по секциям и объединять при
линковке.

- 261 -
too many symbols
Компилятор нашел слишком много символов при разборе исходного
кода. Нужно компилировать программу по секциям и объединять при
линковке.

unbalanced DO CASE
Не найден оператор ENDCASE. Возможно это вызвано
несбалансированностью условного оператора.

unbalanced DO WHILE
Не найден оператор ENDDO. Возможно это вызвано
несбалансированностью условного оператора.

unbalanced FOR/NEXT
Не найден оператор NEXT для предыдущего оператора FOR. Возможно
это вызвано несбалансированностью условного оператора.

unbalanced IF/ELSE
Не найден оператор ENDIF для предыдущего оператора FOR. Возможно
это вызвано несбалансированностью условного оператора.

verb not recognized
Команда не поддерживается Clipperом. Нужно проверить написание и
синтаксис.