为什么这个程序Free pascal 能执行,Free pascal for NOI 就不能执行?

typetreetype=recorddata:char;ftr:integer;lch:integer;rch:integer;end;vartree:array[1.... type treetype=record
data:char;
ftr:integer;
lch:integer;
rch:integer;
end;
var
tree:array[1..100] of treetype;
i:integer;

procedure readtree(a:integer);
var temp:char;
lch:integer;
rch:integer;
ftr:integer;
begin
if a=0 then exit;
readln(temp);
lch:=tree[a].lch;
rch:=tree[a].rch;
ftr:=tree[a].ftr;
tree[a].data:=temp;

if temp<>'#' then
begin
* if (lch=0) and (tree[lch].data<>'#') then ********************
begin inc(i); tree[a].lch:=i; tree[i].ftr:=a; readtree(i); end
else if (rch=0) and (tree[rch].data<>'#') then begin inc(i); tree[a].rch:=i; tree[i].ftr:=a; readtree(i) end
else readtree(ftr);
end;
end;

begin//prog

i:=1;
fillchar(tree,sizeof(tree),0);
readtree(1);
end.

有星号哪一行,在Free pascal for NOI我用F7跟踪的时候输入的数据是'a' 到(tree[lch].data<>'#')这一句就出现错误201,用free pascal 2.0 就可以执行?

谢谢帮忙了~~!!
展开
 我来答
siegetank2008
2009-08-18 · TA获得超过236个赞
知道小有建树答主
回答量:193
采纳率:0%
帮助的人:0
展开全部
201 是因为调用了tree[0].data而你的程序定义的tree是从1开始的
这个可能跟编译器的版本有关
有些是从左到右判断布尔表达式并且一旦有可以确定表达式真伪的条件出现便不再继续比如你写的lch=0时有些编译器就不会执行tree[lch].data<>'#'
但是有的会完整的对布尔表达式作检查
那么避免这个问题的方法是做如下之一的改动
1\if <语句> then if <语句>...这样来做多个条件且互为前提的逻辑判断
2\将tree从0开始定义(不一定符合算法要求)
dk647
2009-08-19 · TA获得超过238个赞
知道小有建树答主
回答量:161
采纳率:0%
帮助的人:159万
展开全部
理论上不应该出现你说的问题,因为无论如何都会执行tree[0]的。

有几个特性可以补充下,也许对你有用。
and在判断时是从左到右的,所以当lch=0时才会判断tree[lch]也就是tree[0],而你的定义tree[1..100].不包含0,所以201(范围检查错)是正确的。
但是free pascal有个特性就是“表达式执行的顺序是不确定的。”所以lch=0可以在tree[lch]<>'#'之后执行。

但,即便如此,fp也应该提示201,这只能说明你的fp安装错误,或是编译器本身的问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
GhostSaddam
2009-08-18 · 超过14用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:59.4万
展开全部
201是范围检查错误
NOI是默认范围检查开关关闭的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式