由于过去几个月我一直在教自己如何用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;
}
答案 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!");