Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебно-практическое пособие ПРОГ.doc
Скачиваний:
38
Добавлен:
20.11.2019
Размер:
5.63 Mб
Скачать

3.6.2.Прототипы функций

До сих пор все встречающиеся пользовательские функции определялись до главной функции main. Вызовы функций осуществлялись в функции main. Поэтому при трансляции строки функции main, содержащей вызов некоторой пользовательской функции, компилятору уже была известна вся информация об этой пользовательской функции, и ошибок трансляции не возникало.

Однако в некоторых случаях может возникнуть необходимость поместить строку вызова функции до описания самой функции. Одной из причин помещения пользовательских функций после функции main является повышение наглядности программы. Например, перепишем предыдущий пример следующим образом:

#define N 5

int a[N]={1,2,3,4,5}

int main() {

printf("Сумма элементов массива a=%d",sum_array(a,N));

}

int sum_array(int *x, int n) {

int i,s=0;

for(i=0;i<n;i++) s+=x[i];

return s;

}

Такая программа более наглядна, т.к. функция, выполняющая детальную реализацию, вынесена в конец программы, а главная функция - в начало.

Однако при трансляции строки

printf("Сумма элементов массива a=%d",sum_array(a,N));

компилятор выдаст ошибку, связанную с тем, что функция sum_array(a,N) еще не определена.

Для устранения подобных ошибок используют прототипы функций. Прототип функции сообщает информацию об имени функции, типе возвращаемого значения, количестве и типах ее аргументов. Пример:

int sum_array(int *x, int n);

Описан прототип функции sum_array. Имена аргументов x и n здесь являются лишь комментариями, не несущими никакой информации для компилятора. Их можно опускать, например, описание

int sum_array(int *, int);

является допустимым.

Описания прототипов функций обычно выносятся в заголовочные файлы. Для коротких программ, которые помещаются в одном файле, описания прототипов располагают в начале программы. Предыдущая программа должна быть переписана следующим образом:

#define N 5

int a[N]={1,2,3,4,5}

int sum_array(int *, int);

int main() {

printf("Сумма элементов массива a=%d",sum_array(a,N));

}

int sum_array(int *x, int n) {

int i,s=0;

for(i=0;i<n;i++) s+=x[i];

return s;

}

Отметим, что определение функций до вызывающей функции и не использование прототипов функций сделает программу на несколько строк короче, но такой подход считается плохим стилем. Лучше всегда описывать прототипы всех функций в начале текста. Это связано с тем, что функции могут вызывать друг друга, и правильно упорядочить их (чтобы вызываемая функция была реализована раньше вызывающей) во многих случаях невозможно. К тому же предпочтительнее, чтобы основная функция main, с которой начинается выполнение программы, была бы реализована раньше функций, которые из нее вызываются. Это соответствует принципам структурного программирования.

3.6.3.Аргументы командной строки

Аргументы командной строки являются параметрами функции main, с которой начинается выполнение Си-программы. До сих пор применялся вариант функции main без параметров, однако, при необходимости доступа к аргументам командной строки можно использовать следующий заголовок функции main:

int main(int argc, char *argv[]) { . . . }

Переменная argc равна числу аргументов, т.е. отдельных слов командной строки, а массив argv содержит указатели на строки, каждая из которых равна очередному слову командной строки. Нулевой элемент argv[0] равен имени программы. Таким образом, число аргументов argc всегда не меньше единицы.

Например, при запуске программы testprog с помощью командной строки

testprog -x abcd.txt efgh.txt

значение переменной argc будет равно 4, а массив argv будет содержать 4 строки "testprog", "-x", "abcd.txt" и "efgh.txt".

Пример программы, печатающей аргументы своей командной строки:

// Файл "comargs.cpp"

// Напечатать аргументы командной строки

#include <stdio.h>

int main(int argc, char *argv[]) {

int i;

printf("Число аргументов ком. строки = %d\n", argc);

printf("Аргументы командной строки:\n");

for (i = 0; i < argc; ++i) {

printf("%s\n", argv[i]);

}

return 0;

}