正确返回函数返回size_t的错误代码的方法

时间:2016-01-23 18:29:19

标签: c

我有一个探测数组的函数,如果探测成功,则返回一个数组索引。

在我的代码中,为了清楚起见,我已经为数组索引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

2 个答案:

答案 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对于这样的情况是可以接受的。