为什么我不能使用函数计算的 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;

我曾尝试使用 monthmonthIndex 访问此数组中的值,但结果相同:

# 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