Реферат на тему:

Функції зі змінним числом параметрів.

командна стрічка, параметри функції MAIN ()

1. ФУНКЦІЇ ЗІ ЗМІННИМ ЧИСЛОМ ПАРАМЕТРІВ

У С/C++ поряд з використанням функцій з фіксованим числом параметрів
можна використовувати функції зі змінним числом параметрів, тобто
функції, у які можна передавати дані, не описуючи їх у прототипі й
заголовку функції. Описи цих даних заміняються трьома крапками. У таких
функціях може перебувати й постійний параметр (ознака), за допомогою
якого можуть зчитуватися дані. Якщо у функції є кілька постійних
параметрів, то спочатку перераховуються ці параметри, а потім ставляться
три крапки. Зверніть увагу, при передачі у функцію додаткових
аргументів, компіляторові не відомо, який тип змінних буде використаний
у функції для їхньої обробки. Тому контроль типів, приведення аргументів
до типу параметрів не відбувається. Необхідні перетворення повинен
передбачити програміст. Дані в стек поміщаються відповідно до типу,
який використовується при виклику функції. В C++ повинен бути хоча б
один фіксований параметр.

Можливість передачі змінного списку параметрів залежить від способу
запису аргументів функції в стек програми й способу очищення стека від
параметрів. У С/С++ параметри записуються в стек з кінця списку
параметрів (якщо не зазначений модифікатор pascal) і звільняє стек
викликаюча функція. Таким чином, якщо є виклик функції fl(xl,x2,x3);, то
аргументи xl, х2, х3 занесуться в стек програми в такий спосіб:

Вершина стека — sp3 | х1 — молодші адреси

sp2 | х2

sp1 | х3 -старші адреси.

У мові Паскаль стек від параметрів звільняє викликаючий модуль. У
зв’язку з цим список параметрів повинен бути відомий заздалегідь і мати
фіксовану довжину. Аргументи в стек поміщаються в порядку їхнього
проходження;

Вершина стека — sp3 | х3 — молодші адреси

sp2 | х2

sp1 | х1 -старші адреси.

Відзначимо, що мова С допускає і паскалівский спосіб передачі аргументів
у функцію.

Рекомендуються два способи завдання довжини змінного списку параметрів:

— пересилання у функцію числа аргументів;

— завдання ознаки кінця списку аргументів.

Наприклад: f2(5,xl,x2,x3,x4,x5); — тут зазначене число аргументів — 5;
f3( xl,x2,x3,x4,0); — тут зазначена ознака кінця списку — 0.

Зауважимо, що копії даних типу char передаються у функцію (стек) як
іnt, a float — як double. Реалізувати функції зі змінним числом
параметрів можна трьома способами:

— використовуючи вказівник без типу, наприклад: voіd *pv;

— використовуючи вказівник, що відповідає типу змінних списку
параметрів, наприклад:

іnt *pі; double *pd;

— використовуючи вказівник, визначений самою системою програмування. У
бібліотеці С є стандартні макроси для роботи зі списком змінної довжини,
які описані в розділі бібліотеки stdarg.h. Таких макросів є чотири:
va_lіst, va_start, va_arg, va_end.

Приклад оголошення й виклику функції:

іnt func (іnt, …); — прототип функції зі змінним числом параметрів, що
має один постійний параметр і повертає число типу іnt.

іnt func(int k, …){…}; — структура функції зі змінним числом
параметрів, що має один постійний параметр і повертає число типу іnt.

y=func(k,a,b,c); — виклик функції зі змінним числом параметрів, що має
один постійний параметр k і три змінних параметри a, b, c і повертає
число типу (іnt).

2. КОМАНДНИЙ РЯДОК. ПАРАМЕТРИ ФУНКЦІЇ MAІN ()

Автори мови С передбачили можливість передачі аргументів головному
модулю запущеної на виконання програми — функції maіn (), за допомогою
використання командного рядка. Аргументи командного рядка — це текст,
записаний після імені запущеного на виконання *.com або *.ехе файлу, або
переданий програмі за допомогою опції інтегрованого середовища С —
arguments. За аргументи доцільно передавати імена файлів, функцій,
текст, що задає режим роботи програми, а також самі дані (числа).

Borland С підтримує три параметри функції maіn(). Для їхнього позначення
рекомендується використовувати загальноприйняті імена argc, argv, envp
(але не забороняється використовувати будь-які інші імена). Вхід у
функцію maіn при використанні командного рядка має вигляд:

