如果条件为真,如何返回结构,如果条件为假,如何返回整数

时间:2019-05-27 11:48:51

标签: c struct return-type

首先是一个简单的例子:

typedef struct
{
    char article[DIM_STRING];
    double price;
    char buyer[DIM_STRING];
}Order;

Order algorithm(int a, int b){
    if(a == b) return -1;   //Error
    else return ord;    //Returns the Order ord
}

问题是:是否可以返回int或struct?如果没有,我该如何进行保管以避免问题发生?

我以为我可以使用指针并返回一个指针,但指针必须具有类型。

6 个答案:

答案 0 :(得分:2)

您可以将其分为两部分

  1. 让函数返回一个int值,其中(通常),一个返回值0表示成功,其他负值表示不同类型的错误。

  2. 将指向结构变量的指针作为参数之一。在成功的情况下,填充结构,然后在调用方中,根据函数调用的返回值,可以访问该结构以检索存储在其成员中的值。

答案 1 :(得分:1)

您不能使用具有可变返回类型的函数。

处理这种情况的常用方法是:

1)使用数字返回值进行错误信令,并通过传递的指针返回有效载荷

 int algorithm(Order *ret, int a, int b){
        if(a == b) return -1;   //Error
        else return *ret=ord, 0;    //Returns the Order ord
    }

2)或返回加标签的结构(以我的经验,这不太常见,但是如果有效载荷较小,它可以生成稍微更好的代码);标记为成功,其余结构可用,否则

 struct taggedOrder { Order order; _Bool is_ok; };
 struct taggedOrder algorithm(int a, int b){
    struct taggedOrder r = { ord, 1 };
    if(a == b) return r.is_ok=0, r;   //Error
    else return r;    //Returns the Order ord
  }

答案 2 :(得分:0)

如果函数的类型为Order,则无法返回int 但您可以这样做:

Order error_value;
error_value.article=""; error_value.price=-1.0; error_value.buyer="";

Order algorithm(int a,int b) {
    if (a==b) return error_value;
    else return ord;
}

,然后您可以检查返回值是否等于("",-1,"")

答案 3 :(得分:0)

C中不存在变量返回类型。

您可以这样做:

Order algorithm(int a, int b, int *ok) {
  if(a == b)
     *ok = 0;
  else
     *ok = 1;
   return ord;    //Returns the Order ord
}

或更简单:

Order algorithm(int a, int b, int *ok) {
  *ok = (a != b)
  return ord;    //Returns the Order ord
}

并这样称呼它:

int ok;
someorder = algorithm(v1, v2, &ok);
if (ok)
  ... handle OK case
else
  ... handle not OK case 

否则,如果可以,则可以返回指向订单的指针,如果不可以,则返回NULL

Order *algorithm(int a, int b) {
  if(a == b)
     return NULL;
  else
     return ⩝    //Returns the Order ord
}

并这样称呼它:

Order *someorder;
...
someorder = algorithm(v1, v2);
if (someorder != NULL)
  ... handle OK case
else
  ... handle not OK case 

有很多方法可以实现这一目标。另请参阅其他答案。

答案 4 :(得分:0)

  

问题是:是否可以返回int或结构?

否。

但是,有一种解决方法。创建一个可以包含您的结构或整数的联合。然后,创建一个包装器结构,其中包含一个此类联合和一个用于确定返回类型的变量。您可以这样:

struct myStruct {
   int a, b;
};

union myEnum {
    struct myStruct s;
    int i;
};

struct myContainer {
    union myEnum e;
    int retType;
};

struct myContainer myFunc() {
    struct myContainer ret;
    if(...) {
        ret.e.s.a = 42;
        ret.e.s.b = 99;
        ret.retType = 0;
    } else {
        ret.e.i = 55;
        ret.retType = 1;
    }
    return ret;
}

然后使用它像这样:

struct myContainer x = myFunc();
if(x.retType == 0) {
     struct myStruct w = x.e.s;
     // Do whatever you want to do if a struct is returned
} else if(x.retType == 1) {
     int w = x.e.i;
     // Do whatever you want to do if an int is returned
} else { /* Error */ }

您可以使用结构代替联合。唯一的缺点是它将占用更多的内存。

这是可以使用的通用解决方案。如果您认为代码混乱,可以改为在现有结构中添加两个字段:

typedef struct
{
    // Old fields
    char article[DIM_STRING];
    double price;
    char buyer[DIM_STRING];

    // The integer you want to return
    int integerValue;

    // Used to determine which fields to use
    int retType;
} Order;

答案 5 :(得分:0)

无法从C函数中获取变量返回类型。

一种选择是将struct修改为包括int,以指示struct是否有效。

typedef struct
{
    int valid;
    char article[DIM_STRING];
    double price;
    char buyer[DIM_STRING];
} Order;

Order algorithm(int a, int b)
{
    Order ord;
    ord.valid = -1;     //  assume an error has occurred
    if(a != b)
    {
        ord.valid = 0;
        // populate other members of ord
    }
    return ord;
}

例如,这需要呼叫者进行检查;

 Order result = algorithm(i, j);
 if (result.valid == 0)
 {
      // use members of result
 }
 else
    complain_bitterly();

另一种方法是在函数中添加第三个(指针)参数

 Order algorithm(int a, int b, int *valid)
 {
      Order ord;
      *valid = -1;
      if (a != b)
      {
          // populate members of ord
          *valid = 0;
      }
      return ord;
  }

  void caller()
  {
      int valid;
      Order result = algorithm(i,j, &valid);
      if (valid == 0)
      {
          // use members of result
      }
  }