If statement if语句使用条件流!操作人员

If statement if语句使用条件流!操作人员,if-statement,arduino,conditional,If Statement,Arduino,Conditional,我正在看一些与Arduino兼容的代码,这些代码是专门为使用串行闪存而设计的,但是我遇到了一个关于if()语句和程序条件流的更一般的问题。这是一种我以前从未见过的新技术。可在此处访问原始代码: 这段代码运行良好,并且实现了它的目标,这不是这里的问题……仅供参考 在void loop()中,我很难理解的代码如下: logging = true; if (logging) { logString = valueToLogString (temperature, curre

我正在看一些与Arduino兼容的代码,这些代码是专门为使用串行闪存而设计的,但是我遇到了一个关于if()语句和程序条件流的更一般的问题。这是一种我以前从未见过的新技术。可在此处访问原始代码:

这段代码运行良好,并且实现了它的目标,这不是这里的问题……仅供参考

在void loop()中,我很难理解的代码如下:

logging = true;
    if (logging) {
          logString = valueToLogString (temperature, currentTime);

          if (!dataLogger.writeData (logString.c_str(), logString.length())) {
            if (!flashFull) {
              Serial.print ("Flash data is full - stopped writing\n");
              flashFull = true;
            }
          }
          // also print to serial port
          Serial.print(logString);
        }
      }
bool SerialFlashDataLogger::writeData (const void *buf, uint32_t wrlen) {

  uint32_t lengthWritten = 0;

  lengthWritten = dataFile.write (buf, wrlen);

  // return false if all the data was not written
  return (lengthWritten == wrlen);
}
在上述代码中调用的函数dataLogger.writeData如下所示:

logging = true;
    if (logging) {
          logString = valueToLogString (temperature, currentTime);

          if (!dataLogger.writeData (logString.c_str(), logString.length())) {
            if (!flashFull) {
              Serial.print ("Flash data is full - stopped writing\n");
              flashFull = true;
            }
          }
          // also print to serial port
          Serial.print(logString);
        }
      }
bool SerialFlashDataLogger::writeData (const void *buf, uint32_t wrlen) {

  uint32_t lengthWritten = 0;

  lengthWritten = dataFile.write (buf, wrlen);

  // return false if all the data was not written
  return (lengthWritten == wrlen);
}
我很难理解if()语句:

如果(!dataLogger.writeData(logString.c_str(),logString.length()))

代码被设计为连续记录数据,那么为什么会有一个if(!dataLogger.writeData…)--它读取if(“NOT”dataLogger.writeData…)

我认为这与“writeData”函数的定义以及它返回布尔值的事实有关,但我似乎无法理解这是如何帮助writeData函数不断接受输入以写入内存芯片的

在这里的逻辑中我遗漏了一些东西


我知道这可能是一篇让人困惑的帖子……希望有人能明白;0

expr
类型为
bool
时,
if(!expr)
if(!expr==true)
if(expr==false)
相同

所以,它是这么说的

然后,条件是查看是否“所有数据都未写入”


if
中的代码仅在“未写入所有数据”时执行。

writeData函数返回一个布尔值,如您在那里看到的
bool SerialFlashDataLogger::writeData
。此布尔值告诉您是否已写入所有数据,因此您可以在条件语句中的布尔表达式中使用此值。闪存中有一个日志文件,由变量
dataFile
表示:

 lengthWritten = dataFile.write (buf, wrlen);
只要有可用空间,对数据记录器.writeData的调用将返回true

磁盘已满后,对
dataFile.write
的调用最终写入的字节数将少于请求的字节数,因此,
dataLogger.writeData
将返回false:

// return false if all the data was not written
return (lengthWritten == wrlen);

我认为在调用日志函数之前的某个地方应该检查
flashFull
(在
if(logging){
之前的某个地方)为了防止在串行端口上打印太多错误。

感谢您的帮助…现在这是有意义的…我在理解如何工作时缺少的部分与以下概念有关:首先调用writeData函数,然后在该函数内部记录数据,然后在返回时对其进行评估ing FALSE或TRUE,然后用NOT反转,如果在反转后它的计算结果为FALSE,则将其传递…我不清楚NOT运算符在那里时输入如何进入函数

这是一个有趣而简洁的诀窍,要记住,以备将来使用


谢谢!

我认为,在学习复杂的项目之前,你应该先学习语言基础。1)ARDUNO不是C,而不是C++ 2)“我知道这可能是一个令人困惑的帖子…希望对某人来说是清楚的”-下定决心,首先知道你想问什么。如果你与操作员有问题,请阅读一本书或教程。可以找到足够的信息。要求你自己至少展示一些研究成果。请参阅。