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
。
因为你有语法错误,包括这个递归函数
我是 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
。
因为你有语法错误,包括这个递归函数