返回对C中的函数值

时间:2014-11-18 09:26:34

标签: c

我正在解决C中的问题,但是我很难连接部分脚本。

我按如下方式定义了一个类型对:

typedef struct pair {
    double x, y;
} pair;

现在,我想将函数中的值作为对返回,但我不明白该怎么做。

pair predcorr(double t, double x, double y, double h) { 

    double Newx = x + 1.0/2.0 * h * (dxdt(t, x, y) + dxdt(t+h, x+(h*dxdt(t, x, y)), y+(h*dxdt(t, x, y))));
    double Newy = y + 1.0/2.0 * h * (dydt(t, x, y) + dydt(t+h, x+(h*dydt(t, x, y)), y+(h*dydt(t, x, y))));
    return ????,

如何起作用,是否有可能向我提供一些解释?

4 个答案:

答案 0 :(得分:3)

该函数的返回类型为pair。因此,您必须返回pair类型的内容 - 这应该已经提示您应该做什么。您必须创建此类型的变量,用值(Newx和Newy)填充它并返回它。它的工作方式与想要返回整数的方式相同:创建,填充,返回它。

答案 1 :(得分:0)

pair result;
result.x = ...;
result.y = ...;
return result;

答案 2 :(得分:0)

C中,return只能返回一个变量。要返回多个值[变量],您需要

  1. 将变量作为参考传递。
  2. 使用结构来保存返回值所需的所有变量。
  3. 使用第二种方法,你可以使用像..

    这样的东西

    在来电者中:

    typedef struct pair {
    double a, b;
    } pair;
    pair pr;
    pr  = predcorr(m, n, o, p);
    

    功能

    pair predcorr(double t, double x, double y, double h) 
    { 
        pair result;
    
        result.a  = x + 1.0/2.0 * h * (dxdt(t, x, y) + dxdt(t+h, x+(h*dxdt(t, x, y)), y+(h*dxdt(t, x, y))));
        result.b  = y + 1.0/2.0 * h * (dydt(t, x, y) + dydt(t+h, x+(h*dydt(t, x, y)), y+(h*dydt(t, x, y))));
    
        return result;
    }
    

    请注意为该函数指定的return 类型。因此,您显然应该返回pair类型的变量。功能

答案 3 :(得分:0)

解释传递和返回结构值的最简单方法是使用示例。将complex data structures传递给functions时,struc t通常为passed and returned a pointer。这还要求您的函数原型返回与您想要返回的类型一致。 (这也可以被声明为void函数,因为在执行函数本身期间填充了pair的值。)

注意:将对作为指针传递,结构address传递给predcorr。因此,如果您声明pair的静态实例,则需要在其前面加上运算符的&地址。

以下是一个简短的示例,其中包含了一些功能,可以向您展示如何使用代码:

#include <stdio.h>

typedef struct pair {
    double x, y;
} pair;

double dxdt (double a, double b, double c)   /* totally made up functions */
{  return a*a + 2 * a * b + c * c;  }

double dydt (double a, double b, double c) 
{  return 2*a*a - 4 * a * b - 2 * c * c; }

/* function accepts and returns a pointer to struct pair */
pair *predcorr (pair *ptr, double t, double x, double y, double h) { 

    double Newx = x + 1.0/2.0 * h * (dxdt(t, x, y) + dxdt(t+h, x+(h*dxdt(t, x, y)), y+(h*dxdt(t, x, y))));
    double Newy = y + 1.0/2.0 * h * (dydt(t, x, y) + dydt(t+h, x+(h*dydt(t, x, y)), y+(h*dydt(t, x, y))));

    ptr-> x = Newx;
    ptr-> y = Newy;

    return ptr;
}

int main () {

    double t = 5;           /* made up initial example values   */
    double x = 2;
    double y = 7;
    double h = 3;

    pair mypair = {0,0};    /* declare instance of struct pair  */


    predcorr (&mypair, t, x, y, h); /* call predcorr pass ptr   */

    /* print the values as returned in mypair */
    printf ("\nThe Newx/Newy values are:\n\n");
    printf ("  Newx : %lf\n  Newy : %lf\n\n", mypair.x, mypair.y);

    return 0;
}

(已组成)值的输出:

$./bin/dxyt

The Newx/Newy values are:

  Newx : 132336.500000
  Newy : -185504.000000

您的另一个选择是每次调用dynamically allocatestruct pair的{​​{1}}新存储空间。您不必传递指向该函数的指针,只需predcorr函数调用返回assign函数中struct pair的指针即可。唯一的附加要求是您现在负责释放与返回相关的数据,以防止代码中的内存泄漏。这并不难,但只需要多一点努力就可以在这种状态下迷惑。仔细看看,如果您有任何问题,请告诉我。