【问题标题】:c++ int member changes on its ownc ++ int成员自行更改
【发布时间】:2018-03-27 12:33:40
【问题描述】:

我是 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 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());
  }
}

【问题讨论】:

  • 欢迎。当发布关于为什么某些东西不起作用的问题时,您应该始终包含minimal reproducible example - 生成此问题的过程通常会帮助您自己解决问题,但如果没有,欢迎您在此处发布。
  • 你应该避免new,改用智能指针。
  • ScheduledLedPoint *_schedule[_size]; 是一个局部变量。使用std::vector
  • 此代码适用于 arduino,因此 std::vector 不是这里的情况。

标签: c++ class member


【解决方案1】:

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

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

对于可变大小的类数组数据结构,请使用std::vector

【讨论】:

  • 此代码适用于 arduino,因此 std::vector 不是这里的情况。还是不明白为什么_scheduleSize 价值10.7亿?
  • 您正在写超出数组的末尾。 _scheduleSize 恰好位于数组之后的内存中,并被随机垃圾所破坏。实际上,您正在做_scheduleSize = reinterpret_cast&lt;int&gt;(schedulePoint)
【解决方案2】:

因为你有包含这个递归函数的语法错误

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 2018-08-11
    • 2012-12-15
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多