从函数返回多个值

Shw*_*eta 17 c

谁能告诉我如何从函数中返回多个值?
请详细说明一些例子?

unp*_*680 20

您在这里的选择是返回一个包含您喜欢的元素的结构,或者使用函数来处理带有指针的参数.

/* method 1 */
struct Bar{
    int x;
    int y;
};

struct Bar funct();
struct Bar funct(){
    struct Bar result;
    result.x = 1;
    result.y = 2;
    return result;
}

/* method 2 */
void funct2(int *x, int *y);
void funct2(int *x, int *y){
    /* dereferencing and setting */
    *x  = 1;
    *y  = 2;
}

int main(int argc, char* argv[]) {
    struct Bar dunno = funct();
    int x,y;
    funct2(&x, &y);

    // dunno.x == x
    // dunno.y == y
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 在函数定义之前直接放置原型没有多大意义...... (5认同)

Oli*_*rth 18

你不能直接这样做.您可以选择将多个值包装到结构中,或者将它们作为指针参数传递给函数.

例如

typedef struct blah
{
    int a;
    float b;
} blah_t;


blah_t my_func()
{
    blah_t blah;
    blah.a = 1;
    blah.b = 2.0f;
    return blah;
}
Run Code Online (Sandbox Code Playgroud)

要么:

void my_func(int *p_a, float *p_b)
{
    *p_a = 1;
    *p_b = 2.0f;
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ode 7

首先,退后一步,询问为什么需要返回多个值.如果这些值彼此不相关(无论是在功能上还是在操作上),那么您需要停下来并重新思考您正在做的事情.

如果各种数据项是较大的复合数据类型(例如邮寄地址,销售订单中的行项目或多个属性描述的某种其他类型)的一部分,则定义结构类型以表示单个值该复合类型:

struct addr { // struct type to represent mailing address
  char *name;
  int streetNumber;
  char *streetName;
  char *unitNumber; 
  char *city;
  char state[3];
  int ZIP;
};

struct addr getAddressFor(char *name) {...}

struct point2D {
  int x;
  int y;
};

struct polygon2D {
  size_t numPoints;
  struct point2D *points;
};

struct point2D getOrigin(struct polygon2D poly) {...}
Run Code Online (Sandbox Code Playgroud)

千万不能定义一个结构来收集未以某种方式相互关联的随机物品; 这只会给你和任何必须维护你的代码的人造成混乱.

如果数据项在功能上不相关,但在某种程度上与操作相关(例如,数据加上状态标志加上关于操作的元数据或作为单个输入操作的一部分的项目),则使用多个可写参数.最明显的例子是*scanf()标准库中的函数.还有strtod()strtol()函数,它们转换数字的字符串表示形式; 它们返回转换后的值,但它们也会写入未转换为单独参数的第一个字符:

char *str = "3.14159";
double value;
char *chk;

value = strtod(str, &chk);
if (!isspace(*chk) && *chk != 0)
  printf("Non-numeric character found in %s\n", str);
Run Code Online (Sandbox Code Playgroud)

你可以结合这些方法; 这是一个受我正在做的一些工作启发的例子:

typedef enum {SUCCESS, REQ_GARBLED, NO_DATA_OF_TYPE, EMPTY, ERROR} Status;

typedef struct bounds {...} Bounds; 

tyepdef struct metadata {
  size_t bytesRead;
  size_t elementsRead;
  size_t rows;
  size_t cols;
} Metadata;

typedef struct elevations {
  size_t numValues;
  short *elevations;
} Elevations;

Elevations elevs;
Metadata meta;
Bounds b = ...; // set up search boundary

Status stat = getElevationsFor(b, &elevs, &meta);
Run Code Online (Sandbox Code Playgroud)

我请求高程数据的服务返回一维值序列; 数组的维度作为元数据的一部分返回.


Mic*_*kis 5

你可以使用结构来做到这一点:

#include <stdio.h>

struct dont { int x; double y; };

struct dont fred(void)
{
        struct dont b;
        b.x = 1;
        b.y = 91.99919;
        return b;
}

int main(int argc, char **argv)
{
        struct dont look = fred();
        printf("look.x = %d, look.y = %lf\n", look.x, look.y);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)