Студенту >> Язык программирования Си


Возврат значений из функций

Возврат результата работы функции в вызывающую программу в виде единственного значения можно осуществить с помощью оператора 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 после вызова функции будут изменены.

НАВЕРХ