C ++ int成员自行更改

c++ int member changes on its own

我是 C++ 新手。 看起来成员变量 _scheduleSize 无缘无故地获得了 "integer_half_max" 的值。有人可以解释一下为什么会这样吗?

调用

   leds.addSchedulePoint(new ScheduledLedPoint(ScheduleTime(9), 0));

方法:

void ScheduledLeds::addSchedulePoint(ScheduledLedPoint *schedulePoint) {
  Serial.print("_scheduleSize:");
  Serial.println(_scheduleSize);

  _schedule[_scheduleSize++] = schedulePoint;

  Serial.print("_scheduleSize:");
  Serial.println(_scheduleSize);

  for (size_t i = 0; i < _scheduleSize; i++) {
    Serial.println(_schedule[i]->getLevel());
  }
}

这样的控制台输出结果:

_scheduleSize:0
_scheduleSize:1073680860
0

Exception (28):
epc1=0x40206514 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000010 depc=0x00000000

下面你可以看到整个class:

class ScheduledLeds {
    public:
        ScheduledLeds(int pin);
        void addSchedulePoint(ScheduledLedPoint *schedulePoint);
        void process(ScheduleTime currentTime);
        void freezeLedLevel(int targetLevel, int minutes);
        int _pin;
    private:
        ScheduledLedPoint *_schedule[];
        int _scheduleSize;
        int _count;
        int _size;
        long _unfreezeTime;
        int _lastLevel;
        ScheduleTime _lastTime;
        void setTransitionalLightLevel(ScheduleTime now, ScheduledLedPoint nextPoint);
        void setLightLevel(int targetLevel);
};

ScheduledLeds::ScheduledLeds(int pin) {
  pinMode(pin, OUTPUT);
  _pin = pin;
  _scheduleSize = 0;
  _size = 10;
  _unfreezeTime = millis();
  ScheduledLedPoint *_schedule[_size];
}

void ScheduledLeds::addSchedulePoint(ScheduledLedPoint *schedulePoint) {
  Serial.print("_scheduleSize:");
  Serial.println(_scheduleSize);

  _schedule[_scheduleSize++] = schedulePoint;

  Serial.print("_scheduleSize:");
  Serial.println(_scheduleSize);

  for (size_t i = 0; i < _scheduleSize; i++) {
    Serial.println(_schedule[i]->getLevel());
  }
}

ScheduledLedPoint *_schedule[]; 不是有效的 C++,不应编译。一些编译器接受它作为扩展——但即使在那里,它也是一个零大小的数组; _schedule[x]x 的任何值表现出未定义的行为。

当您在构造函数中编写 ScheduledLedPoint *_schedule[_size] 时,这不会影响名为 _schedule 的数据成员,正如您似乎相信的那样。相反,它创建并立即销毁一个局部变量,该变量也恰好被命名为 _schedule;这完全是零净效应。

对于可变大小的 array-like 数据结构,使用 std::vector

因为你有语法错误,包括这个递归函数