首先是一个简单的例子:
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?如果没有,我该如何进行保管以避免问题发生?
我以为我可以使用指针并返回一个指针,但指针必须具有类型。
答案 0 :(得分:2)
您可以将其分为两部分
让函数返回一个int
值,其中(通常),一个返回值0
表示成功,其他负值表示不同类型的错误。
将指向结构变量的指针作为参数之一。在成功的情况下,填充结构,然后在调用方中,根据函数调用的返回值,可以访问该结构以检索存储在其成员中的值。
答案 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
}
}