Entwickler-Ecke

Sonstiges (Delphi) - Fehler bei For-Schleife


retnyg - Fr 27.05.05 17:51
Titel: Fehler bei For-Schleife
sonderbar:
ich möchte ne schleife die mir für alle werte von 0 - $FFFFFFFF eine funktion ausführt.
der compiler weigert sich aber, dies zu tun: setze ich nen breakpoint passiert gar nix (breakpoint wird grün)

Delphi-Quelltext
1:
2:
for zahl = low(typ) to high(typ) do
  ... tut nix

nehme ich die obere grenze shr 1 dann tut es, zumindest bei longword
woran liegt das ?

hier ne demo:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
program Project2;
{$APPTYPE CONSOLE}
uses windows, sysutils;
function isPotenzOfTwo(zahl: dword): boolean; register;
asm
   xor ecx, ecx
   cmp eax, 2
   jl @false
   @loop:
   cmp ecx, 32
   je @lookup
   sar eax, 1
   inc ecx
   jc @lookup
   jmp @loop
   @lookup:
   cmp eax, 0
   jg @false
   mov eax, 1
   jmp @out
   @false:
   xor eax, eax
   @out:
end;

  var zahl:integer;

begin
//  useinputoutput;
  for zahl := low(dword) to high(dword) shr 1 do // shr 1 wegmachen und nix geht mehr
  if isPotenzOfTwo(zahl) then begin
    writeln(inttostr(zahl));
  end;
  readln;
end.


TomT - So 29.05.05 12:27

Machs doch einfach direkt so:


Delphi-Quelltext
1:
2:
for i:= 0 to $FFFFFFFF do
  bla;


mfg TomT


uall@ogc - So 29.05.05 13:17

du kannst nur bis maximal

$7FFFFFFF
bzw high(dword) div 2
bzw high(integer)

machen
alles andere ist ein "Überlauf bei Konvertierung oder arithmetischer Operation"

das liegt daran das ne for schleife mit nem JNZ geprüft wird und > $80000000 ist ja alles negativ
da die CPU immer mit integeer und nicht dword rechnet


TomT - So 29.05.05 16:48

user profile iconuall@ogc hat folgendes geschrieben:

das liegt daran das ne for schleife mit nem JNZ geprüft wird und > $80000000 ist ja alles negativ
da die CPU immer mit integeer und nicht dword rechnet


Selbst, wenn meine Zählervariable von einem vorzeichenlosen Typ ist?
Tät mich etwas wundern. In dem Fall könnte könnte ich ja die hälfte des Wertebereichs gar nicht werwenden.