Возврат значений из функций
Возврат результата работы функции в вызывающую программу в виде единственного значения можно осуществить с помощью оператора return. При этом результат возвратится как значение самой функции и должен иметь соответствующий тип.
Типы возвращаемых значений могут быть любыми, кроме массивов. Тип void означает, что функция не возвращает никакого значения. Тип void* означает, что функция возвращает указатель на произвольный тип данных.
Если необходимо изменить содержимое массива, его адрес нужно передать в функцию и обычным способом, с помощью операции индексации изменить нужные элементы массива. В следующем примере функция FillArray() заполняет массив указанным значением:
void FillArray(double A[], int nA, double val)
{
int i;
for (i=0; i<nA; i++) A[i] = val;
}
void main (void)
{
double B[100];
FillArray(B, 40, 35.4);
/* ... */
FillArray(&B[60], 20, 15.4);
/* ... */
}
Первый вызов FillArray() заполняет 40 первых элементов массива B значением 35.4, второй вызов заполняет 20 элементов массива B, начиная с элемента B[60], значением 15.4. При возврате из функции массив будет изменен, т. к. занесение значения val происходит непосредственно по нужному адресу.
Эту же функцию можно использовать для заполнения строк двумерного массива:
void main (void)
{
double a[10][20];
int n = sizeof(a) / sizeof(a[0]);
int m = sizeof(a[0]) / sizeof(a[0][0]);
int i;
/* ... */
for(i=0; i<n; i++ )
FillArray(a[i], m, 14.6);
/* ... */
}
В примере следует обратить внимание на соответствие типов передаваемых параметров и на способ вычисления числа строк и числа столбцов двумерного массива.
Возврат из функции нескольких значений, которые не являются элементами массива, можно организовать, используя указатели. В следующем примере функция Decart() осуществляет перевод пары полярных координат в декартовые:
void Decart(double *px, double *py, double r, double f)
{
(*px) = r * cos(f);
(*py) = r * sin(f);
}
При обращении к данной функции для параметров px и py нужно передавать адреса:
void main(void)
{
double x, y, r=5, f=0.5;
/* ... */
Decart( &x, &y, r, f );
/* ... */
}
В данном примере при вызове функции создаются локальные копии адресов переменных x и y, а внутри функции происходит обращение к переменным x и y через их адреса (как и в случае массивов), поэтому значения x и y после вызова функции будут изменены.
Дата добавления: 2014-12-18; просмотров: 1241;