Если оператор условного потока использую! оператор

Я смотрю на некоторый Arduino-совместимый код, специально разработанный для работы с последовательной флэш-памятью, но я сталкиваюсь с более общим вопросом об операторах if() и условном течении программы. Это новая техника, которую я не видел раньше. С оригинальным кодом можно ознакомиться здесь: https://github.com/LAtimes2/DataLogger/blob/master/DataLogger.ino

Этот код работает нормально, и делает то, для чего он предназначен, вопрос не в этом... просто к сведению.

Код, который мне трудно понять, в цикле void () выглядит следующим образом:

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);
        }
      }

Функция dataLogger.writeData, вызываемая в приведенном выше коде, выглядит следующим образом:

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():

if (! dataLogger.writeData (logString.c_str (), logString.length ()))

Код предназначен для непрерывной регистрации данных, так почему же существует if (! DataLogger.writeData.....), который читает if ("NOT"dataLogger.writeData....)

Я думаю, что это как-то связано с тем, как определяется функция "writeData", и с тем фактом, что она возвращает логическое значение, но я просто не могу понять, как это помогает функции writeData непрерывно принимать входные данные, чтобы написать на чип памяти?

Здесь есть кое-что, чего мне не хватает в логике.

Я знаю, что это, возможно, запутанный пост... надеюсь, это кому-то понятно;0

4 ответа

Решение

Во флэш-памяти есть файл журнала, который представлен переменной dataFile:

 lengthWritten = dataFile.write (buf, wrlen);

Пока есть свободное место, призыв к dataLogger.writeData вернет истину.

Как только диск заполнен, вызов dataFile.write в конечном итоге будет записано меньше байтов, чем запрошено, следовательно, dataLogger.writeData вернет false:

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

Я думаю, что должна быть проверка flashFull где-то до вызова функции регистрации (где-то до if (logging) {), чтобы не печатать слишком много ошибок на последовательный порт.

Функция writeData возвращает логическое значение, как вы можете видеть там bool SerialFlashDataLogger::writeData, Это логическое значение сообщает вам, все ли данные были записаны или нет, поэтому вы можете использовать это в логическом выражении в условном выражении

Когда expr имеет тип bool, if (!expr) такой же как if (!expr == true), или же if (expr == false),

Итак, это то, что он говорит.

// return false if all the data was not written

Условие тогда видит, были ли "все данные не записаны".

Код в пределах if выполняется только если "все данные не были записаны".

Спасибо за помощь... теперь это имеет смысл... Часть, которую мне не хватало в моем понимании того, как это работает, связана с концепцией, что функция writeData называется FIRST, которая затем регистрирует данные внутри этой функции., а затем оценивается, возвращает ли оно значение FALSE или TRUE, которое затем переворачивается с помощью NOT, и передается, если после обращения оно оценивается как False... Я не знал, как входные данные могут попасть в функцию. с оператором НЕ там...

Интересный и лаконичный трюк, который нужно запомнить на будущее.

Спасибо!

Другие вопросы по тегам