簡體   English   中英

如果條件為真,我如何返回結構;如果條件為假,我如何返回int

[英]How can I return a struct if a condition is true and an int if the condition is false

首先是一個簡單的例子

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 OR結構? 如果不是,我怎么能做一個escamotage來避免這個問題?

我以為我可以使用指針並返回一個指針BUT指針必須有一個類型。

您可以將其分為兩部分

  1. 讓函數返回一個int值,其中(通常),返回值0表示成功,其他負值表示不同類型的錯誤。

  2. 將指向結構變量的指針作為參數之一。 在成功條件的情況下,填充結構,並在調用者中,根據函數調用的返回值,可以訪問結構以檢索存儲在其成員中的值。

您不能擁有具有可變返回類型的函數。

處理這種情況的常見方法是:

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
  }

如果函數是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,"")

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 

實現這一目標有很多種可能性。 另見其他答案。

問題是:是否可以返回一個int OR結構?

沒有。

但是,有一種解決方法。 創建一個可以包含結構或int的聯合。 然后創建一個包裝結構,其中包含一個這樣的union和一個用於確定返回類型的變量。 你可以這樣做:

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;

沒有辦法從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
      }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM