Если оператор условного потока использую! оператор
Я смотрю на некоторый 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... Я не знал, как входные данные могут попасть в функцию. с оператором НЕ там...
Интересный и лаконичный трюк, который нужно запомнить на будущее.
Спасибо!