adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
int (f1); Функция, возвращающая целое.
typedef int *intptr;
intptr p1; Указатель на целое.
intptr f2(); Функция, возвращающая указа-
тель на целое.
typedef int far *farptr;
farptr p2; Far-указатель на целое.
farptr f3(); Near-функция, возвращающая
far-указатель на целое.
intptr far f4(); Far-функция, возвращающая
near-указатель на целое.
typedef int (*fncptr1)(int);
fncptr1 fp1; Указатель на функцию, воз-
вращающую целое и принимаю-
щую целое.
typedef int (*fncptr2)(intptr);
fncptr2 fp2; Указатель на функцию, воз-
вращающую целое и принимаю-
щую указатель на целое.
typedef int (far *ffptr)(far ptr);
ffptr fp3; Far - указатель на функцию,
вовращающую целое и принима-
ющую far-указатель на целое.
typedef ffptr ffplist[5];
ffplist list; Массив из 5 far- указателей
на функции, возвращающие це-
лое и принимающие far-указа-
ли на целое.
- 361,362 -
ffptr gopher(ffplist); Near-функция,принимающая мас-
сив из 5 far-указателей на
функции, возвращающие целое и
принимающие far-указатели на
целое, и возвращающая один из
этих указателей.
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
Таблица 12.4. Объявление указателей при помощи typedef
Как видите, есть значительная разница в наглядности и чет-
кости восприятия между объявлением gopher при помощи typedef и
предыдущим способом объявления. При грамотном использовании опе-
раторов типа typedef и прототипов функций вам легче будет состав-
лять, отлаживать и сопровождать ваши программы.
Использование библиотечных файлов
----------------------------------------------------------------
Турбо Си предлагает версию стандартных библиотечных подпрог-
рамм для каждой из шести моделей памяти. Применяясь для работы в
интегрированной среде (TC), Турбо Си достаточно хорошо приспособ-
лен для компоновки требуемых библиотек в нужном порядке в зависи-
мости от выбранной вами модели. Кроме того, будучи применен как
автономный компилятор (TCC), Турбо Си достаточно хорошо приспо-
соблен для автоматической компоновки.
Однако, если вы используете непосредственно TLINK (компонов-
щик Турбо Си) как автономный редактор связей, то вам необходимо
точно определить, какие библиотеки использовать. Если вы не соби-
раетесь использовать все 6 моделей памяти, то вам нужно перепи-
сать на рабочий или жесткий диск лишь файлы используемой модели
(моделей).
- 363,364 -
Ниже приведен список библиотечных файлов для каждой модели
памяти.
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
Крохотная COT.OBJ, MATHS.LIB, CS.LIB
Малая COS.OBJ, MATHS.LIB, CS.LIB
Компактная COС.OBJ, MATHC.LIB, CC.LIB
Средняя COM.OBJ, MATHM.LIB, CM.LIB
Большая COL.OBJ, MATHL.LIB, CL.LIB
Огромная COH.OBJ, MATHH.LIB, CH.LIB
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
Заметим, что крохотная и малая модели используют одни и те
же библиотеки, но имеют разные стартовые файлы (COT.OBJ и
COS.OBJ). Кроме того, если ваша система имеет математический соп-
роцессор 8087/80287, то вам понадобится файл FP87.LIB; если же вы
хотите эмулировать 8087/80287, то вам нужен файл EMU.LIB.
Приведем несколько примеров командных строк TLINK:
tlink c0m a b c, prog, mprog,fp87 mathm cm
tlink c0c d e f, plan, mplan, emu mathc cc
Первая из командных строк выполнит программу, имя которой
PROG.EXE, включающую в себя библиотеки средней модели и скомпоно-
ванную в ней библиотеку поддержки 8087/80287. Вторая вызовет
программу PLAN.EXE, скомпилированную в виде компактной модели
программы, эмулирующей подпрограммы 8087/80287 с плавающей точ-
кой, если нельзя воспользоваться сопроцессором.
Замечание: Порядок элементов в командной строке очень важен.
Модуль (C0x.OBJ) всегда должен стоять на первом месте. Список
включенных библиотек должен иметь установленный порядок:
- ваши собственные библиотеки (если они имеются);
- FP87.LIB или EMU.LIB, следующие за MATHx.LIB (необходимо
только при использовании плавающей точки);
- Cx.LIB (стандартный файл библиотеки поддержки Турбо Си).
(Буква x в модулях C0x, MATHx и Cx заменяется на букву, определя-
ющую модель памяти: t,s,m,c,l или h).
- 365,366 -
Компоновка смешанных модулей
-----------------------------------------------------------------
Предположим, что вы скомпилировали один модуль, используя
малую модель памяти, а другой - используя большую модель, а затем
решили объединить их. Что произойдет?
Файлы легко объединятся вместе, но вы столкнетесь с пробле-
мами, аналогичными описанным в разделе "Объявление функций как
NEAR или FAR". Если функция в малом модуле вызывает функцию в
большом модуле, то это происходит при помощи near-вызова, кото-
рый, вероятно, будет выполнен неверно. Более того, вы можете на-
толкнуться на проблемы, описанные в разделе "Объявление указате-
лей как NEAR, FAR или HUGE", поскольку функция в малом модуле
предполагает передачу и получение near-указателей, в то время как
функция в большом модуле - far-указателей.
Решение этих проблем заключается опять-таки в использовании
прототипов функций. Предположим, что вы размещаете myputs в его
же модуле и компилируете его в большой модели памяти. Тогда вам
надо создать заголовок файла MYPUTS.H (или какое-либо другое имя
с расширением ".H"), в котором бы содержался следующий прототип
функции:
void far myputs(char far *s);
Теперь,если вы размещаете main в его собственном модуле (с
именем MYMAIN.C), делайте это следующим образом:
#include
#include "myputs.h"
main()
{
char near *mystr;
mystr = "Hello, world\n";
myputs(mystr);
}
Когда вы компилируете эту программу, Турбо Си читает прото-
тип функции из MYPUTS.H и воспринимает его как far-функцию, пред-
- 367,368 -
полагающую наличие far-указателя. Поэтому он сформирует надлежа-
щую программу, даже если она скомпилирована с использованием ма-
лой модели памяти.
Наконец, как же поступать, если вам надо выполнить компонов-
ку с библиотечными подпрограммами? Лучше всего в этом случае ис-
пользовать одну из библиотек больших моделей, объявив все ее ком-
поненты как far. Для этого скопируйте каждый заголовочный файл,
который вы обычно используете (такой как STDIO.H) и переименуйте
соответствующим образом копии (например, FSTDIO.H).
После этого отредактируйте каждый скопированный прототип
функции таким образом, чтобы он был однозначно far, например:
int far cdecl printf(char far * format, ...);
|
adfun.ru
|
|
|
|