我正在尝试初始化一个数组,以便我可以使用一个简单的 if 语句来检查一个值是否已放入数组中。
这可能吗?
这是我的代码
double number[1024] = {non-numeric value}
int i = 0;
while(1){
if (number[i] != non-numeric value){
printf ("%f", number[i]);
i++;
}
else
break;
}
我正在尝试初始化一个数组,以便我可以使用一个简单的 if 语句来检查一个值是否已放入数组中。
这可能吗?
这是我的代码
double number[1024] = {non-numeric value}
int i = 0;
while(1){
if (number[i] != non-numeric value){
printf ("%f", number[i]);
i++;
}
else
break;
}
要将数据初始化为 NaN,请使用NAN
定义在<math.h>
#include <math.h>
// initialize to all NaNs
for (int i=0; i<1024; ++i) number[i] = NAN;
要检查 NaN,请使用isnan
来自的宏<math.h>
if (!isnan(number[i])) {
// do something if the value isn’t NaN.
}
使用NAN
和isnan
从<math.h>
#include <stdio.h>
#include <math.h>
// ...
#define N 1024
double number[N];
int i;
for (i = 0; i < N; i++)
number[i] = NAN; // Produce NaN
//...
i = 0;
while (i < N)
{
if (!isnan(number[i]))
{
printf("%f\n", number[i]);
i++;
}
else
break;
}
现场代码!
试试这个:
double number[1024];
int i = 0;
for(i=0 ; i<1024 ; ++i)
number[i] = NAN;
// while true is bad programming practice, use a for instead
for(i=0 ; i<1024 ; ++i) {
if(number[i]!=number[i])
printf("%ld",number[i]);
else break;
}
将 NaN 重新定义为“不由用户提供”可能是一个坏主意——如果用户想要提供 NaN 怎么办?
考虑使用“可选”数据结构来表示每个数组元素。
struct optional_double {
char has_value;
double value;
};
struct optional_double number[1024];
int i;
memset(number, 0, sizeof(number));
// Populate the array with data here.
for (i = 0; number[i].has_value; ++i) {
printf("%f", number[i].value);
}
我的回答与 cdhowie 的类似,但有一个关键区别。他是对的-您不应该将 NaN 重新用于表示“未设置”。(事实上,设置一些像 -1234.56789 这样的任意数字比这更安全,因为不太可能有任何东西等于它,而且计算更有可能导致 NaN。)显然,所有 math.h 中都没有定义 NAN文件,但如果它在你的文件中,那是最简单的方法。
我建议将 NULL 重新用于您的任务。
您实际上想将您的 double 转换为Nullable 类型,那么为什么不实际这样做呢?
double* numberPointers[1024];
memset(numberPointers, NULL, 1024 * sizeof(double));
int i = 0;
while(1){
if (numberPointers[i] != NULL){
printf ("%f", numberPointers[i]);
i++;
}
else {
break;
}
}
困难的部分是改变你的计算。而不是像
void fillArray(double[] number) {
int i;
for (i = 0; i < 1024; ++i) {
number[i] = someCalculation(i);
}
}
你需要类似的东西
void fillArray(double*[] numberPointers) {
int i;
double result;
double* d;
for (i = 0; i < 1024; ++i) {
result = someCalculation(i);
d = (double*)malloc(sizeof(double));
*d = result;
numberPointers[i] = d;
}
}
当然,当你完成后,你需要free
所有的指针numberPointers
,但这应该很容易:
int i;
for (i = 0; i < 1024; ++i) {
if (numberPointers(i) != NULL) {
free(numberPointers(i));
}
}