Если у меня есть функция, которая приводит к результату int
и результат string
, как я возвращаю их обоих из функции?
Насколько я могу сказать, что могу только возвратить одну вещь, как определено типом, предшествующим имени функции.
Я не знаю, что представляет собой ваша строка
, но я собираюсь предположить, что она управляет своей собственной памятью.
У вас есть два решения:
1: Вернуть struct
, который содержит все типы, которые вам нужны.
struct Tuple {
int a;
string b;
};
struct Tuple getPair() {
Tuple r = { 1, getString() };
return r;
}
void foo() {
struct Tuple t = getPair();
}
2: Использовать указатели для передачи значений.
void getPair(int* a, string* b) {
// Check that these are not pointing to NULL
assert(a);
assert(b);
*a = 1;
*b = getString();
}
void foo() {
int a, b;
getPair(&a, &b);
}
Какой из них вы выберете, зависит в основном от личных предпочтений - какая семантика вам больше нравится.
Вариант 1
: объявить структуру с целым числом и строкой и вернуть переменную структуры.
struct foo {
int bar1;
char bar2[MAX];
};
struct foo fun() {
struct foo fooObj;
...
return fooObj;
}
Вариант 2
: вы можете передать один из двух параметров через указатель и внести изменения в фактический параметр через указатель и вернуть другой как обычно:
int fun(char **param) {
int bar;
...
strcpy(*param,"....");
return bar;
}
или
char* fun(int *param) {
char *str = /* malloc suitably.*/
...
strcpy(str,"....");
*param = /* some value */
return str;
}
Вариант 3
: аналогично вариант 2. Вы можете передать как указатель, так и ничего не вернуть из функции:
void fun(char **param1,int *param2) {
strcpy(*param1,"....");
*param2 = /* some calculated value */
}
Поскольку один из ваших типов результатов является строкой (и вы используете C, а не C ++), я рекомендую передавать указатели в качестве выходных параметров. Используйте:
void foo(int *a, char *s, int size);
и назовите его следующим образом:
int a;
char *s = (char *)malloc(100); /* I never know how much to allocate :) */
foo(&a, s, 100);
В общем, предпочтительнее выполнять распределение в вызывающей функции , а не внутри самой функции, чтобы вы могли быть максимально открыты для различных стратегии распределения.
Путем передачи параметров по ссылке в функцию.
Примеры:
void incInt(int *y)
{
(*y)++; // Increase the value of 'x', in main, by one.
}
Также с использованием глобальных переменных, но это не рекомендуется.
Пример:
int a=0;
void main(void)
{
//Anything you want to code.
}
Два разных подхода:
Я думаю, что вариант #1 немного более очевиден, хотя он может стать утомительным, если у вас слишком много возвращаемых значений. В этом случае вариант #2 работает достаточно хорошо, хотя создание специализированных структур для этой цели требует некоторых умственных затрат.
Создать структуру и установить два значения внутри и вернуть структурную переменную.
struct result {
int a;
char *string;
}
Вы должны выделить место для char *
в своей программе.
Используйте указатели в качестве параметров функции. Затем используйте их для возврата нескольких значений.