delphi case语句似乎不能够使用break跳出?如何快速赋值二维数组
请先看测试代码
const
  COUNT = 77483646;
var
  arr: array of array of LongInt;
  i, j: LongInt;
  st1, st2: LongInt;
begin
  SetLength(arr, 10, COUNT div 10);
  st1 := GetTickCount;
  for i:=0 to 10-1 do
    for j:=0 to (COUNT div 10)-1 do
    begin
      arr[i][j] := i*1000000+j;
    end;
//  Writeln(Format('%d %d %d %d %d %d %d %d %d %d ',[arr[0][1],arr[1][1],arr[2][1],arr[3][1],arr[4][1],arr[5][1],arr[6][1],arr[7][1],arr[8][1],arr[9][1]]));
  Writeln(Format('%d %d %d %d %d %d %d %d %d %d ',[arr[0][7748364],arr[1][774836],arr[2][77483],arr[3][7748],arr[4][774],arr[5][77],arr[6][7],arr[7][7483646],arr[8][483646],arr[9][83646]]));
  arr := nil;
  SetLength(arr, 10, COUNT div 10);
  Writeln(Format('%d',[gettickcount-st1]));
  st2 := GetTickCount;
  for j:=0 to COUNT-1 do
  begin
    i := j div 10;
    case j mod 10 of            
//      0: begin arr[0][i] := 0*1000000 + i; Break; end;
//      1: begin arr[1][i] := 1*1000000 + i; Break; end;
//      2: begin arr[2][i] := 2*1000000 + i; Break; end;
//      3: begin arr[3][i] := 3*1000000 + i; Break; end;
//      4: begin arr[4][i] := 4*1000000 + i; Break; end;
//      5: begin arr[5][i] := 5*1000000 + i; Break; end;
//      6: begin arr[6][i] := 6*1000000 + i; Break; end;
//      7: begin arr[7][i] := 7*1000000 + i; Break; end;
//      8: begin arr[8][i] := 8*1000000 + i; Break; end;
//      9: begin arr[9][i] := 9*1000000 + i; Break; end;
      0: begin arr[0][i] := 0*1000000 + i; end;
      1: begin arr[1][i] := 1*1000000 + i; end;
      2: begin arr[2][i] := 2*1000000 + i; end;
      3: begin arr[3][i] := 3*1000000 + i; end;
      4: begin arr[4][i] := 4*1000000 + i; end;
      5: begin arr[5][i] := 5*1000000 + i; end;
      6: begin arr[6][i] := 6*1000000 + i; end;
      7: begin arr[7][i] := 7*1000000 + i; end;
      8: begin arr[8][i] := 8*1000000 + i; end;
      9: begin arr[9][i] := 9*1000000 + i; end;
    end;
  end;
  Writeln(Format('%d %d %d %d %d %d %d %d %d %d ',[arr[0][7748364],arr[1][774836],arr[2][77483],arr[3][7748],arr[4][774],arr[5][77],arr[6][7],arr[7][7483646],arr[8][483646],arr[9][83646]]));
  Writeln(Format('%d',[gettickcount-st2]));
  arr:=nil;
end;写出这段代码我原意是想看看在初始化一个大二维数组的时候用2重for循环(简称for)和用1重for循环+case(简称case)哪个快.
我刚开始想的是case方法只用遍历一遍这个二维数组,而使用for方法需要遍历多遍,应该是case方法比较快.结果实际测试for方法速度远快于case方法.
然后我猜测是不是case循环没有加break的原因.在加上break后另一个问题出现了.实际上case循环中不管条件是什么每次都在条件0的情况下break了,而不是通常想象的满足条件0,执行0后的语句,然后break.不满足条件0,就往下.我就搞不懂了.
请高手讲讲1.如何快速赋值给一个大二维数组(用做缓冲区,确实有这个需求);2.深入说说delphi中case语句的用法.
谢谢了~~

解决方案 »

  1.   

    哈哈,有意思。Delphi的case和c语言的switch不一样,case语句会根据条件的值选择一条语句执行。另外,你用break实际上是跳出了for循环(第一次执行的时候取模为0,就直接退出)。结论就是,在delphi里面,动态初始化多维数组一般只能用多重for语句(多维动态数组的内存还是不连续的)。
      

  2.   

    就目前的代码实现的功能来看, 完全没必要使用case语句:var
      ......
      i, j, k: Longint;
      ......
    begin
      ......
      for j:=0 to COUNT-1 do 
      begin 
        i := j div 10; 
        k := j mod 10;
        arr[k][i] := k * 1000000 + i;
      end; 
      ......
      

  3.   

    我记得delphi的case本来就不要用break的。
      

  4.   

    谢谢~~看来多维数组赋值目前比较好的办法就是用for循环了.
    感谢jadeluo 一语点醒梦中人,看来还是经验不足,需要苦练内功了.
    另:看以前的帖子好多人都以为可以用break中断case语句,实际上delphi中case不能用break中断,标记提醒.
      

  5.   

    是的,C++用break是因为没有delphi的end
      

  6.   

    替换delphi的 begin..end;也不是不可以,就可以用break 了