0

我有一个关于如果所述函数的参数没有完全正确排列的函数应该做什么的问题,这不是函数调用的错误。由于那句话没有多大意义,我将提供我当前的问题。为简单起见,这是我拥有的最相关和最基本的功能。

float getYValueAt(float x, PHYS_Line line, unsigned short* error)

    *error = 0;    

    if(x < line.start.x || x > line.end.x){
        *error = 1;
        return -1;
    }

    if(line.slope.value != 0){
        //line's equation: y - line.start.y = line.slope.value(x - line.start.x)
        return line.slope.value * (x - line.start.x) + line.start.y;
    }

    else if(line.slope.denom == 0){
        if(line.start.x == x)
            return line.start.y;
        else{
            *error = 1;
            return -1;
        }
    }

    else if(line.slope.num == 0){
        return line.start.y;
    }
}

该函数尝试在给定某个 x 值的情况下找到一条线上的点。但是,在某些情况下,这可能是不可能的。例如,在 x = 3 行,如果将 5 作为值传递,我们就会遇到问题。如果选择的 x 值不在线路所在的区间内,则会出现另一个问题。为此,我包含了错误指针。给定这种格式,函数调用可以按如下方式工作:

void foo(PHYS_Line some_line){
    unsigned short error = 0;
    float y = getYValueAt(5, some_line, &error);
    if(error)
        fooey();
    else
        do_something_with_y(y);
}

我的问题与错误有关。请注意,返回的值允许为负数。返回 -1 并不能确保发生了错误。我知道有时最好使用以下方法来跟踪错误:

float* getYValueAt(float x, PHYS_Line line);

然后如果发生错误则返回 NULL,但我认为这需要动态内存分配,这似乎比我使用的解决方案更不明显。那么,发生错误的标准做法是什么?

4

2 回答 2

3

一种常见的做法是返回错误代码并让用户将指针传递给结果:

int getYValueAt(float x, PHYS_Line line, float *result)

成功时返回值通常为 0,失败时返回错误代码。不需要动态分配。

于 2013-06-30T22:30:12.593 回答
2

在 C 中,这种错误处理并没有真正的标准做法。

NaN但换句话说,在您的具体情况下,一个好的处理方式就是返回0.0/0.0

/* error else */
else {
    etc();
    return 0.0/0.0;
}

这将产生NaN。您可以通过与自身进行比较来检查值是否不是数字,因为 NaN 是唯一在与自身进行比较时会失败的浮点/双精度值。

yvalue = getYValueAt(...)
if (yvalue != yvalue) {
    treat_error_here();
}

这只是一个选项,还有其他处理此类错误的方法。

于 2013-06-30T22:19:45.513 回答