我正在尝试初始化一个数组,以便我可以使用一个简单的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;
}
答案 0 :(得分:8)
要将数据初始化为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.
}
答案 1 :(得分:2)
使用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;
}
答案 2 :(得分:1)
试试这个:
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;
}
答案 3 :(得分:1)
将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);
}
答案 4 :(得分:0)
我的答案与cdhowie相似,但有一个关键的区别。他是对的 - 你不应该将NaN重新定位为“未设置”。 (实际上,设置一些像-1234.56789这样的任意数字比这更安全,因为不太可能有任何东西等于那个,并且更有可能计算会导致NaN。)并且显然,NAN并未在所有math.h中定义。文件,虽然它在你的文件中,但这是最简单的方法。
我建议您为任务重新定位NULL。
你实际上想把你的双倍变成Nullable type,为什么不这样做呢?
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));
}
}