2

我正在尝试初始化一个数组,以便我可以使用一个简单的 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;

}
4

5 回答 5

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.
}
于 2013-04-09T16:30:35.250 回答
2

使用NANisnan<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;
    }

现场代码

于 2013-04-09T16:31:29.643 回答
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;
}
于 2013-04-09T16:34:53.023 回答
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);
}
于 2013-04-09T16:36:10.327 回答
0

我的回答与 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));
    }
}
于 2013-04-09T16:52:22.950 回答