[英]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指針必須有一個類型。
您可以將其分為兩部分
讓函數返回一個int
值,其中(通常),返回值0
表示成功,其他負值表示不同類型的錯誤。
將指向結構變量的指針作為參數之一。 在成功條件的情況下,填充結構,並在調用者中,根據函數調用的返回值,可以訪問結構以檢索存儲在其成員中的值。
您不能擁有具有可變返回類型的函數。
處理這種情況的常見方法是:
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.