 |
тельные библиотеки Си. Третий пример демонстрирует распределение
памяти. Последний пример описывает практическую программу работы
с графикой и демонстрирует некоторые мощные возможности, которые
вы получите от комбинирования двух языков.
- 185,186 -
Компоновка Турбо Си и Турбо Пролога: обзор
-----------------------------------------------------------------
Компиляция и компоновка ваших модулей, написанных на Турбо
Си, с модулями и программами Турбо Пролога выполняется напрямую.
Вам только необходимо запомнить следующие пункты:
Компиляция ваших программных модулей:
# Ваши Си функции, вызываемые Турбо Прологом, должны иметь суф-
фикс _0 (см. первый пример программы на Си, CSUM.C, в этой
главе) , если вы не используете в Турбо Прологе расширение as
"".
# Ваш главный модуль, написанный на Турбо Прологе, т.е. модуль
с разделом goal, заменяет ваш главный модуль на Си.
# Главный модуль Турбо Пролога должен содержать ваши Си функ-
ции, описанные как глобальные предикаты. (Смотри первый при-
мер Пролог программы PROSUM.PRO в этой главе).
# Все программные модули должны компилироваться в большой моде-
ли памяти (которая является единственным размером памяти, ис-
пользуемым при компиляции Турбо Пролога).
# Если ваша программа вызывает библиотеки Турбо Пролога версий
1.1 - 2.0 , то вы должны компилировать модули в выключенном
режиме размещения переменных в регистрах (-r-).
# Генерация подчеркивания должна быть отключена (-u-).
Компоновка ваших программных модулей:
# INIT.OBJ должен быть первым объектным файлом компоновки.
(Этот модуль инициализации Турбо Пролога находится на диске
библиотек Турбо Пролога.)
# Если вам необходимы подпрограммы из библиотек Турбо Си, то
используйте CL.LIB, а если вы используете арифметику с дейс-
твительными числами (real arithmetic), то еще - EMU.LIB и
MATHL.LIB.
Командная строка компоновщика должна иметь вид:
- 187,188 -
tlink init Другие_файлы , [exe_файл], [ваши_библиотеки] prolog [emulibmathl] cl
(она должна быть набрана в одной командной строке)
В дополнение к предыдущим правилам вам нужно запомнить
следующее:
# Функции Турбо Пролога могут вызывать функции, написанные на
Турбо Си, по аналогии со встроенными в Турбо Пролог предика-
тами (функциями).
# Все вызовы функций из библиотеки Турбо Си должны иметь пре-
фикс - нижнее подчеркивание (_). Замечание. Все имена библио-
течных функций Турбо Си содержат префикс нижнее подчеркива-
ние. Поэтому, поскольку генерация нижнего подчеркивания вык-
лючена, то к вызову библиотечных функций должен явно добав-
ляться символ нижнего подчеркивания. Определяемые же пользо-
вателем функции не нуждаются в этом символе.
# malloc, calloc, free и другие функции распределения памяти
Турбо Си заменяются в Турбо Прологе на alloc_gstack, _malloc
и _free. Эти функции доступны в Турбо Прологе и служат для
размещения памяти внутри ваших Турбо Си функций.
Функция alloc_gstack распределяет память в глобальном стеке
и вызывается так:
void *alloc_gstack(int size).
_malloc распределяет память в "куче" (heap) Пролога и вызы-
вается так:
void *_malloc (int size).
_free освобождает память, распределеную в "куче" Пролога, и
вызывается так:
_free(void *ptr, int size).
Когда используется alloc_gstack, память при неудачной отра-
ботке освобождается автоматически, что заставляет Турбо Про-
лог производить откат через операцию размещения памяти.
- 189,190 -
# printf, putc и соответствующие им функции вывода на экран не
работают после компоновки Турбо Си и Турбо Пролога. Тем не
менее, писать символы в окна Пролога может wrch, а zwf явля-
ется аналогом предиката Турбо Пролога writef. zwf - это
printf с некоторыми ограничениями.
zwf(FormatString, аргумент 1, аргумент 2, аргумент 3, ...)
FormatString - строка формата, аналогичная используемой в
printf. Посмотрите в справочном руководстве по Турбо Проло-
гу, какие спецификации преобразования поддерживаются.
zwf и wrch находятся в PROLOG.LIB.
# Функции Си, вызываемые Турбо Прологом, не должны возвращать
значений и должны быть определены как void. Шаблон на аргу-
менты должен быть специфицирован в глобальных объявлениях
предикатов Турбо Пролога. Так:
factorial(integer,real) - (i,o) language c
позволяет определить Турбо Прологу, что factorial - есть
функция от двух аргументов: первый - integer (целый), второй
- real (с плавающей точкой). Конструкция (i,o) указывает,
что первый аргумент (integer) является входным, а второй -
указатель на число с плавающей точкой, которому будет прис-
воено значение факториала. Буква с в этой конструкции указы-
вает Турбо Прологу, что эта функция использует соглашения
вызывов Си (смотри третий пример программы в этой главе:
DUBLIST.C и PLIST.PRO).
Заметьте, что значение возвращается в виде указателя.
Для большей информации по описанию шаблонов на аргументы
смотрите обсуждение его альтернативы в примере 3.
- 191,192 -
Пример 1: Сложение двух целых чисел
-----------------------------------------------------------------
Следующий пример комбинирует функцию Турбо Си (которая скла-
дывает два целых числа) с модулем на Турбо Прологе, который поме-
щает результат, вычисленный функцией Си, в текущее окно.
Исходный файл Турбо Си: CSUM.C
-----------------------------------------------------------------
/*
подпрограмма вывода zwf работает подобно подпрограмме printf язы-
ка Си. Она печатает результат в текущем окне
*/
extern void zwf(char *format, ...);
void sum_0(int parm1,int parm2, int *res_p)
{
zwf("Это функция суммирования: parm1=%d, parm2=%d, parm1,parm2);
*res_p=parm1+parm2;
}
/* конец sum_0 */
Компиляция CSUM.C в CSUM.OBJ
-----------------------------------------------------------------
После редактирования и сохранения на диске файла CSUM.C, вам
необходимо выбрать опции для его компиляции. Турбо Си для этого
предоставляет вам два метода:
1. Выберете опции для компиляции из меню Интегрированной
среды Турбо Си:
Options/Compiler/Model/Large (-ml)
Options/Compiler/Optimization/Jump Optimization...On (-O)
Options/Compiler/Code Generation/Generate Underbars...Off (-u-)
Options/Compiler/Optimization/Use Register Variables...Off (-r-)
Сразу после выбора опций выберите в главном меню Турбо Си
опцию Options/Store options - Опции/Сохранить опции, когда же на-
 |
|