Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从双重函数返回void?_C_Function_Return_Void - Fatal编程技术网

C 从双重函数返回void?

C 从双重函数返回void?,c,function,return,void,C,Function,Return,Void,我有一个双精度函数,通常返回变量的新值,但有时我不想更改变量,我想通过返回一个特殊值来表示,例如void。可能吗 例如: double GetNewValue(int feature) { switch( feature ) { case TYPE1: return void; // or maybe use return; here? case TYPE2: return 2.343; de

我有一个双精度函数,通常返回变量的新值,但有时我不想更改变量,我想通过返回一个特殊值来表示,例如void。可能吗

例如:

double GetNewValue(int feature) {
    switch( feature ) {
        case TYPE1:
            return void; // or maybe use return; here?
        case TYPE2:
            return 2.343;
        default:
            return featureDefaultValue;
    }
}
PS:我知道我可以使用NaN,但我已经使用它作为一个有效值,另一个意思是还没有可用的数字


/编辑:谢谢大家的回答,这三个答案都适用于我的问题,并且都同样有效。我现在很难选择我要用哪一个,哪一个是我要接受的,但我希望我能全部接受

一种方法是将结果变量作为指针传递:

void AssignNewValue(int feature, double* result)
{
    switch( feature ) {
    case TYPE1:
        return;
    case TYPE2:
        *result = 2.343;
        break;
    default:
        *result = featureDefaultValue;
        break;
    }
}
用法如下:

double featureValue = 42.0;

/* ... */

AssignNewValue(feature, &featureValue);

一种方法是将结果变量作为指针传递:

void AssignNewValue(int feature, double* result)
{
    switch( feature ) {
    case TYPE1:
        return;
    case TYPE2:
        *result = 2.343;
        break;
    default:
        *result = featureDefaultValue;
        break;
    }
}
用法如下:

double featureValue = 42.0;

/* ... */

AssignNewValue(feature, &featureValue);

在这种情况下,您需要从函数返回两个内容,而不是一个。执行此操作的常用方法是使用指向返回值的指针,并返回yes/no标志,以指示实际double的有效性:

现在不要这样做

double res = GetNewValue(myFeature);
函数的用户需要执行以下操作:

double res;
if (GetNewValue(&res, myFeature)) {
    // use res here - it's valid
} else {
    // do not use res here - it's not been set
}

在这种情况下,您需要从函数返回两个内容,而不是一个。执行此操作的常用方法是使用指向返回值的指针,并返回yes/no标志,以指示实际double的有效性:

现在不要这样做

double res = GetNewValue(myFeature);
函数的用户需要执行以下操作:

double res;
if (GetNewValue(&res, myFeature)) {
    // use res here - it's valid
} else {
    // do not use res here - it's not been set
}

听起来您需要一个可选的返回参数。您似乎不想正确地使用0.0作为无值结果,因为这意味着0.0不能用于实际值

您有时会看到两种很好的解决方案,一种是使用结果代码,另一种是使用指针作为返回结果。指针更复杂。我先从1开始:

1.结果代码 2.使用指针 指针的问题是你需要记住删除结果


听起来您需要一个可选的返回参数。您似乎不想正确地使用0.0作为无值结果,因为这意味着0.0不能用于实际值

您有时会看到两种很好的解决方案,一种是使用结果代码,另一种是使用指针作为返回结果。指针更复杂。我先从1开始:

1.结果代码 2.使用指针 指针的问题是你需要记住删除结果


你可以用NaN。void没有任何意义,因为它类似于一个类型,而不是一个值。但是我怎么能检查它呢?是否可能影响一个变量并检查返回值是否为none?顺便说一句,有许多不同的nan。原则上你可以用不同的NaN来表达不同的意思,但这可能是个坏主意。关于你的后脚本,“我知道我可以用NaN,但我已经用它作为一个有效值,还有另一个意思,还没有一个数字可用”,你知道有几个NaN吗?你只需要使用一个不同于“还没有可用号码”的号码。谷歌“NaN有效载荷”获取详细信息。@CodesInChaos我认为,如果您打算进行涉及多个NaN的计算,那么使用不同的NaN是个坏主意。然后,如果每个IEEE 754操作的某些参数是NaN,那么您可能会得到任何原始NaN,因为每个IEEE 754操作都被定义为返回一个作为参数接收的NaN。使用几个NaN作为占位符是可以的。您可以使用NaN。void没有任何意义,因为它类似于一个类型,而不是一个值。但是我怎么能检查它呢?是否可能影响一个变量并检查返回值是否为none?顺便说一句,有许多不同的nan。原则上你可以用不同的NaN来表达不同的意思,但这可能是个坏主意。关于你的后脚本,“我知道我可以用NaN,但我已经用它作为一个有效值,还有另一个意思,还没有一个数字可用”,你知道有几个NaN吗?你只需要使用一个不同于“还没有可用号码”的号码。谷歌“NaN有效载荷”获取详细信息。@CodesInChaos我认为,如果您打算进行涉及多个NaN的计算,那么使用不同的NaN是个坏主意。然后,如果每个IEEE 754操作的某些参数是NaN,那么您可能会得到任何原始NaN,因为每个IEEE 754操作都被定义为返回一个作为参数接收的NaN。使用几个NaN作为占位符是可以的。这与仅仅返回一个double有什么不同?我不认为我把它作为练习留给读者…但是如果调用方传递TYPE1,那么featureValue的值将被保留。因此,这与只返回一个double不同。是的,它保留了*result的旧值。但是,在没有结果代码的情况下,它根本不会告诉调用方发生了什么。事实上,没有显式信号,但对于我的应用程序,我只需要隐式信号。这其实是一个很好的答案。我不知道该选哪一个@波波波
o:我对调用代码做了假设,而其他答案没有。这与仅仅返回一个双精度值有什么不同?我不认为我把它留给读者作为练习……但是如果调用方传递了TYPE1,那么featureValue的值将被保留。因此,这与只返回一个double不同。是的,它保留了*result的旧值。但是,在没有结果代码的情况下,它根本不会告诉调用方发生了什么。事实上,没有显式信号,但对于我的应用程序,我只需要隐式信号。这其实是一个很好的答案。我不知道该选哪一个@Bobobo:我对调用代码做了其他答案没有做的假设。我接受这个答案,因为在我的例子中,我已经分离了GetNewValue函数和SetNewValue函数,后者只在GetNewValue返回某个值时修改该值,所以使用这种方法更干净。我唯一的遗憾是,其他用户将不得不始终添加一个适当的返回语句。我想最大限度地降低复杂性,但这是此实现的一个小缺点,我接受这个答案,因为在我的例子中,我将GetNewValue函数和SetNewValue函数分开,后者只在GetNewValue返回某个值时才修改该值,所以使用这种方法更干净。我唯一遗憾的是,其他用户将不得不始终添加一个适当的return语句。我想最大限度地降低复杂性,但这是此实现的一个小缺点,并且比在我的示例中使用指针更干净。回答得很好,尤其是第二个使用指针的方法,这样就不需要在值之外返回另一个值,但是由于我当前项目的指导原则,我不能使用指针。但是我会把这个方法记在我的书里,谢谢!非常好的回答,特别是第二个使用指针的方法,它抛弃了除了返回值之外还返回另一个值的需要,但是我不能使用指针,因为我当前项目的指导原则。但是我会把这个方法记在我的书里,谢谢!