Другие языки программирования и технологии

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

Macnun Imranov
Macnun Imranov
347
проще добавить структурку. . .и ею оперировать. . .например:

<...>

struct res {
int k1;
int k2;
int k3;
};

res* f_opr(int x[], int n) {
res* temp = new res; //создаем структуру и временный указатель на нее. . .
for (int i = 0; i < n; i++)
if (x[i] > 0) temp->k1++;
else if (x[i] < 0) temp->k2++;
else temp->k3++;
return (temp); // возвращаем указатель
}

int _tmain(int argc, _TCHAR* argv[]) {
res *myres; //создаем указатель на структурку

<...>

myres = f_opr(arr,n); // где arr - массив, n - размер массива
std::cout << myres->k1 << '\n';
std::cout << myres->k2 << '\n';
std::cout << myres->k3 << '\n';

<...>

delete [] myres; // удаляем структуру. . .
return 0;
}

ну и как вы наверное поняли структура может состоять из чего угодно.... и целочисленные переменные. . .и вещественные. . .и текст. . .и любые их комбинации.

замечания:

1) зачем setlocate во второстепенной функции? перенесите в главную. . .в начало. . .

2) for (i = 0; i <= n;i++) - почему "i<=n" ? нумерация идет от нуля, а не с единицы. . .таким условием вы проверяете еще 1 значение в памяти, которое не находится в массиве. . .

скажем у вас массив из 5 элементов. . .а вы проверяете
0 - первый
1 - второй
...
5 - шестой
Дима Пидорич
Дима Пидорич
3 147
Лучший ответ
если нужно вернуть несколько значений, создайие структуру в функции, заполните ее нужными значениями и вените указатель на эту структуру.

ну в конкретно вашем случае можно исхитриться и вернуть все в одном int,

например если нужно установить k1 то создаем некую переменную result, обнулим ее и прибавим к ней 1, если надо вернуть k2, то прибавим к ней 10, если надо вернуть k3, то прибавим к ней 100, таким образом у нас получатся как бы флаги, ну только не бинарные, а десятичные.

теперь после возвращения из функции мы можем однозначно сказать, какие переменные в функциии были установлены, а какие нет.

если итераций в цикле не более 9, если больше, то надо будет соответственно другие значения выбрать, чтобы не перекрывались, например 1, 100, 1000.

тогда потом можно однозначно сказать, сколько раз мы добавили 1, сколько 100 и сколько 1000.

то есть фактически надо придумать новую систему счисления, в которой разряд не превосходит количество итераций - 1, если кол-во итераций равно разрядности, то мы уже не сможем однозначно сказать, прибавили мы 100 раз единицу или 1 раз 100
Добавить несколько параметров и потом в функции им присваивать значения.
Егоров Михаил
Егоров Михаил
2 417
void f_opr(int x[], int k[])
{setlocale(0, "Rus");

int i;

int k1=0, k2=0, k3=0;

for (i = 0; i <= n;i++)if (x[i] > 0)

k1++;

else
if (x[i] < 0) k2++;

else k3++;

k[0] = k1;

k[1] = k2;

k[2] = k3;
}

и ничего возвращать не надо. просто в программе создай еще один массив с тремя элементами . а потом просто массивом пользуйся.

Похожие вопросы