如果陈述似乎没有失败

时间:2013-11-28 02:48:33

标签: c loops boolean-logic

我有一个循环,它通过存储在缓冲区中的图像,一次抓取1024个字节,并将此千字节作为UDP数据包发送。以下是相关的代码部分。

if (buf.bytesused - curr*1024 > 1024)大于curr*1024时,为什么我的第二个if语句buf.bytesused失败?我陷入无限循环,直到memcpy最终抛出一个seg错误才结束。我的buf.bytesused大约是900,000,但它不是循环大约900次,而是继续前进,即使buf.bytesused - curr*1024给出否定结果,肯定小于1024。

如果不清楚:当curr很小时,buf.bytesused - curr * 1024>像我期望的那样满足1024,并运行第二个if-block。然而,当curr变大(甚至如此大以至于buf.bytesused - curr * 1024为负)时,第二个if-block仍在运行,而不是第三个块,在else之后。

buf.bytesused是无符号的32位int。

  #define FRAME_START 0x0
  #define FRAME_END   0xF
  #define FRAME_MID   0xA

  uint_32 buf.bytesused = 921600;
  char frameInfo = FRAME_START;
  char frameNum = i;
  int curr = 0;

  while (frameInfo != FRAME_END) {
    if (curr == 0) {
      frameInfo = FRAME_START;
      memcpy(&frameInfo, &udpBuf[0], 1);
      memcpy(&frameNum, &udpBuf[1], 1);
      memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, 1024);
    }else if (buf.bytesused - curr*1024 > 1024) {
      frameInfo = FRAME_MID;
      memcpy(&frameInfo, &udpBuf[0], 1);
      memcpy(&frameNum, &udpBuf[1], 1);
      memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, 1024);
    } else {
      frameInfo = FRAME_END;
      memcpy(&frameInfo, &udpBuf[0], 1);
      memcpy(&frameNum, &udpBuf[1], 1);
      memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, (buf.bytesused % 1024));
    }

    if (sendto(s, udpBuf, BUFLEN, 0, &si_other, slen)==-1)
      diep("sendto()");
    curr++;
  }

顺便说一句,有人能告诉我memcpy的错误吗?它不会将我的两个字符的值复制到我的缓冲区。

2 个答案:

答案 0 :(得分:4)

if (buf.bytesused - curr*1024 > 1024) fail when curr*1024 gets larger than buf.bytesused

buf.bytesusedunsigned时可能会出现问题。

如果是否定并签名,那么上述比较应该失败。

要解决,你也可以使用简单的数学。

if (buf.bytesused > curr*1024 + 1024)

if (buf.bytesused > (curr + 1)*1024)

除非curr+1为否定,否则这些条件不会因签名而导致问题。

我认为这可以解决你的问题。

答案 1 :(得分:3)

如果人们想知道,实际问题就在这里:

frameInfo = FRAME_END;
memcpy(&frameInfo, &udpBuf[0], 1);

frameInfo在设置为FRAME_END后会被覆盖,因此while (frameInfo != FRAME_END)永远不会评估为false。这导致程序进入无限循环的事实导致OP错误地认为他的if语句是错误的。使用调试器而不是假设您知道问题是什么总是很好的做法!