var i, j, k : DWORD; begin j:= 0; k:= GetTickCount(); for i:=0 to J-1 do begin // 哈哈,成了一个死循环,大家以后小心啊! end; ShowMessage(IntToStr(GetTickCount()-k)); end;我的11466ms 就出来接过了
我在win2000+delphi6的c400机子下程序死翘了
DWORD类型 是pazee(耙子)说的正确
procedure TForm1.Button1Click(Sender: TObject); var i,j:DWord; begin j:=0; ShowMessage(inttostr(j-1)); //看看 j-1 是几吧。4294967295($FFFFFFFF) exit; for i:=0 to j-1 do begin Caption:=IntToStr(i); refresh; end;
告楼上各位: var i,j:DWord; 请把DWord换成Integer再看看会有什么情况?也许delphi并没有错,可是如果是C ,for (i=0;i<(j-1);i++ )会有这种情况吗!!!我只知道在这种情况下,我不需要计算机把j-1换成4294967295。在运行期间,你无法保证(j-1)不是负数,可一旦它是负数,你就不可能得到你想要得结果。所以提醒大家,用for循环的时候一定要检查一下循环变量是否正确(如果你用Delphi)欢迎继续讨论!
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } function GetDWORD(const A: DWORD): DWORD; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}function TForm1.GetDWORD(const A: DWORD): DWORD; asm MOV EAX, A // 调式时,看看 A 的值就知道了! end;procedure TForm1.Button1Click(Sender: TObject); var j: DWORD; begin j := 0; ShowMessage(IntToStr(GetDWORD(J - 1))); end;end.
这样的时候太多了!
很简单的:
for i:=0 to ListBox1.Items.Count-1 do
...
经常ListBox1.Items.Count是0 啊。
这不算是个bug,本身就是个常理
你有这么设计吗??
如果你认为**.count-1<0时,你应该去避免这个错误,不是交给IDE去处理
我想没有升级也不应该有错,如果有这种问题delphi也太弱了
也是就说
j :DWORD;
j=0;
j-1 <> -1,而是等于-1的补码,等于 $FFFFFFFF,是最大的32位整数。我看了Delphi 6汇编出来的代码,证实了这个说法,而且我的电脑(C3 1.0G)也很快循环完了。
i, j, k : DWORD;
begin
j:= 0;
k:= GetTickCount();
for i:=0 to J-1 do
begin
// 哈哈,成了一个死循环,大家以后小心啊!
end;
ShowMessage(IntToStr(GetTickCount()-k));
end;我的11466ms 就出来接过了
是pazee(耙子)说的正确
var
i,j:DWord;
begin
j:=0;
ShowMessage(inttostr(j-1)); //看看 j-1 是几吧。4294967295($FFFFFFFF)
exit; for i:=0 to j-1 do
begin
Caption:=IntToStr(i);
refresh;
end;
var
i,j:DWord;
请把DWord换成Integer再看看会有什么情况?也许delphi并没有错,可是如果是C ,for (i=0;i<(j-1);i++ )会有这种情况吗!!!我只知道在这种情况下,我不需要计算机把j-1换成4294967295。在运行期间,你无法保证(j-1)不是负数,可一旦它是负数,你就不可能得到你想要得结果。所以提醒大家,用for循环的时候一定要检查一下循环变量是否正确(如果你用Delphi)欢迎继续讨论!
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function GetDWORD(const A: DWORD): DWORD;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function TForm1.GetDWORD(const A: DWORD): DWORD;
asm
MOV EAX, A // 调式时,看看 A 的值就知道了!
end;procedure TForm1.Button1Click(Sender: TObject);
var
j: DWORD;
begin
j := 0;
ShowMessage(IntToStr(GetDWORD(J - 1)));
end;end.
这和Delphi 完全没关系。这能说你是编程序的逻辑存在问题,属于人的问题。上学的时候有门功课就是计算机算法,讲人的逻辑转换为计算语言的时候需要注意的问题,你这个都是非常简单的例子。每个语言都有自己的特点特色,不能简单的把两种语言比较。Pascal的 运算优先级还和C有非常大差别呢,你能说pascal的不对。
for 循环的初值和终值的数据类型,在比较时都会转换为相应的循环变量的类型。
你的例子中,i 是 DWORD,所以它不可能有负值。
如果 i 是 Integer,j 仍为 DWORD,则会把 j 的值转换为 Integer,同样是 $FFFFFFFF,DWORD 的值是 4294967295,Integer 的值是 -1。另外,对于 for 语句来说,它的初值和终值是在进入 for 语句时就固定了,不会因为循环中对 j 的改变而影响循环次数。
j = 0;
for(i=0; i<(unsigned int)(j-1); i++);
//或for(i=0; i<unsigned(j-1); i++);
你应该这样试试很多时候C中灵活的类型转换可以被滥用并不是好事?