2014-10-16 8 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 –

+0

В вашем случае, это зависит от того, диапазон возможных значений, возвращаемых вашей функцией. Если вы знаете этот диапазон, вы можете получить значение за пределами него как неопределенное значение. – Ashalynd

+0

Одна из возможностей - сделать так, как вызовы библиотеки C и установить errno = ERANGE. –

ответ

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

Тогда при вызове этой функции убедитесь, что функция возвращает истину перед использованием результата.

+0

Я не могу изменить его на boolean. Он должен быть функцией типа uint64_t – Tavo

+1

@Tavo использовать функцию 'uint64_t (..., bool * isUndefined)' prototype. – user3125367

3

Для целых типов вы не можете.

Существует ровно 2 Возможные значения типа uint64_t, и каждое из них является допустимым целочисленным значением.

В некоторых случаях вы можете выбрать одно значение (возможно, UINT64_MIN), которое можно рассматривать как указание об ошибке, и вернуть это - но это не всегда практично.

Или вы можете вернуть функцию к результату успеха или сбоя и передать значение uint64_t обратно вызывающему абонентом другими способами, возможно, путем его хранения с помощью указателя, переданного вызывающим.

+0

если я: ... else {return -1;}} N должен быть больше 0, иначе функция должна возвращать неопределенные. – Tavo

+0

@Tavo: Если вы возвращаете -1; 'в функции, возвращающей' uint64_t', '-1' будет преобразована в' 18446744073709551615'. Не существует неопределенного значения для 'uint64_t' - если вы сами не определяете его по соглашению. –

1

Другой вариант - вернуть структуру. Это работает лучше в C++ (смотреть на Boost, необязательно), но вот версия 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; 
}