[英]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.