为什么我不能使用函数计算的 int 作为索引访问此数组中的值?
Why can't I access a value from this array using a functionally calculated int as an index?
编辑:我错误地认为我应该问这个作为一般 C++ 问题,后来意识到这个问题来自我在 Arduino 环境中使用 C++。在我的示例中,我没有在阵列上使用 Arduino 修改器 PROGMEM
,这将其存储从 RAM 移动到 FLASH,这最终导致了计算问题。访问 PROGMEM 数组需要我使用访问器方法 pgm_read_byte
而不是索引。
我有一个数组:
const PROGMEM uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
我有一个来自时间库的功能计算 uint8:
uint8_t month = tm.month();
我有一个 size_t:
size_t monthIndex = (size_t)month;
我曾尝试使用 month
或 monthIndex
访问此数组中的值,但结果相同:
# For size_t monthIndex = 1 or uint8 month = 1; ...
uint8_t currentDaysInMonth = daysInMonth[monthIndex];
# >> Expected = 28;
# >> What I actually get = 61;
如何获得预期的数组值?
61从哪里来?
编辑
这是 tm
的日期时间 class 的相关部分
class DateTime {
public:
DateTime (uint16_t year, uint8_t month, uint8_t day,
uint8_t hour = 0, uint8_t min = 0, uint8_t sec = 0);
uint8_t month() const { return m; }
}
日期时间构造函数
DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) {
if (year >= 2000)
year -= 2000;
yOff = year;
m = month;
d = day;
hh = hour;
mm = min;
ss = sec;
}
最小示例:
DateTime tm = DateTime(2020, 2, 1, 0, 0, 0);
const PROGMEM uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
uint8_t month = tm.month();
uint8_t currentDaysInMonth = daysInMonth[month];
>> currentDaysInMonth Returns 61
>> expect 31 from this example, though would offset index - 1 once I figure out what the issue is.
打印日志:
std::cout << month << std::endl;
std::cout << tm.month() << std::endl;
std::cout << currentDaysInMonth << std::endl;
# >> 2
# >> 2
# >> 219 -- sometimes its 61, 45, 219, not sure the rhyme or reason to this value
我错误地认为我应该问这个作为一般 C++ 问题,后来意识到这个问题来自我在 Arduino 环境中使用 C++。在我的示例中,我没有在阵列上包含我对 Arduino 修改器 PROGMEM 的使用,该阵列将其存储从 RAM 移动到闪存,这最终导致了计算问题。访问 PROGMEM 数组需要我使用访问器方法 pgm_read_byte 而不是索引。
解决方案:
DateTime tm = DateTime(2020, 2, 1, 0, 0, 0);
const PROGMEM uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
uint8_t month = tm.month();
# use the pgm_read_byte accessor
uint8_t currentDaysInMonth = pgm_read_byte(&daysInMonth[month - 1]);
感谢大家的帮助!很抱歉最初缺乏信息。
部分资源:
https://www.arduino.cc/reference/tr/language/variables/utilities/progmem/
https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html
编辑:我错误地认为我应该问这个作为一般 C++ 问题,后来意识到这个问题来自我在 Arduino 环境中使用 C++。在我的示例中,我没有在阵列上使用 Arduino 修改器 PROGMEM
,这将其存储从 RAM 移动到 FLASH,这最终导致了计算问题。访问 PROGMEM 数组需要我使用访问器方法 pgm_read_byte
而不是索引。
我有一个数组:
const PROGMEM uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
我有一个来自时间库的功能计算 uint8:
uint8_t month = tm.month();
我有一个 size_t:
size_t monthIndex = (size_t)month;
我曾尝试使用 month
或 monthIndex
访问此数组中的值,但结果相同:
# For size_t monthIndex = 1 or uint8 month = 1; ...
uint8_t currentDaysInMonth = daysInMonth[monthIndex];
# >> Expected = 28;
# >> What I actually get = 61;
如何获得预期的数组值?
61从哪里来?
编辑
这是 tm
class DateTime {
public:
DateTime (uint16_t year, uint8_t month, uint8_t day,
uint8_t hour = 0, uint8_t min = 0, uint8_t sec = 0);
uint8_t month() const { return m; }
}
日期时间构造函数
DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) {
if (year >= 2000)
year -= 2000;
yOff = year;
m = month;
d = day;
hh = hour;
mm = min;
ss = sec;
}
最小示例:
DateTime tm = DateTime(2020, 2, 1, 0, 0, 0);
const PROGMEM uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
uint8_t month = tm.month();
uint8_t currentDaysInMonth = daysInMonth[month];
>> currentDaysInMonth Returns 61
>> expect 31 from this example, though would offset index - 1 once I figure out what the issue is.
打印日志:
std::cout << month << std::endl;
std::cout << tm.month() << std::endl;
std::cout << currentDaysInMonth << std::endl;
# >> 2
# >> 2
# >> 219 -- sometimes its 61, 45, 219, not sure the rhyme or reason to this value
我错误地认为我应该问这个作为一般 C++ 问题,后来意识到这个问题来自我在 Arduino 环境中使用 C++。在我的示例中,我没有在阵列上包含我对 Arduino 修改器 PROGMEM 的使用,该阵列将其存储从 RAM 移动到闪存,这最终导致了计算问题。访问 PROGMEM 数组需要我使用访问器方法 pgm_read_byte 而不是索引。
解决方案:
DateTime tm = DateTime(2020, 2, 1, 0, 0, 0);
const PROGMEM uint8_t daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
uint8_t month = tm.month();
# use the pgm_read_byte accessor
uint8_t currentDaysInMonth = pgm_read_byte(&daysInMonth[month - 1]);
感谢大家的帮助!很抱歉最初缺乏信息。
部分资源:
https://www.arduino.cc/reference/tr/language/variables/utilities/progmem/
https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html