Выходные параметры отличаются от возвращаемых значений.Возьмите этот пример в C:
/**
* \param[in] val Value calculations are based off.
* \param[out] variable Function output is written to this variable.
*
* \return Nothing
*/
void modify_value(int val, int *variable)
{
val *= 5;
int working = val % 44;
*variable = working;
}
Функция ничего не возвращает, но значение, на которое указывает variable
, изменяется, поэтому мы называем его выходным параметром.Он представляет собой «вывод» функции в том смысле, что мы ожидаем, что она будет каким-то образом изменена функцией.val
, с другой стороны, является параметром 'input', потому что он не изменен (и, действительно, не может быть изменен с точки зрения вызывающей функции, поскольку он передается как значение).
Вот немного более полезный и реалистичный пример:
typedef struct data {
int i;
int j;
...
} data;
/**
* \param[in] val Initialising parameter for data.
* \param[out] dat Data pointer where the new object should be stored.
*
* \return True if the object was created, false if not
* (i.e., we're out of memory)
*/
bool create_data(int val, data **dat)
{
data *newdata;
newdata = (data*)malloc(sizeof(data));
if(newdata == NULL)
{
*dat = NULL;
return false;
}
newdata->i = val;
*dat = newdata;
return true;
}
В этом случае мы создаем некоторый сложный объект внутри функции.Мы возвращаем простой флаг состояния, который позволяет пользователю узнать, что создание объекта прошло успешно.Но мы пропускаем вновь созданный объект, используя параметр out.
(Хотя, конечно, эта функция может просто возвращать указатель. Некоторые функции более сложные!)