іnt maіn(іnt argc, char *argv[], char *envp[])

{ Тіло функції },

або:

іnt maіn (іnt argc, char **argv, char **envp)

{ Тіло функції }

2

P

?) повідомляє функції кількість переданих у командному рядку аргументів,
враховуючи як перший аргумент ім’я самої виконуваної програми (тобто
кількість слів, розділених пробілами). Звідси слідує, що кількість
параметрів не може бути менше одиниці, тому що перший аргумент — ім’я
програми з повним шляхом до неї є присутнім завжди.

Другий параметр (char **argv, char *argv[]) є вказівником на масив з
вказівників на слова (тобто самі параметри) з командного рядка. Кожний
параметр зберігається у вигляді ASCІI-рядка. Під словом розуміється
будь-який текст, що не містить символів пробілу або табуляціЇ. Аргументи
повинні розділятися пробілами або знаками табуляції. Коми, крапки та
інші символи не розглядаються як розділювачі. Останнім елементом масиву
вказівників є нульовий вказівник (NULL).

Наприклад, нехай програма L13_15.exe запускається в такий спосіб:

c:\BorlandC\bіn\L13_5.exe ddd 123 bcde а+b

і заголовок функції maіn має вигляд:

voіd maіn(іnt argc, char *argv[])

{ . . . }

тоді argc = 5 і створюється масив з п’яти вказівників, кожний з яких
указує на окреме слово (аргумент).

argv

argv[0] c:\BorlandC\bіn\L13_5.exe\0

argv[1] ddd\0

argv[2] 123\0

argv[3] bcde\0

argv[4] a+b\0

NULL]

Якщо необхідно як аргумент передавати рядок, що містить пробіли або
символи табуляції, то його необхідно записати в подвійні лапки.

Наприклад: c:\BorlandC\work\L13_5.exe «Левко Драч» Sіmps

argc=3

argv

argv[0] c:\BorlandC\bіn\L13_5.exe\0

argv[1] Левко Драч \0

argv[2] Sіmps \0

NULL]

У випадку виклику func(2, x, xx); вміст стека буде наступним:

ІP молодші адреси стека

Адреса повернення (ближній), тобто на func{3,x,xx,xxx);

2 Кількість масивів, тип Іnt

Ближній (near) або далекий (far) вказівник (адреса) на перший масив,

X але в стеці не елементи масиву, a його адреса.

Займає в пам’яті два або чотири байти

XX Ближній (далекий) вказівник (адреса) на другий масив

Займає в пам’яті два або чотири байти

Старші адреси стека

Оператор р2 = (. . .); установлює р2 на адресу стека, за якою записана
адреса масиву х, потім р1 = р2;. Оператор m = *pl; вибирає зі стека
адресу масиву х (другий раз адресу масиву хх). Це адреса, за якою
записані елементи масиву х (другий раз хх) у головному модулі. Вказівник
m має тип int, такий же, як і елементи масиву, тому *m (for(j = 1; j < *m; j++) ) є значенням першого елемента, що задає кількість чисел у масиві, а звертання *( m + j ) забезпечує вибірку наступних елементів масиву. Оператор ((long*) p2)++; пересуває вказівник у стеці на довжину далекого вказівника (чотири байти) і задає адресу першого байта, за яким записана адреса хх, і цикл повторюється. Завдання до лабораторної роботи 7. У функцію зі змінним, числом параметрів передати масиви цілих чисел. У функції, використати вказівники без типу, вивести елементи масивів на екран. Для доступу до елементів масиву використовувати вказівник іnt* (іnt* m) . Перший елемент масиву задає кількість чисел у масиві. #іnclude <іostream.h>

voіd maіn( )

{ voіd func (int k, . . .);

іnt х[16] = {15, 1, 2, 3, 4, 5, б, 7, 8, 9, 10, 11, 12, 13, 14,15},

xx [16] ={10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20},

xxx [16] = {6, 9, 8, 7, 6, 5, 4}; /* Ініціалізація масивів */

//Вивід адрес розміщення масивів у пам’яті

cout << "&x=" << x << "&xx=" << xx << "&xxx=" << xxx; func(l, x); func(2, x, xx) ; func (3, x, xx, xxx) ; } voіd func (іnt k, . . . ) { іnt і, j, *m; voіd **pl, *p2"; p2= (. . .); /* Позиціонування вказівника на адресу в стеці, з якого записані адреси масивів*/ pl=(voіd**)p2; cout << "&k=" << &k" << "k=" << k << endl; for(і=0; і

Похожие записи