从双重功能返回空白?

时间:2013-05-06 15:25:46

标签: c function return void

我有一个double函数,通常返回变量的新值,但有时我不想更改变量,我想通过返回一个特殊值来表示,例如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,但我已经将它用作具有其他含义的有效值(还没有数字可用)。

/编辑:谢谢大家的答案,这3个答案都适用于我的问题,并且都同样有效。我现在正在努力选择我将要使用哪一个(我会接受的那个,但我希望我能接受它们!)。

3 个答案:

答案 0 :(得分:5)

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

int GetNewValue(double *res, int feature) {
    switch( feature ) {
    case TYPE1:
        return 0; // no change to res
    case TYPE2:
        *res = 2.343;
        return 1;
    default:
        *res = featureDefaultValue;
        return 1;
}

现在而不是这样做

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
}

答案 1 :(得分:4)

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

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);

答案 2 :(得分:0)

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

有时您会看到2个好的解决方案是使用“结果代码”,或者使用指针作为返回结果。 (指针更复杂)。我先从#1开始:

1。结果代码

// definitions for result codes
#define FAIL 0
#define OK 1

int GetNewValue(int feature, double *result) {
    switch( feature ) {
        case TYPE1:
            *result = 0.0 ;
            return FAIL ; // caller of the function should recognize
                          // the call "failed"
        case TYPE2:
            *result = 200.0 ;
            return OK ;
        default:
            *result = 47.0 ;
            return OK;
    }
}

// use:
double feature ;
int result = GetNewValue( 5, &feature ) ;
if( result == OK )
{
    // do something with "feature"
}

2。使用指针

double* GetNewValue(int feature) {
    switch( feature ) {
        case TYPE1:
            return NULL ; // NO POINTER means FAIL
        case TYPE2:
            return new double(200) ;
        default:
            return new double( 47 ) ;
    }
}

// use:
double* result = GetNewValue( 5 ) ;
if( result != NULL )
{
    // result had a value, so you can use it
}

指针的问题是你需要记住delete result

delete result ; // when done with pointer that was created
                // with `new`, you must `delete` it after
                // otherwise you'll get a memory leak