C Как получить результат из функции и вывести в консоль

К примеру у меня есть подобная функция:

double* func(double** a, double* y, int n){
double* res = new double[n];
...
return res;
}

И её результат в main'е я могу получить следующим образом

double* res = new double[n];
res = func(a, y, n);
    printf("Result:\n");
for (int i = 0; i < n; i++) {
    printf("x[ %d ]= %lf\n", i, res[i]);
}

Но , к примеру, внутри функции я еще считаю кол-во итераций. Каким образом я могу их "извлечь" из неё, чтобы вывести результат в консоль?


Ответы (1 шт):

Автор решения: Harry

При

double* res = new double[n];
res = func(a, y, n);

вы получаете не только значение, но и утечку памяти... И потом, это никак не С! А в С++ есть и другие варианты, которых нет в С — например, передача аргумента по ссылке. С каким всё же языком вы работаете?

Договоримся сразу — возврат через глобальную переменную мы не рассматриваем.
Тогда вот вариант С с передачей указателя на переменную для хранения числа итераций.

double * func(double** a, double* y, int n, int * iter)
{
    double* res = new double[n];
    // ...

    if (iter) *iter = 125; // :)
    return res;
}


int main()
{
    ...
    int it;
    res = func(a,y,n,&it);    
    printf("Iterations - %d\n",it);
}

Если у вас С++ — то же самое можно сделать, передавая по ссылке:

double * func(double** a, double* y, int n, int& iter)
{
    double* res = new double[n];
    // ...

    iter = 125; // :)
    return res;
}


int main()
{
    ...
    int it;
    res = func(a,y,n,it);    
    printf("Iterations - %d\n",it);
}

Можно также вернуть структуру из пары значений. Например,

typedef struct ret_
{
    double * d;
    int iter;
} ret;


ret func(double** a, double* y, int n)
{
    double* res = 0;
    // ...

    ret R;
    R.d = res;
    R.iter = 125;
    return R;
}
→ Ссылка