- •Фрагмент, запрашивающий у пользователя 10 целых чисел,
- •Доступ к элементам многомерного массива в
- •Типичные ошибки программирования
- •скалярные производные типы, в том числе:
- •Признак переменной-указателя для компилятора -
- •Указатели при их описании могут, как и обычные
- •Оператор присваивания
- •Существуют ограничения и на использование
- •Сам указатель-переменная тоже имеет адрес.
- •во всех случаях использования указателя,
- •Для указателей-переменных разрешены следующие
- •Использование механизма указателей - один из
- •Использование указателей дает несколько более
- •Элементы массива - любой тип, в том числе и
- •Преимущества использования массивов - появляется
- •Структурирование обработки данных: Составной
- •Каждая инициализация auto или register переменных
- •Макросы – символическое имя некоторых операций,
- •Функции - программные блоки, которые могут
- •Определение переменной в дополнении к ее имени и
- •Перед использованием функцию надо определить, задав
- •Список параметров, заключаемый в скобки, в
- •имя_функции(список_фактических_параметров)
- •вызов. . . ф-и
- •Уже знаете, что существуют функции, не требующие для
- •Как правило (хотя формально не обязательно), кроме
- •Передача в функцию параметров
- •По адресу, когда в функцию передается не
- •void Unit(int*,int); /*Прототип функции Unit()*/
- •В примере - в функцию передаются данные – адрес и
- •По ссылке, когда в функцию также передается
- •Сравнение методов передачи в функцию параметра по адресу и по ссылке
- •Типичные ошибки программирования
- •Типичные ошибки программирования
- •Параметры со значениями по умолчанию
Передача в функцию параметров
В языке C++ предусмотрены три способа передачи параметров в вызываемую функцию:
по значению, когда в функцию передается числовое значение параметра. Число передаваемых в функцию параметров ничем не ограничено, хотя практически их редко бывает больше 5 – 10. Если функция должна работать с элементами массива, их придется передавать в функцию по отдельности:
int array[200]; result=Sum(array[0],array[1]….);
неудобно, слишком много параметров!!!
По адресу, когда в функцию передается не
значение параметра, а его адрес, что особенно удобно для передачи в качестве параметров массивов и структур. Передать в функцию можно адрес любой переменной – скалярной, массивной или структурной. Функция не может модифицировать сам передаваемый параметр – адрес, но, обращаясь по этому адресу, она может модифицировать переменную, находящуюся в вызывающей программеснимается ограничение на возврат в вызывающую процедуру единственного результата работы функции.
При передаче адресов нескольких скалярных переменных функция может изменить значение всех этих переменных, сколько бы их ни было; при передаче адреса массива или структуры функция может "дотянуться" до всех элементов этих объектов.
void Unit(int*,int); /*Прототип функции Unit()*/
/*Определение функции Unit()*/
void Unit(int* data, int size) //Заголовок функции
{
for(int i=0;i<size;i++) //Для 1000 элементов массива
if(data[i]==0) //Если данный элемент равен 0 data[i]=1; //Приравнять его 1
}
/*Фрагмент программы с вызовом функции Unit()*/ int array[1000];//Массив с данными Unit(array,1000);//Вызов функции
В прототипе и определении функции Unit() объявлено 2 параметра. При вызове функции Unit() через ее I параметр типа int* передается имя массива array (имя массива рассматривается как его адрес); через II параметр типа int передается размер массива. Внутри функции Unit() адрес внешнего массива поступает в локальную переменную data, а размер массива – в ло-кальную переменную size. С
В примере - в функцию передаются данные – адрес и
размер массива. С помощью этого адреса функция обращается к самому массиву, который находится вне функции, и может выполнять любые операции над всеми его элементами, используя их индексы.
!!!! Часто так бывает: выход за границу массива, если забыть про int size в ф-и !!!!!
Передача параметра по адресу - не только для массивов, можно - и для скалярных данных, если ф-я предназначена не для выполнения каких-то вычислений на основе передаваемых ей параметров, а должна изменять значения самих этих параметров.
Скалярные переменные - можно передать в функцию и по значению, и по адресу,
Массив - только по адресу, т.к. имя массива в C++ отождествляется с адресом первого элемента этого массива и передача в качестве параметра имени массива автоматически приводит к передаче его
адреса.
По ссылке, когда в функцию также передается
адрес параметра, однако действуют особые (и весьма удобные) правила использования этого адреса в вызываемой функции:
1)при передаче по ссылке, обращение к переданному аргументу внутри функции осуществляется не с помощью операции разыменования, а непосредственно; 2)при вызове функции в качестве ее параметра
указывается не адрес передаваемой переменной, а сама переменная. Другими словами, и при вызове функции, и в ней самой мы как бы работаем с самой переменной из вызывающей процедуры, забыв о том, что в действительности параметром является ее адрес.
Фактически - та же передача адреса параметра, но специфическим образом
Сравнение методов передачи в функцию параметра по адресу и по ссылке
Типичные ошибки программирования
1.В заголовке определения или в прототипе функции в списке аргументов вместо «,» используется «;» (int a; int b). Эта ошибка сопровождается сообщением «Error: Expression syntax».
2.Однотипные аргументы функции ошибочно определяются как (float x,y) вместо (float x, float y). Компилятор ответит на это сообщением «Error: type name expected».
3.Первая строка определения функции ошибочно завершается символом точки с запятой. Это приведет к сообщению «Error: Declaration terminated incorrectly».
4.Один или несколько аргументов функции повторно объявляются как локальные переменные. Компилятор распознает эту логическую ошибку и ответит на нее сообщением «Error: multiple declaration…».
Типичные ошибки программирования
5. Отсутствует оператор return в функции, которая должна возвращать значение. На этапе компиляции это не будет воспринято как синтаксическая ошибка, однако будет выведено предупреждение «Warning: function should return a value». В проти-воположной ситуации, при попытке возвратить результат из функции, объявленной как void, компилятор выдаст сообщение об ошибке «Error: function cannot return a value».
6.Определение одной функции внутри другой. Такая ошибка приведет к сообщению «Error: Declaration syntax error».
7.Попытка вызова функции, которая не описана ранее, и для которой не найден соответствующий прототип. Сообщение компилятора – «Error: call to undefined function».
Параметры со значениями по умолчанию
Обычно при вызове функции - передается конкретное значение каждого параметра.
НО: можно указать, что параметр является параметром по умолчанию, и приписать этому параметру значение по умолчанию.
В заголовке функции после имени параметра символа “=“, а дальше - значение по умолчанию.
Последними в списке параметров со значениями по умолчанию надо указывать те параметры,
значения которых в реальных задачах чаще всего остаются равными заданным по умолчанию.
Ф-я, которая рассчитывает суммарную силу, действующую на тело объемом V с плотностью Р, погруженное в жидкость с плотностью РН2О:
FF(double V=1.0, double P=0.5, double PH20 = 1.0, double G = 9.81);
Если при вызове функции параметр по умолчанию не указан, то в функцию автоматически передается его
F=FF() - значение F будет равно силе при значениях
всех параметров по умолчанию.
F=FF(2) - сила, действующую на тело V= 2 м3 при значениях остальных параметров по умолчанию.
F= FF(2,2.6) - на алюминиевое ( = 2,6 г/см3) тело
V= 2 м3 (остальные параметры - по умолчанию). Задав все четыре параметра, можно определить силу, действующую на тело при эксперименте, проводящемся на другой планете (при этом изменится ускорение свободного падения).
Пропускать при вызове можно только некоторое число последних параметров в списке.
!!! ОШИБКА: F=(2, , 1.2) – отслеживается компилятором.
Параметры по умолчанию должны быть указаны при первом упоминании имени функции - обычно в прототипе. Значения по умолчанию могут быть константами, глобальными переменными или
