对于字符串,您使用空终止符,但对于此实现,所有可能的值都可能有效。
如果所有值都有效,则无法实现标记值。就这么简单(这就是为什么EOF 是一个溢出char 类型的整数值)。
该函数不知道数组的大小,我想保持这种状态...
假设NaN 是无效值,您可以使用isnan() macro 来测试标记值。
但是,NaN 是一个有效值...
无论如何我都需要能够找到结局。
剩下的唯一选择是实际将数组长度与数组一起传递。
如果您不能将数组长度添加为单独的参数,您可以(可能)将数组的长度存储为第一个成员 - 使用结构(推荐)或使用类型双关语(不要尝试这个除非你知道自己在做什么)。
即
typedef struct float_array_s {
unsigned int len;
float f[];
};
static unsigned int float_array_len(float_array_s * arr) { return arr->len; }
static float float_array_index(float_array_s * arr, unsigned int index) { return arr->f[index]; }
如果您可以简单地将有效数组长度的长度与数组一起传递,那么真的没有理由使用计算周期。
编辑(双关语)
我强烈建议避免使用这种方法,因为类型长度可能会导致难以检测到错误。不过……
可以将数组的长度存储在第一个 float 成员中,方法是使用相同的字节(内存)来存储整数。
请注意,如果 unsigned int 比 float 长(可能是这样,即使它们通常具有相同的字节大小),这可能会崩溃(或者最糟糕的是,静默失败)。
即
#include "math.h"
#include "stdint.h"
#include "stdio.h"
/* Returns the member at `index`. */
static float float_array_index_get(float *arr, unsigned int index) {
return arr[index + 1];
}
/* Sets the member at `index` to `val. */
static void float_array_index_set(float *arr, unsigned int index, float val) {
arr[index + 1] = val;
}
/* Returns the array's length. */
static unsigned int float_array_length_get(float *arr) {
if (sizeof(unsigned int) > sizeof(float)) {
fprintf(
stderr,
"ERROR: (%s:%d) type size overflow, code won't work on this system\n",
__FILE__, __LINE__);
}
union {
float f;
unsigned int i;
} pn;
pn.f = arr[0];
return pn.i;
}
/* Sets the array's length. */
static void float_array_length_set(float *arr, unsigned int len) {
if (sizeof(unsigned int) > sizeof(float)) {
fprintf(
stderr,
"ERROR: (%s:%d) type size overflow, code won't work on this system\n",
__FILE__, __LINE__);
}
union {
float f;
unsigned int i;
} pn;
pn.i = len;
arr[0] = pn.f;
}
/* Pushes a member to the array, increasing it's length. */
static void float_array_index_push(float *arr, float val) {
unsigned int len = float_array_length_get(arr);
float_array_index_set(arr, len, val);
float_array_length_set(arr, len + 1);
}
/* Pops a member from the array...
* ... returning nan if the member was nan or if the array is empty.
*/
static float float_array_index_pop(float *arr) {
unsigned int len = float_array_length_get(arr);
if (!len)
return nan("");
float_array_length_set(arr, len);
return float_array_index_get(arr, len);
}
附言
我希望你会坚持使用简单的func(float * arr, size_t len),因为你已经看到了需要多少额外的代码才能避免传递数组的长度。