我正在Karel编写一个程序,这基本上是Pascal Plus Motion命令的Fanuc机器人。我的代码有效,包括使用for循环进行200次循环。
现在我想添加一个排除列表,因此在伪代码中"除非我在排除列表中,否则i = 1至200
列表是:"整数的数组排除[5]" 我的代码是:
for I=1 to 200 DO
FOR j =1 TO 5 DO
IF exclude[j]=i THEN
GO TO end_it
ENDFOR
bunch of code
endit::
ENDFOR
现在,我知道为什么我会得到堆栈溢出,我跳出来循环。但是,我无法想出如何解决问题的方法。我可以单独检查数组的5个成员,但是我试图使我的代码保持简短而甜美,尤其是因为我有第二个(第三个(循环,我必须再次添加同一件事。
任何帮助将不胜感激!
GoTo()
语句通常被视为所有邪恶的根源。这似乎是一件方便的事情,但它会产生比任何人都需要解决的问题更多的问题。的确,第一件事也是在这里摆脱它。
某些Pascal版本中的一种可能性是BREAK
语句,即脱离循环。如果 karel 不支持,即使可以使用,我认为最好使用另一种循环。您可以改用REPEAT .. UNTIL condition
循环,该循环本质上规定了从循环中有序退出,如下所示:
for I=1 to 200 DO
Excluded := False
j := 0
REPEAT
J := J + 1
IF exclude[j]=i THEN
Excluded := True
UNTIL (J = 5) or Excluded
if not excluded then
begin
bunch of code
end
ENDFOR
这使您可以在exclude[]
数组中找到匹配时立即退出REPEAT UNTIL
循环。然后测试新的Excluded: boolean
变量,您知道是否运行bunch of code
。
ps。我的代码示例使用了部分Delphi Pascal语法,希望您可以确定它。
PS2。仅通过纯粹的好奇心,我下载了一份手册,KAREL Reference Manual v. 6.3.1
,看着A.6.3 FOR...ENDFOR Statement
的一颗子弹说:永远不要在循环中发表语句。如果转到语句导致该程序退出for循环,则该程序可能会被"运行时间堆栈溢出"错误中止。,我想您也会在其他情况下受益。
PS3。还要查看上述手册第4.2.2段,它也描述了第三种循环-WHILE...ENDWHILE
。
汤姆对"去"是正确的。应该不惜一切代价避免。
如果我正确理解...这是一个简单的解决方案,但实际上不是优雅:
FOR i=1 to 200 DO
FOR j =1 TO 5 DO
IF exclude[j]=i THEN
-- DO nothing, but if you want to break here just set j= 5
ELSE
-- DO a bunch of things here
ENDIF
ENDFOR
ENDFOR