Home > OS >  c return two arrays from the function
c return two arrays from the function

Time:11-20

I find a solution to the equation using the bisection method.

And I need to find the value of a and b on some iterations. Therefore, I made two arrays for these points, respectively.

in order to "pull out" the number of iterations from the function, I had no problems. They are displayed on the screen. But how do I "pull out" these two arrays?Please tell me how to do it. Thank you in advance!

enter image description here

double f1(double x){
    return x*x-5*sin(x);
}
double f2(double x){
    return exp(x)-pow(10,x);
}
double f3(double x){
    return sin(x)-x 0.15;
}
double f4(double x){
    return x-pow(9 x,0.5) x*x-4;
}
double dihotom (double a , double b , double e , double(*fp)(double),int &iter,double &points_a[],double &points_b[]){
    double c , fc , fa = fp(a);
    iter=(log10((b-a)/e))/log10(2);
    int step = iter/3;
    int step_current = step;
    int it=0;
    int k=0;
    do{
        c=(a b)/2;
        fc=fp(c);
        if (fa*fc<=0) b = c ; else a = c;
        it  ;
        if(it==step_current){
            points_a[k]=a;
            points_b[k]=b;
            k  ;
            step_current=step_current step;
        }
        fa=fp(a);
        printf ("it %d: a = %lf,b = %lf\n",iter,a,b);
    }while (fabs(a-b)>=e);
    return c;
}

int main(int argc, char *argv[]) {

    int int_s=0;
    double points_a[3];
    double points_b[3];

    double k3= dihotom (0.5,1,0.0001,f3,int_s,points_a[3],points_b[3]);
    printf("For F3 - root = %lf, F3(%.2lf)=%lf ;iter =%d\n", k3, k3 ,f3(k3),int_s);
    int i=0;
    for(i=0;i<3;i  ){
        printf("step : %d , a: %lf, b: %lf ", i,points_a[i],points_b[i]);
    }

    return 0;
}

CodePudding user response:

In your case, you should take the arrays by reference:

double dihotom(double a, double b, double e, double (*fp)(double), int &iter,
               double (&points_a)[3], double (&points_b)[3]) {
//             ^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^

You could also let the arrays decay into pointers:

double dihotom(double a, double b, double e, double (*fp)(double), int &iter,
               double points_a[], double points_b[]) {

or

double dihotom(double a, double b, double e, double (*fp)(double), int &iter,
               double* points_a, double* points_b) {

But by taking them by reference, you make sure that you only accept arrays of the correct size.

In either case, the call to the function will simply be:

double k3 = dihotom(0.5, 1, 0.0001, f3, int_s, points_a, points_b);

Demo

CodePudding user response:

If you want to return two arrays from a function then make a struct with two vectors. Something like this. The way you are doing it is harder to maintain, who will allocate the arrays and delete them for example?

// todo for you : create better names then points_a and points_b
struct my_result_t
{
    std::vector<double> points_a;
    std::vector<double> points_b;
};

my_result_t function();
{
    my_result_t result;
    result.points_a.push_back(1.0);
    result.points_b.push_back(2.0);
    return result;
}

int main()
{
    auto result = function();
    std::cout << result.points_a[0];
}
  • Related