cc file1.c file2.0
КомпиляторыLattice C иMICROSOFT C
Выполните раздельную компиляцию функции, содержащихся в файлах filel.cи file2.c;в результате будут получены два файла с объектным кодом - file1.objи file2.obj. Используйте системный редактор связей для объединения их друг с другом и со стандартным объектным модулем с.obj:
link с filel file2
Системы, построенные на основе трансляции в ассемблерный код
Некоторые из таких систем позволяют компилировать функции, содержащиеся в нескольких файлах, сразу так же, как в ОС UNIX с помощью команды:
сс filel.с file2.c
или какого-то ее эквивалента. В некоторых случаях вы можете получить отдельные модули с кодом ассемблера, а затем объединить их, используя процесс ассемблирования.
Для создания больших программ вы должны использовать функции в качестве "строительных блоков". Каждая функция должна выполнять одну вполне определенную задачу. Используйте аргументы для передачи значений функции и ключевое слово returnдля передачи результирующего значения в вызывающую программу. Если возвращаемое функцией значение не принадлежит типу int, вы должны указать тип функции в ее определении и в разделе описаний вызывающей программы. Если вы хотите, чтобы при выполнении функции происходило изменение значении переменных в вызывающей программе, вы должны пользоваться адресами и указателями.
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
Как определять функцию.
Как передавать функции информацию: при помощи аргументов.
Различие между формальным и фактическим аргументами: первый является переменной, используемой функцией, а второй - значением, поступающим из вызывающей функции.
Где необходимо описывать аргументы: после имени функции и перед первой фигурной скобкой.
Где необходимо описывать остальные локальные переменные: после первой фигурной скобки.
Когда и как использовать оператор return.
Когда и как использовать адреса и указатели для доступа к объектам.
1. Напишите функцию, возвращающую сумму двух целых чисел.
2. Какие изменения должны были бы произойти с функцией из вопроса 1, если вместо целых складывались бы два числа типа float?
3. Напишите функцию alter( ), которая берет две переменные хи утипа intи заменяет соответственно на их сумму и разность.
4. Проверьте, все ли правильно в определении функции, приведенной ниже?
salami(num)
{
int num, count;
for(count = 1; count <= num; num++) printf(" Осалями!\n");
}
1.
sum(j,k) int j, k;
{ return(j+k); }
2.
float sum(j,k) float j,k;
Необходимо также привести описание функции float sum( )и вызывающей программе.
3. Поскольку мы хотим изменить две переменные в вызывающей программе, можно воспользоваться адресами и указателями. Обращение к функции будет выглядеть так: alter(&x,&y). Возможное решение имеет следующий вид:
alter(px, ру)
int *рх, *ру; /* указатели на х и у*/
{
int sum, diff;
sum = *рх + *ру; /* складывает содержимое двух переменных, определяемых адресами */
diff = *рх- *ру;
*рх= sum;
*ру = diff;
}
4. Нет; переменная numдолжна быть описана перед первой фигурной скобкой, а не после нее. Кроме того, выражение num++необходимо заменить на count++.
1. Напишите функцию mах(х, у), возвращающую большее из двух значении.
2. Напишите функцию chllne(ch, i, j), печатающую запрошенный символ с i-й пo j-ю позиции. Смотри программу художник-график, приведенную в гл. 7.
10. Классы памяти и разработка программ
ЛОКАЛЬНЫЕ И ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
КЛАССЫ ПАМЯТИ
ФУНКЦИЯ ПОЛУЧЕНИЯ СЛУЧАЙНЫХ ЧИСЕЛ
ПРОВЕРКА ОШИБОК
МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ
СОРТИРОВКА
КЛЮЧЕВЫЕ СЛОВА: auto, extern, static, register
Одно из достоинств языка Си состоит в том, что он позволяет управлять ключевыми механизмами программы. Классы памяти языка Си - пример такого управления; они дают возможность определить, с какими функциями связаны какие переменные и как долго переменная сохраняется в программе. Классы памяти - первая тема данной главы.
Программирование, точно так же как написание романа (или даже письма),- это не просто знание языковых правил - это нечто большее. В данной главе мы рассмотрим несколько полезных функций. При этом попытаемся привести некоторые соображения, используемые при конструировании функций. В частности, сделаем упор на значение модульного подхода, разбивающего программы на выполнимые задачи. Сначала, однако, обсудим классы памяти.
Читать дальше