Функції зі змінним числом параметрів.Командна стрічка, параметри функції 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) { Тіло функції } Перший параметр (argc) повідомляє функції кількість переданих у командному рядку аргументів, враховуючи як перший аргумент ім'я самої виконуваної програми (тобто кількість слів, розділених пробілами). Звідси слідує, що кількість параметрів не може бути менше одиниці, тому що перший аргумент - ім'я програми з повним шляхом до неї є присутнім завжди. Другий параметр (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 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; і{ m=* (іnt**)pl; /* Вибираємо зі стека адреса розміщення чергового масиву. */ cout <<” *m===" << *m << endl; // *m - кількість елементів у масиві for (j = 1; j < *m; j ++) cout << * (m+j) << endl; ( (іnt*)p2)++; /* ( (long*) p2)++ для far-вказівників */ p1 = (voіd**) p2; } }
Рефераты по информатике1. ФУНКЦІЇ ЗІ ЗМІННИМ ЧИСЛОМ ПАРАМЕТРІВ У С/C++ поряд з використанням функцій з фіксованим числом параметрів можна використовувати функції зі змінним
Оценок: 414 (Средняя 5 из 5)
Специалисты RetsCorp работают в digital-сфере более 7 лет. За это время мы разработали более 500+ успешных проектов. Основываясь на своем опыте и знании рынка, мы с уверенностью можем сказать, что будет работать, а что — нет. Заказывая создание лендинга для бизнеса в нашей студии, вы получаете работающие решения, необходимые именно вашему бизнесу.
Сотрудничая с нами, вы будете не клиентом, а нашим партнером. Благодаря этому мы будем развивать ваш бизнес как собственный. Мы так же как и вы заинтересованы в успехе проекта, поскольку ваша успешность будет нашей рекламой.