Программы, написанные на языке
Си, могут обращаться к программам на других
языках и наоборот, что позволит пользователю
использовать необходимые конструкции наиболее
эффективно. Если организовать взаимодействие
программ, написанных на Си и Паскале, то первый
язык предоставляет эффективные средства,
приближённые к ресурсам компьютера (обработка
бит, операции адресной арифметики и т.п.), а второй
– высокоуровневые конструкции (множества,
средства простой работы с файлами и т.п.). Кроме
того, предоставляется реальная возможность
использовать специфические операторы языка. В
Паскале это интервальные типы данных, записи с
вариантами, средства строгого контроля описаний;
в Си – операции (,), (?:),
поля, смеси, специальные классы памяти и т.п.
Решение проблем взаимодействия
программ на разных языках – вопрос довольно
сложный. Рассмотрим его только в общих чертах,
чтобы создать общее впечатление о том, как это
делается.
Предположим, что программа cipas, написанная на Паскале, должна
обратиться к программе fun
на Си. Вид этой подпрограммы в Паскале – функция.
Ей передаются значения двух переменных i и j целого
типа. Функция fun должна
возвратить целое значение, равное i-j, которое в программе на Паскале
выводится на экран.
Program cipas;
{$L c:prim.obj}
var i,j:Integer;
function fun (i,j:integer):integer; external;
begin
.
writeln(‘Введите i и j через пробел’);
read(i,j);
writeln(fun(i,j));
end.
.
Подключение файла c:prim.obj с функцией fun
Объявление переменных i и
j целого типа
Объявление внешней функции
(external) fun с прототипами i и j. Функция fun
возвращает целое значение.
.
Ввод с клавиатуры значений i
и j.
.
Вывод значения функции fun
Объектный модуль
функции fun, написанный на
Си, находится в файле c:prim.obj, который подключается по директиве {$L
c:prim.obj}.
Текст функции fun на Си имеет вид:
Переменным i и j программы
на Паскале, соответствуют переменные b и c в
программе на Си.
Теперь можно выполнить
трансляцию исходного модуля prim.c, например с помощью автономного
транслятора TCC.EXE (вместе с
файлом TCC.EXE на диске должен присутствовать файл
TURBOC.CFG, поставляемый вместе с системой
программирования Турбо Си). После выполнения
трансляции модуль prim.obj
будет записан на диск.
Замечание!При запуске
транслятораTTC.EXEв
среде ОС необходимоввести
команду: C>TTC A:PRIM.C
Здесь
подразумевается, что файл транслятораTTC.EXEнаходятся наустройствеC:, а исходный текст программыPRIM.C – на устройстве A:.
Рассмотрим другой пример. В
программе на Паскале исходные данные вводятся с
клавиатуры (a и b) и передаются процедуре fun2 через глобальную область памяти
(поэтому функция fun2 не имеет
параметров). Затем в функции fun2, написанной на Си, значение a передаётся b,
а значение b – a.
Результаты также помещаются в глобальную память,
поэтому они будут доступны программе на Паскале.
Ключевое слово extern указывает
на то, что переменные a и b объявлены в программе
на Паскале. Рассмотрим тексты:
Загрузочный модуль получается
так же, как и в примере, рассмотренном выше.
Кроме приведённых примеров,
можно рассмотреть также и вызов из программы на
Си, программы написанной на Паскале. В
приведённых ниже двух программах как раз и рассматривается такой случай:
из модуля на Паскале вызывается подпрограмма на
Си, и затем из неё вызывается подпрограмма
написанная на Паскале.
Процедура fun3 в модуле vvv –
внешняя; она записана на Си. Из функции на языке
Си происходит обращение к внешней функции sum, которая является процедурой,
написанной на языке Паскаль. Действия в
подпрограмме выбраны очень простыми для
облегчения восприятия.
Следует так же заметить, что
описание exter void sum(int n);
указывает на то, что функция sum не возвращает значений (void) и является внешней (extern). Ей передаётся всего один параметр n
целого типа. Переменные a и b доступны
основной Паскаль-программе и всем подпрограммам,
поскольку помещены в глобальную область.