【问题标题】:In C language, comparing 2 members of a structure在 C 语言中,比较结构的 2 个成员
【发布时间】:2017-06-12 18:01:39
【问题描述】:

我似乎无法比较结构的 2 个成员。 我可以在监视窗口中看到所有日志中的序列都是 0x000。

这一项评估 AllLogsNotZero 为 TRUE

for (i=0;(i<(3)&&(!AllLogsNotZero));i++)
   {
       UINT8 j;
       j=i+1;
       UINT16* comp1;
       UINT16* comp2;
       comp1 = (UINT16*) (&Data.log[i].Sequence);
       comp2 = (UINT16*) (&Data.log[j].Sequence);
       if ((Data.log[i].Sequence == Data.log[j].Sequence) == 0)
            AllLogsNotZero=FALSE;
       else
            AllLogsNotZero=TRUE;

这一项将 AllLogsNotZero 评估为 FALSE

for (i=0;(i<(3)&&(!AllLogsNotZero));i++)
   {
       UINT8 j;
       j=i+1;
       UINT16* comp1;
       UINT16* comp2;
       comp1 = (UINT16*) (&Data.log[i].Sequence);
       comp2 = (UINT16*) (&Data.log[j].Sequence);
       if (Data.log[i].Sequence == Data.log[j].Sequence)
            AllLogsNotZero=FALSE;
       else
            AllLogsNotZero=TRUE;

我不知道为什么。

【问题讨论】:

  • 由于您在询问的比较代码中没有使用 comp1comp2,因此您应该从每个 sn-p 中删除这些行(其中 4 行)——这就是创建 MCVE (minimal reproducible example) 的“最小”部分。将您的代码制作成 MCVE 是个好主意。也值得使用UINT8 j = i + 1; 来初始化变量,而不是使用两行。 (类似的 cmets 也适用于 comp1comp2。)
  • AllLogsNotZero两个循环之前的初始值是多少?

标签: c struct compare


【解决方案1】:

我认为你是在从鼹鼠山上造山。我认为我使用当前变量名编写循环的方式是:

bool AllLogsNotZero = true;
for (int i = 0; i < 4; i++)
{
    if (Data.log[i].Sequence == 0)
    {
        AllLogsNotZero = false;
        break;
    }
}
if (AllLogsNotZero)
    …processing option for no zero logs
else
    …processing option for at least one log zero

我们可以讨论循环限制应该是 3 还是 4(或其他值);从您的代码中并不完全清楚,但是您将j 设置为i+1 并使用它,并将i 限制为&lt; 3,因此当代码不使用i+1 时,限制应该可能是 4。最好有一个枚举或 #define 值作为限制 - 名称将更好地表明您正在衡量的对象,而不仅仅是数字。

名字中的否定词(AllLogsNotZero)也让生活变得更加艰难;尽可能避免这种情况。例如:

bool LogsZero = false;
for (int i = 0; i < 4; i++)
{
    if (Data.log[i].Sequence == 0)
    {
        LogsZero = true;
        break;
    }
}
if (LogsZero)
    …processing option for at least one log zero
else
    …processing option for no zero logs

【讨论】:

    【解决方案2】:

    查看 if 语句

    第一次检查:

    //You check if they are the same
    if (Data.log[i].Sequence == Data.log[j].Sequence)
    

    二次检查

    //You check if they are not the same
    if ((Data.log[i].Sequence == Data.log[j].Sequence) == 0)
    
    //Can be evaluated as:
    if (Data.log[i].Sequence != Data.log[j].Sequence)
    

    【讨论】:

    • 但我必须检查成员 Data.log[1].Sequence 和 Data.log[2].Sequence 以确保它们都是 0!因此我的代码中有数字 0。
    • @newb7777 请理解if ((Data.log[i].Sequence == Data.log[j].Sequence) == 0) 不会检查任何/所有数据值是否为0。它正在检查比较的结果,而不考虑实际数据值。比较 Data.log[i].Sequence == Data.log[j].Sequence 评估为 10 以显示数据是否相等。
    • @Weather Vane,我明白你的意思,结构成员将结果相互比较,如果它不相等,则计算为 0。否则计算为 非零数 (?)。我明白为什么将非零数字结果与 0 进行比较总是FALSE
    • 它具体评估为1。与某些返回0non 0(如strcmp)的C 库函数不同。
    • ... 这并不意味着 falsetrue。正如这个答案所说,比较比较是没有意义的。
    【解决方案3】:
    for (i=0;(i<(3)&&(!AllLogsNotZero));i++)
       {
           UINT16 Var1 = 0;
    
           if (Data.log[i].Sequence == Var1)
                AllLogsNotZero=FALSE;
           else
                AllLogsNotZero=TRUE;
    

    这行得通!

    【讨论】:

    • 使用Var1而不是简单地写if (Data.log[i].Sequence == 0)有什么好处?
    • 同意,我认为将变量作为 16 位数字进行比较很重要,所以我定义了它,但你是对的,它没有任何区别,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多