为什么这个程序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 就可以执行?
谢谢帮忙了~~!! 展开
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 就可以执行?
谢谢帮忙了~~!! 展开
3个回答
展开全部
201 是因为调用了tree[0].data而你的程序定义的tree是从1开始的
这个可能跟编译器的版本有关
有些是从左到右判断布尔表达式并且一旦有可以确定表达式真伪的条件出现便不再继续比如你写的lch=0时有些编译器就不会执行tree[lch].data<>'#'
但是有的会完整的对布尔表达式作检查
那么避免这个问题的方法是做如下之一的改动
1\if <语句> then if <语句>...这样来做多个条件且互为前提的逻辑判断
2\将tree从0开始定义(不一定符合算法要求)
这个可能跟编译器的版本有关
有些是从左到右判断布尔表达式并且一旦有可以确定表达式真伪的条件出现便不再继续比如你写的lch=0时有些编译器就不会执行tree[lch].data<>'#'
但是有的会完整的对布尔表达式作检查
那么避免这个问题的方法是做如下之一的改动
1\if <语句> then if <语句>...这样来做多个条件且互为前提的逻辑判断
2\将tree从0开始定义(不一定符合算法要求)
展开全部
理论上不应该出现你说的问题,因为无论如何都会执行tree[0]的。
有几个特性可以补充下,也许对你有用。
and在判断时是从左到右的,所以当lch=0时才会判断tree[lch]也就是tree[0],而你的定义tree[1..100].不包含0,所以201(范围检查错)是正确的。
但是free pascal有个特性就是“表达式执行的顺序是不确定的。”所以lch=0可以在tree[lch]<>'#'之后执行。
但,即便如此,fp也应该提示201,这只能说明你的fp安装错误,或是编译器本身的问题。
有几个特性可以补充下,也许对你有用。
and在判断时是从左到右的,所以当lch=0时才会判断tree[lch]也就是tree[0],而你的定义tree[1..100].不包含0,所以201(范围检查错)是正确的。
但是free pascal有个特性就是“表达式执行的顺序是不确定的。”所以lch=0可以在tree[lch]<>'#'之后执行。
但,即便如此,fp也应该提示201,这只能说明你的fp安装错误,或是编译器本身的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
201是范围检查错误
NOI是默认范围检查开关关闭的
NOI是默认范围检查开关关闭的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询