关于FOR语句的一个奇怪的现象,请进
for m := 1 to 35 do
if bnum[m] = bnum[m+1] then astr := astr + ',' + inttostr(anum[m])
else astr := astr + chr(13) + chr(10) + inttostr(bnum[m]) + ':' + inttostr(anum[m]);
这样一条语句,我逐句观察的时候,发现m是从35往1走得,睡知道怎么回事?
另外,在这段程序外,不能对m进行赋值,即使赋了,也不提示错,但运行中空过此行?
问题点数:20、回复次数:10Top
1 楼ssoj(超超型英帅靓正)回复于 2004-05-02 17:53:54 得分 0
不可能啊,从这一句语法是没有错误啊?
可能是不是你别的地方定义错了啊?
最大的可以是bnum[x]和anum[x]的附值顺序错了.Top
2 楼F10()回复于 2004-05-02 17:59:52 得分 0
即使我在前面加一条m:=0;也不行,根本不执行,而且也不报错。见鬼了呀Top
3 楼YFLK(远方来客)回复于 2004-05-02 18:16:12 得分 20
如你所说,可能是anum[]中存放的数据顺序反了,
在循环过程中是不能对循环变量进行赋值的,在循环体外,m就不时循环变量了,这时可对其赋值.为什么会出现你所说的情况要看代码啦.Top
4 楼YFLK(远方来客)回复于 2004-05-02 18:17:59 得分 0
你设置了编译优化Top
5 楼F10()回复于 2004-05-02 18:39:45 得分 0
什么意思??Top
6 楼capoatguitar(菠萝蜜汁红塔山)回复于 2004-05-02 18:54:18 得分 0
这个满有趣的,学习。Top
7 楼ctx(ctx62)回复于 2004-05-02 19:05:05 得分 0
在For循环中不允许改变m的值,这是object pascal的规定Top
8 楼F10()回复于 2004-05-02 19:07:38 得分 0
快晕了,我把这段代码单独放到一段里,还是不行。
procedure TForm8.Button10Click(Sender: TObject);
var
astr : string;
i,j,m,a1,b1 : integer;
aNum, bNum : array [1..36] of integer;
begin
astr := '';
for i := 1 to 36 do begin aNum[i] := strtoint(StringGrid1.cells[i, StringGrid1.RowCount-5]); bNum[i] := i; end;
for i := 1 to 35 do
&&&&&&&&&&&&&&
for j := i + 1 to 36 do
&&&&&&&&&&&&&&
if aNum[i] > aNum[j] then
begin
a1 := aNum[i]; aNum[i] := aNum[j]; aNum[j] := a1;
b1 := bNum[i]; bNum[i] := bNum[j]; bNum[j] := b1;
end;
astr := inttostr(anum[1])+ ':' + inttostr(bnum[1]) ;
********
for m := 1 to 35 do
if bnum[m] <> bnum[m+1] then astr := astr + chr(13) + chr(10) + inttostr(anum[m+1])+ ':' + inttostr(bnum[m+1]) else astr := astr + ',' + inttostr(anum[m+1]);
********
memo1.Lines.Add(astr);
end;
就是在********之间的代码出现了上面的问题,另外,如果把&&&&&&&&&&&&&&之间的for j := i + 1 to 36 do 换成j := 2 to 36 do也会出现类似的问题,究竟怎么回事呀?Top
9 楼hewei2003(为为)回复于 2004-05-02 19:11:45 得分 0
你测试一下downto呢?Top
10 楼F10()回复于 2004-05-02 19:18:07 得分 0
谢谢大家,已经好了,我重新启动了机器,再编译的时候就没有上面的现象了。Top




