Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

6.6.3. Не встановлення покажчиків

Така (некоректна) програма повинна прийняти рядок, введений з клавіатури, а потім відобразити ASCII-код для кожного символу цього рядка1. Проте ця програма містить серйозну помилку.

Код програми 6.13. Демонстрація розроблення некоректної програми

#include <iostream> // Для потокового введення-виведення

#include <cstdio> // Для підтримки системи введення-виведення

#include <cstring> // Для роботи з рядковими типами даних

using namespace std; // Використання стандартного простору імен

int main()

{

char sMas[80];

char *p1;

p1 = sMas;

do {

cout << "Введіть рядок: ";

gets(p1); // Зчитуємо рядок.

// Виводимо ASCII-значення кожного символу.

while(*p1) cout << (int) *p1++ " ";

cout << "\n";

} while(strcmp(sMas, "Кінець програми"));

getch(); return 0;

}

Чи зможете Ви самі знайти тут помилку?

У наведеному вище варіанті програми покажчику р1 присвоюється адреса масиву sMas тільки один раз. Це присвоєння виконується поза циклом. Під час входу в do-while-цикл (тобто при першій його ітерації) р1 дійсно вказує на перший символ масиву sMas. Але під час другого проходу того ж циклу р1 покажчик міститиме значення, яке залишиться після виконання попередньої ітерації циклу, оскільки покажчик р1 не встановлюється заново на початок масиву sMas. Рано чи пізно межу масиву sMas буде порушено.

Ось як виглядає коректний варіант тієї ж самої програми.

Код програми 6.14. Демонстрація розроблення коректної програми

#include <iostream> // Для потокового введення-виведення

#include <cstdio> // Для підтримки системи введення-виведення

#include <cstring> // Для роботи з рядковими типами даних

using namespace std; // Використання стандартного простору імен

int main()

{

char sMas[80];

char *p1;

do {

p1 = sMas; // Встановлюємо p1 при кожній ітерації циклу.

cout << "Введіть рядок: ";

gets(p1); // Зчитуємо рядок.

// Виводимо ASCII-значення кожного символу.

while(*p1) cout << (int) *p1++ " ";

cout << "\n";

} while(strcmp(sMas, "Кінець програми"));

getch(); return 0;

}

Отже, у цьому варіанті програми на початку кожної ітерації циклу покажчик р1 встановлюється на початок рядка.

Необхідно пам'ятати! Щоб використання покажчиків було безпечним, потрібно у будь-який момент знати, на що вони посилаються.

Розділ 7. Основи застосування С++-функцій

У цьому розділі поглиблено розглянуто функції – будівельні блоки мови програмування C++, а тому без повного їх розуміння неможливо стати успішним С++-програмістом. Ми вже торкнулися теми, яка стосується С++-функцій (див. розд. 2.3), і використали їх майже у кожному прикладі коду програми. У цьому розділі вони будуть розглядатися детальніше. Ця тема містить такі питання, як перегляд правил дії областей видимості функцій, рекурсивних функцій, деяких спеціальних властивостей функції main(), настанови return і прототипів функцій.

7.1. Правила дії областей видимості функцій

Правила дії областей видимості будь-якої мови програмування – це правила, які дають змогу керувати доступом до об'єкта з різних частин програми. Іншими словами, правила дії областей видимості визначають, який програмний код має доступ до тієї або іншої змінної. Ці правила також визначають тривалість "життя" змінної. Як ми вже зазначали вище, існує три види змінних: локальні змінні, формальні параметри і глобальні змінні. Цього разу ми розглянемо правила дії областей видимості з огляду на використання функцій.

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