2014-10-16 100 views
3

不知道我是否過度這樣做,但當參數不在需要的範圍內時,我將如何返回未定義的東西?返回值在C中未定義

我試圖做的事:

uint64_t function(uint64_t Value, uint64_t N) { 
    uint64_t result = 0; 

    if (N > 0){ 
    //do something; 
    return result; 
    } 
    else{ 
    return result is undefined; 
    } 
} 

如何返回,N是不確定的?

+3

那麼一個選擇是:http://en.wikipedia.org/wiki/Sentinel_value – 2014-10-16 23:11:21

+0

在你的情況,這取決於你的函數可能返回的值的範圍。如果你知道這個範圍,那麼你可以將一個值作爲一個未定義的值。 – Ashalynd 2014-10-16 23:14:00

+0

一種可能性是像C庫調用並設置errno = ERANGE。 – 2014-10-16 23:58:20

回答

5

一種解決方案是返回一個狀態,並使用OUT參數,像這樣:

bool function(uint64_t Value, uint64_t N, uint64_t *result) { 

    if (N > 0){ 
    //do something; 
    *result = 31337; 
    return true; 
    } 
    else{ 
    return false; 
    } 
} 

然後當你調用這個函數,你檢查功能使用結果之前返回true。

+0

我無法將其更改爲布爾值。它必須是類型uint64_t的功能 – Tavo 2014-10-16 23:46:45

+1

@Tavo然後使用'uint64_t函數(...,bool * isUndefined)'原型。 – user3125367 2014-10-17 01:12:33

3

對於整數類型,你不能。

恰好有2 類型uint64_t的可能值,並且它們中的每一個都是有效的整數值。

在某些情況下,您可以選擇一個值(可能爲UINT64_MIN),您可以將其視爲錯誤指示,然後返回 - 但這並不總是實用。

或者您可以讓函數返回成功或失敗結果,並通過其他方法將uint64_t值傳回給調用者,可能是通過調用者傳入的指針存儲該值。

+0

如果我這樣做:... else {return -1;}} N必須大於0否則函數應該返回undefined。 – Tavo 2014-10-16 23:44:37

+0

@Tavo:如果您在返回'uint64_t'的函數中執行'return -1;',則將'-1'轉換爲'18446744073709551615'。 'uint64_t'沒有未定義的值 - 除非你按照慣例自己定義它。 – 2014-10-17 00:13:42

1

另一種選擇是返回一個結構。這個工程用C++好(看升壓可選),但這裏有一個C版:

#include <stdio.h> 
#include <stdbool.h> 

struct optional_int { 
    bool valid; 
    int value; 
}; 

struct optional_int f(int x) 
{ 
    struct optional_int result = {false, 0}; 
    if(x > 0 && x < 10) { 
     result.valid = true; 
     result.value = x * 1024; 
    } 
    return result; 
} 

int main() 
{ 
    struct optional_int v; 

    v = f(9); 
    if(v.valid) { 
     printf("Result is %d\n", v.value); 
    } 
    return 0; 
}