我不熟悉RobotC或VEX,但是我注意到一定数量的复制操作可以用到自己的函数中。
以下代码片段我将分成几个函数。因此,在称为电机的大型功能中,您可以进行以下操作:
int x = 1; while (x < 3) { SensorValue[LED3] = 1; wait(0.5); SensorValue[LED3] = 0; wait(0.5); } callup[2] = 0; main ();
重复此值略有不同。
在这里,我将编写如下函数:
void adjust_sensors( size_t led, size_t level ) { int x = 1; while (x < 3) { SensorValue[led] = 1; wait(0.5); SensorValue[led] = 0; wait(0.5); } callup[level] = 0; main (); }
您也可以对以下代码执行相同操作:
startMotor(mainMotor, 60); untilTouch(limit3); stopMotor(mainMotor); callup[2] = 0; wait(1); main ();
似乎while循环永远不会结束,因为x的值永远不会改变。
当您声明时,您还会在顶部输入错误:
int callown [2];
我认为你的意思是:
int calldown [2];
为了清晰起见,也可以在代码中添加一些注释。
希望这可以帮助。
我可能会离开,因为我只是一个有自己问题的学生,但看起来你可能在你的数组大小上犯了一个错误。例如,当您声明:
int floorat[2];
这使得数组大小为2.然后引用此数组[0,1,2]中的3个元素位置。此外,您不能只使用常规整数,并为其赋值1,2或3?
我建议重新定义这些变量:
int callup; int calldown; int floorat;
然后你可以避免额外的代码行并简化if / else子句:
if (SensorValue[limit1] == 1) { floorat = 1; } if (SensorValue[limit2] == 1) { floorat = 2; } if (SensorValue[limit3] == 1) { floorat = 3; }
让我们来定义一个特定时刻电梯的状态:
电梯可以去 的 向上 强> , 的 下 强> 或者是 的 闲 强> 。
电梯是给定的 的 地板 强> 当它触发开关时从一层到另一层:
现在,如果我们将其转换为一些伪代码(应该很容易翻译成 RobotC ):
RobotC
enum elevator_status = { idle, down, up }; int currentfloor; //1, 2, 3 switch(elevator_status) { case idle: //we check if a button is pressed and possibly go up or down if(SensorValue(floor1)) { if(currentfloor > 1) elevator_status = down; } else if(SensorValue(floor2)) { if(currentfloor > 2) elevator_status = down; else if(currentfloor < 2) elevator_status = up; } else if(SensorValue(floor3)) { if(currentfloor < 3) elevator_status = up; } break; case up: case down: //we check if we trigger a floor switch and stop the elevator if(SensorValue(limit1)) { currentfloor = 1; elevator_status = idle; } else if(SensorValue(limit2)) { currentfloor = 2; elevator_status = idle; } else if(SensorValue(limit3)) { currentfloor = 3; elevator_status = idle; } break; } //we set the speed of the motor if(elevator_status == up) { set_motorstate(cw); ) else if(elevator_status == down) { set_motorstate(ccw); } else if(elevator_status == idle) { set_motorstate(idle); }
注意:在此代码中,电梯只在电梯空闲时处理新的上下楼层呼叫。它在移动时不会存储上下呼叫,而是稍后再去。我不知道这是否是你的要求。