Arduino中是否存在可直接访问数组与JsonArray最后一个元素的函数?
Arduino开发中获取JsonArray最后一个元素的实现方案
现有代码问题说明
你当前计算数组长度的逻辑存在错误:
JsonArray是ArduinoJson库封装的动态容器类,不是原生C语言数组,使用sizeof(Time_hours) / sizeof(int)得到的是类对象的内存占用大小,和数组实际存储的元素个数无关,必须调用JsonArray自带的size()方法获取实际元素数量。
实现类似Python a[-1]访问效果的方法
通用兼容方案(适用于所有ArduinoJson版本)
只要数组非空,取下标为数组长度 - 1的元素即为最后一个元素,示例如下:
JsonArray Time_hours = doc["Time"]["hours"]; JsonArray Time_min = doc["Time"]["min"]; // 操作前先校验数组有效性、长度一致且非空,避免越界崩溃 if (Time_hours.isNull() || Time_min.isNull() || Time_hours.size() != Time_min.size() || Time_hours.size() == 0) { return; } // 获取最后一个元素 int last_hour = Time_hours[Time_hours.size() - 1]; int last_min = Time_min[Time_min.size() - 1];
极简方案(仅适用于ArduinoJson 6及以上版本)
ArduinoJson 6+版本原生支持负索引语法,可直接用Time_hours[-1]访问最后一个元素,和Python用法完全一致,仅需提前确认数组非空即可。
适配你的业务逻辑的修正代码
如果你只需要判断最后一组时间是否匹配,不需要遍历全数组:
JsonArray Time_hours = doc["Time"]["hours"]; JsonArray Time_min = doc["Time"]["min"]; if (Time_hours.isNull() || Time_min.isNull() || Time_hours.size() != Time_min.size() || Time_hours.size() == 0) { return; } if (now.hour() == Time_hours[-1] && now.minute() == Time_min[-1]) { ring_bell(1); }
如果你需要遍历所有时间点做判断,修正后的遍历代码如下:
JsonArray Time_hours = doc["Time"]["hours"]; JsonArray Time_min = doc["Time"]["min"]; if (Time_hours.isNull() || Time_min.isNull() || Time_hours.size() != Time_min.size()) { return; } int arr_len = Time_hours.size(); // 注意数组下标从0开始,原代码i=1会漏掉第一个元素 for(int i = 0; i < arr_len ;i++){ if(now.hour() == Time_hours[i] && now.minute() == Time_min[i]) { ring_bell(1); } }
内容的提问来源于stack exchange,提问作者saud
相关产品推荐
相关产品推荐

