如何确定数据是否已写入结构中的变量

时间:2014-09-29 14:06:05

标签: c compiler-errors comparison

由于过去几个月我一直在教自己如何用C语言编程,我还是个业余爱好者,有时我会在尝试一项简单的任务时遇到困难。在这种情况下,我无法确定如何询问数据是否已写入结构中的变量。

目前,我通过将一个整数初始化为零来绕过这一点,如果语句结果为TRUE,则该整数将增加为1,然后询问它是零还是一。我确信编程界不赞成这一点。这里有一些代码无法编译,因为比较指针(NULL)与结构中的变量不兼容。有人可以告诉我如何正确地做到这一点?在此先感谢!!

#include <stdlib.h>
#include <stdio.h>

typedef struct alpha
{
    int coordinates[3];
} alpha;

typedef struct nulltest
{
    struct alpha *a;
} nulltest;

void assign(struct nulltest *nt)
{
    int n, m=20, x=0, y=1, z=2;
    nt->a=malloc(m*sizeof(struct alpha));

    for(n=0; n<m; n++){
        nt->a[n].coordinates[0]=x;
        nt->a[n].coordinates[1]=y;
        nt->a[n].coordinates[2]=z;

        x++;
        y++;
        z++;

        if(nt->a[n].coordinates[0]==NULL){
            printf("OH NO! No data!");
            break;
        }
        else printf("Great! Data assigned!");
    }
}

int main()
{
    struct nulltest nt;

    assign(&nt);
    return 1;
}

4 个答案:

答案 0 :(得分:1)

如果分配了内存,则必须测试nt->a==NULL

nt->a[n]->coordinates[0] == NULL您必须测试是否已分配值nt->a[n]->coordinates[0]==0

因此,由于指针与整数的比较不匹配而发生错误。

这里NULL是指针,nt-&gt; a [n] - &gt;坐标[0]是整数。

答案 1 :(得分:1)

在您要测试的变量的可能值集合中,您需要取一个并将其定义为&#34;无效值&#34;值。始终将此变量初始化为此值。

例如,如果您知道某个坐标不能成为负值,请将-1定义为&#34;无效值&#34;值。或者,如果允许使用否定值,请使用最负面的INT_MIN

...

/* Prior to assignment initialise all vars to a well-defined value. */
for(n=0; n<m; n++)
{
    nt->a[n].coordinates[0]=INT_MIN;
    nt->a[n].coordinates[1]=INT_MIN;
    nt->a[n].coordinates[2]=INT_MIN;
}

/* Do the assignment. */
for(n=0; n<m; n++)
{
    /* Some logic assigning values to nt->a[n].coordinates[] 
       (or not) out of the range INT_MIN+1 ..INT_MAX. */
}

/* Test whether all initial value had been overwritten. */
for(n=0; n<m; n++)
{
    if (
      INT_MIN == nt->a[n].coordinates[0] ||
      INT_MIN == nt->a[n].coordinates[1] ||
      INT_MIN == nt->a[n].coordinates[2]
    )
    {
      printf("OH NO! No data at index %d\n" , n);
    }
}

...

如果您需要从可能值集合中获取每个可能的值,那么您确实需要像执行此操作那样,定义一个标志,指示变量是否已设置。

答案 2 :(得分:0)

我能想到的唯一方法是写一些数据,然后再读回来:

nt->a[n].coordinates[0]=1234;

if(nt->a[n].coordinates[0]!=1234){
    printf("OH NO! No data!");
    break;
}

但这毫无意义。实际上,您在这里测试您的硬件和编译器是否正确。

我想你可能会检查整个结构。请参阅Chandrus帖子......

答案 3 :(得分:0)

要添加 Chandru 所说的实际回答您问题的内容,没有测试来验证No data问题。 nt-&gt; a [n] .coordinates [0] 总会有一些数据,因为它指向某个内存位置。您的逻辑的propper测试是我的数据是否正确?并且comparisson应该是

if(nt->a[n].coordinates[0] == x - 1){
    printf("OH NO! Data incorrect!");
    break;
}
else printf("Great! Data correct!");