There are several ways of doing this. (These examples show hypothetical polar-to-rectangular coordinate conversion functions, which must return both an x and a y coordinate.)

1. Pass pointers to several locations which the function can fill in:

#include <math.h>

polar_to_rectangular(double rho, double theta,

double *xp, double *yp)

{

*xp = rho * cos(theta);

*yp = rho * sin(theta);

}

…

double x, y;

polar_to_rectangular(1., 3.14, &x, &y);

2. Have the function return a structure containing the desired values:

struct xycoord { double x, y; };

struct xycoord

polar_to_rectangular(double rho, double theta)

{

struct xycoord ret;

ret.x = rho * cos(theta);

ret.y = rho * sin(theta);

return ret;

}

…

struct xycoord c = polar_to_rectangular(1., 3.14);

3. Use a hybrid: have the function accept a pointer to a structure, which it fills in:

polar_to_rectangular(double rho, double theta,

struct xycoord *cp)

{

cp->x = rho * cos(theta);

cp->y = rho * sin(theta);

}

…

struct xycoord c;

polar_to_rectangular(1., 3.14, &c);

(Another example of this technique is the Unix system call stat.)

4. In a pinch, you could theoretically use global variables (though this is rarely a good idea).