Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Розділ 11. Модульне програмування частина 1.docx
Скачиваний:
7
Добавлен:
20.08.2019
Размер:
213.82 Кб
Скачать

Самостійна робота Функція main(). Розбір параметрів рядка.

Функція main, з якої розпочинається виконання С-програми, може бути визначені з параметрами, котрі передаються з зовнішнього середовища, наприклад, з командного рядка. Для передачі даних в функцію main використовуються 2 параметра, перший параметр служить для передачі числа даних, що передаються, другий – для передачі самих даних. Загальноприйняті імена цих параметрів argc і argv. Параметр argc має тип int, його значення формується з аналізу командного рядка і рівне кількості слів в командному рядку, включаючи і ім’я програми, що викликається. Параметр argv це масив вказівників на рядки, кожна з котрих містить одне слово з командного рядка. Якщо слово повинно містити символ пробіл, то при запису його в командний рядок воно повинно бути взяти в кавички.

Функція main може мати і третій параметр, котрий прийнято називати argp, і котрий потрібен для передачі в функцію main параметрів операційної системи в якій виконується програма.

Заголовок функції main має вигляд:

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

Якщо, наприклад, командний рядок С-програми має вигляд:

A:\>cprog working 'C program' 1

то аргументи argc, argv, argp преставляються в пам’яті як показано на схемі рис.1.

argc [ 4 ]

argv [ ]--> [ ]--> [A:\cprog.exe\0]

[ ]--> [working\0]

[ ]--> [C program\0]

[ ]--> [1\0]

[NULL]

argp [ ]--> [ ]--> [path=A:\;C:\\0]

[ ]--> [lib=D:\LIB\0]

[ ]--> [include=D:\INCLUDE\0]

[ ]--> [conspec=C:\COMMAND.COM\]

[NULL]

Рис.1. Схема розміщення параметрів командного рядка

Операційна система підтримує передачу значень для параметрів argc, argv, argp, а користувач відповідає за передачу і використання фактичних аргументів функції main.

Наступний приклад показує програму друку фактичних аргументів, що передаються у функцію main з операційної системи і параметрів операційної системи.

Приклад:

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

{ int i=0;

printf ("\n Имя программы %s", argv[0]);

for (i=1; i>=argc; i++)

printf ("\n аргумент %d равен %s", argv[i]);

printf ("\n Параметры операционной системы:");

while (*argp)

{ printf ("\n %s",*argp);

argp++;

}

return (0);

}

Доступ до параметрів операційної системи можна також отримати при допомозі бібліотечної функції geteuv, її прототип має наступний вигляд:

char *geteuv (const char *varname);

Аргумент цієї функції задає ім’я параметра середовища, вказівник на значення котре видає функція geteuv. Якщо вказаний параметр не визначений в середовищі в даний момент, то значення, що повертається рівне NULL.

Використовуючи вказівник отриманий функцією geteuv, можна тільки прочиати значення параметра операційної системи, але не можна його змінити. Для значення параметра системи призначена функція puteuv.

Компілятор мови С будує С-програму таким чином, що на початку роботи програми виконується деяка ініціалізація, що включає крім всього іншого і обробку аргументів, що передаються функцією main, і передачу їй значення параметрів середовища. Ці дії виконуються бібліотечними функціями _setargv і _seteuv, котрі завжди розміщуються компілятором перед функцією main.

Якщо С-програма не використовує передачу аргументів і значення параметрів операційної системи то має зміст заборонити використання бібліотечних функцій _setargv и _seteuv помістивши в С-програму перед функцією main функції з такими ж іменами, но не виконуючи ніяких дій. Початок програми в такому випадку має вигляд:

_setargv()

{ return ; /* пустая функция */

}

-seteuv()

{ return ; /* пустая функция */

}

int main()

{ /* главная функция без аргументов */

...

...

renurn (0);

}

В даному прикладі при виклику бібліотечних функцій _setargv і _seteuv будуть використані функції розміщені в програмі користувачем і не виконують ніякі дії. Це знизить розмір отриманого exe-файла.