我有一个名为SensorNode的类,它包含(除其他外(传感器对象的链表。 节点有一个数据成员,用于表示剩余的电池电量,每个传感器都有一个数据成员,用于表示它们消耗的电量。 我有一个名为processTimeClick的函数,它应该遍历节点中传感器的整个链表,并从节点剩余的电池中减去它们使用的电量。 不幸的是,我收到"错误,错误的访问代码",我不知道为什么。 这是我的功能,我希望有人能看到我的逻辑错误在哪里。
void SensorNode::processTimeClick() {
if (batt == 0) {
}
else {
temp = mySensors;
do {
if (batt <=0) {
cout << "nThis node has run out of batteryn";
func = 0;
break;
}
batt = (batt - (temp->SensEl->getPC()));
temp = temp->LLelement;
} while (temp->LLelement != NULL); //My code stops here and says "Thread 1:EXC_BAD_ACCESS (code=1, address=0x0)
}
}
为了便于理解:temp 和 mySensors 都是类型为"SensorBlock"(链表对象(的指针(在 SensorNode 类中声明(。batt 是 SnesorNode 类中的浮点数据成员。
下面是 SensorBlock 类的声明:
class SensorBlock {
friend class SensorNode;
SensorBlock * LLelement;
sensor * SensEl;
SensorBlock(sensor* senspoint);
};
SensorBlock::SensorBlock(sensor* senspoint) {
SensEl = senspoint;
LLelement = NULL;
}
感谢您的帮助!
我认为您希望您的循环看起来更像这样:
while (temp) {
if (batt <=0) {
cout << "nThis node has run out of batteryn";
func = 0;
break;
}
batt = (batt - (temp->SensEl->getPC()));
temp = temp->LLelement;
}
这样,在尝试使用它之前,会检查temp
以确保它不为 null。
如果你有一个这样的循环:
do {
// use temp
temp = temp->LLelement;
} while (temp->LLelement);
它相当于
beginning_of_loop:
// use temp -- oops it might be null!
temp = temp->LLelement;
// temp might be null here
if (temp->LLelement) goto beginning_of_loop;
如果你把 while 放在顶部,它相当于这个:
beginning_of_loop:
if (!temp) goto end_of_loop:
// use temp -- can't be null
temp = temp->LLelement;
// temp might be null here, but we aren't using it
goto beginning_of_loop;
end_of_loop: