我有一个简单的设计(?)问题。
我正在编写一个简单的程序,它有几个看起来像这样的函数。
float foo (float* m,size_t n){
float result;
//do some calculations, for example a sum
return result / n;
}
我对此有几个问题,无意重新开启一些圣战。
我应该在n
上添加健全性检查吗?如果是这样,我应该如何让来电者知道?
返回-1
在浮动上看起来很奇怪;
float foo(float *m,size_t n){
if (n == 0) return -1f
...
}
我的另一个选择是out参数
float foo(float *m,size_t n, int *error){
if (n==0){
*error = 1;
return 0f;
}
...
}
更新
这是一种玩具程序,只是想尝试一些东西。问题超出了这个事实。也许我应该改写为“如何在没有(OOP)异常的情况下处理错误”。
还要考虑在拨打电话前测试n
,但不要那么喜欢。
有什么想法? 提前谢谢。
答案 0 :(得分:6)
我猜你的out parameter
选项很好。但我想其他方式会更好。使用out参数获取结果,使用返回值表示调用的状态。喜欢这个
int foo(float *m, size_t n, float* result)
{
if(someFailureCondition)
return ERROR; // ERROR being an error integer
// else
// do some calculation
// set your result
return NO_ERROR; // NO_ERROR being an integer
}
修改强> 返回值可以更详细,以表示out参数的当前状态。见詹姆斯林的评论!
答案 1 :(得分:2)
如果函数无法返回-1,则无论如何都返回-1。但是如果传递n = 0不会破坏函数,那么它实际上并不需要。我假设n是数组m的大小。
处理错误是一个优先事项。当函数失败时,OpenGL通过返回错误代码(-1或其他)来处理错误。通过调用GetLastError()(或类似的东西)返回错误代码。这似乎是一种理想的错误处理解决方案。
答案 2 :(得分:1)
如果需要,可以使用特殊的浮点值 - 例如,如果浮点实现支持安静的NaN(非数字),那么您可以使用{{1}中的NAN
宏}}:
math.h
答案 3 :(得分:1)
您应该通过清楚地记录您的代码,让调用者了解您的函数的语义。
你的职能合同是什么?如果要求调用者不为n
传递0,则需要解释,并且该函数应使用assert
来验证是否满足这些要求。应该尽早发现逻辑错误,并且这些失败应该尽可能地引人注目。
现在,如果您正在编写将由其他开发人员使用的库的代码,并且担心人们将在禁用assert
的情况下进行编译,那么将其与始终启用的更软故障模式相结合是合理的。 :
if (n == 0)
{
assert(0);
return NAN; /* Or return some error code */
}