Страница 23 из 56
тельные библиотеки Си. Третий пример демонстрирует распределение
памяти. Последний пример описывает практическую программу работы
с графикой и демонстрирует некоторые мощные возможности, которые
вы получите от комбинирования двух языков.
- 185,186 -
Компоновка Турбо Си и Турбо Пролога: обзор
-----------------------------------------------------------------
Компиляция и компоновка ваших модулей, написанных на Турбо
Си, с модулями и программами Турбо Пролога выполняется напрямую.
Вам только необходимо запомнить следующие пункты:
Компиляция ваших программных модулей:
# Ваши Си функции, вызываемые Турбо Прологом, должны иметь суф-
фикс _0 (см. первый пример программы на Си, CSUM.C, в этой
главе) , если вы не используете в Турбо Прологе расширение as
"
вается так:
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 - Опции/Сохранить опции, когда же на-