为了账号安全,请及时绑定邮箱和手机立即绑定

从函数返回多个值

从函数返回多个值

C
蓝山帝景 2019-07-20 14:46:29
从函数返回多个值有人能告诉我如何从函数返回多个值吗?请举例说明一下?
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

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

/* 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;}


查看完整回答
反对 回复 2019-07-20
?
守着一只汪

TA贡献1872条经验 获得超3个赞

你不能直接这么做。您的选项是将多个值包装到一个结构中,或者将它们作为指针参数传递给函数。

G.

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;}

或:

void my_func(int *p_a, float *p_b){
    *p_a = 1;
    *p_b = 2.0f;}


查看完整回答
反对 回复 2019-07-20
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

首先,后退一步,询问为什么需要返回多个值。如果这些值在某种程度上不相关(无论是功能上的还是操作上的),那么您需要停止并重新考虑您正在做的事情。

如果各种数据项是较大的复合数据类型的一部分(例如邮件地址,或销售订单中的行项,或由多个属性描述的其他类型),则定义一个struct类型来表示单值这种综合类型:

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) {...}

定义一个结构来收集与彼此无关的随机项;这只会给您和任何需要维护代码的人带来混乱。

如果数据项在功能上不相关,而是以某种方式操作上相关(例如,数据加上状态标志加上关于操作或项的元数据,作为单个输入操作的一部分),然后使用多个可写参数。最明显的例子是*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);

您可以将这些方法结合在一起;下面是一个受我目前正在做的工作启发的示例:

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 boundaryStatus stat = getElevationsFor(b, &elevs, &meta);

我请求提升数据的服务返回值的一维序列;数组的维度作为元数据的一部分返回。


查看完整回答
反对 回复 2019-07-20
  • 3 回答
  • 0 关注
  • 438 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信