我有一个探测数组的函数,如果探测成功,则返回一个数组索引。
在我的代码中,为了清楚起见,我已经为数组索引a type_t
制作了所有类型。
保留此功能清晰度的优先方法是什么?我应该将一个指针参数带到一个错误变量并设置它吗?
inline size_t
lin_search(const double *pxa, const double x, const size_t idxlow, const size_t idxhigh)
{
for (size_t i = idxlow; i < idxhigh; i++)
{
if (pxa[i] <= x && pxa[i+1] > x)
return i;
}
return -1; // If I change the return type to f.ex long int this works
// but I am no longer consistent
}
然后我可以用它作为
index = linsearch(parray, x, 0, n - 1);
if (index == -1)
... not found
答案 0 :(得分:4)
另一种没有“丢失”size_t(size_t 是数组索引的正确类型)的方法是返回指针中的索引值,并将返回代码作为布尔值返回:
bool
lin_search(...., size_t *index) {
bool found = false;
for (size_t i = idxlow; i < idxhigh; i++) {
if (pxa[i] <= x && pxa[i+1] > x) {
found = true;
*index = i;
break;
}
}
return found;
}
你可以打电话:
size_t index;
if ( lin_search(...., &index) ) {
/* use 'index' */
}
这样,您不必在使用size_t
之外的其他内容时妥协,函数返回类型仍然表示是否找到了索引。
答案 1 :(得分:1)
这样的情况并非闻所未闻。例如,fgetc
的定义,其中包含字符:
int fgetc(FILE *stream);
fgetc()从流中读取下一个字符并将其返回为 一个无符号的char转换为int,或者文件结尾或错误的EOF。
此函数返回一个值,该值可在成功时强制转换为unsigned char
,并在失败时返回EOF
(通常为-1)。
另一个例子是ftell
,它报告文件中的当前偏移量:
long ftell(FILE *stream);
成功完成后,... ftell()返回当前值 偏移。否则,返回-1并设置errno以指示 错误。
文件偏移总是非负的,因此返回负值是报告错误的方式。
所以我认为将返回类型更改为long
对于这样的情况是可以接受的。