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语句的用法.
谢谢了~~
请先看测试代码
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语句的用法.
谢谢了~~
解决方案 »
- ZLib组件问题:Could not compile used unit 'ZLib.pas'
- dbgrid如何导出到TXT文件?
- 在DBGrid中怎么让指针指向的一条记录背景色变成指定的颜色呢?
- 谁能提供C++Builder(或Delphi)的矢量绘图原代码或相关资源,高分相送!
- asp网上书店的设计与数据库怎么连接???
- 如何使表的记录和treenode 一一对应?
- 请问在DEPHI中怎样实现文本文件导入导出SQL SERVER数据库?
- 讀取txt檔裡的資料,並將資料放到矩陣中
- 请教:TEDIT控件的属性里 TabOrder 的功能作用是什么呢?
- 简单问题.关于Box
- 开始打捞最old的帖子了 嘿嘿
- 最近升级IE浏览器怎么都升级不了,不怎么什么原因????
......
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;
......
感谢jadeluo 一语点醒梦中人,看来还是经验不足,需要苦练内功了.
另:看以前的帖子好多人都以为可以用break中断case语句,实际上delphi中case不能用break中断,标记提醒.