I have a function that probes an array and returns an array index if the probe succeeds.
In my code I have made every type concerning an array index a type_t
for clarity.
What is the preffered way of retaining that clarity for this function? Should I take a pointer argument to an error variable and set that?
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
}
Then I could use it as
index = linsearch(parray, x, 0, n - 1);
if (index == -1)
... not found
One other way without "losing" size_t (size_t is the correct type for array indexes) is to return the index value in the pointer and return code as a boolean:
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;
}
and you can call:
size_t index;
if ( lin_search(...., &index) ) {
/* use 'index' */
}
This way, you don't have to compromise with using something other than size_t
and the function return type still says whether the index is found.
Situations like this are not unheard of. Take for example the definition of fgetc
, which reads characters:
int fgetc(FILE *stream);
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.
This function returns a value that can be cast to unsigned char
on success, and it return EOF
(typically -1) on failure.
Another example is ftell
, which reports the current offset in a file:
long ftell(FILE *stream);
Upon successful completion, ... ftell() returns the current offset. Otherwise, -1 is returned and errno is set to indicate the error.
File offsets are always non-negative, so returning a negative value is how errors are reported.
So I think changing the return type to long
would be acceptable for a case like this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With