Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gestern liefs noch, heut Compilererror (https://www.delphipraxis.net/66237-gestern-liefs-noch-heut-compilererror.html)

Jelly 27. Mär 2006 08:38


Gestern liefs noch, heut Compilererror
 
Vielleicht ist es auch nur ein Montagmorgensyndrom:

Folgender Code liefert mir schon beim Kompilieren den Fehler "Konstantenausdruck verletzt untere Grenzen". Aber warum ? Ich verschieb doch nur ein paar Bits nach links.

Delphi-Quellcode:
procedure TMainForm.Button2Click(Sender: TObject);
var
  a: byte;
begin
     a := 53 shl 4 ;
end;

Luckie 27. Mär 2006 08:45

Re: Gestern liefs noch, heut Compilererror
 
Das Ergebnis ist 848 und jetzt über leg mal, ob das noch in den Datentyp Byte passt: ;)

freak4fun 27. Mär 2006 08:47

Re: Gestern liefs noch, heut Compilererror
 
Zitat:

Zitat von Luckie
Das Ergebnis ist 848 und jetzt über leg mal, ob das noch in den Datentyp Byte passt: ;)

Hm... Luckie war schneller.

Wie hast es dann gestern geschft? :shock:

MfG
freak

Jelly 27. Mär 2006 08:54

Re: Gestern liefs noch, heut Compilererror
 
Wieso ist das Ergebnis 848, wenn ich doch nur mit byte arbeite... Laut Delphi 2006 Onlinehilfe, ist das Ergebnis vom gleichen Typ wie x (x shl y). Also Bits die über den linken Rand hinausgehen werden wieder rechts angehängt...

Spiel ich mit byte-Variablen rum:
Delphi-Quellcode:
var
  a, b, c: byte;
begin
     a := 53 ;
     b := 4 ;
     c := a shl b ;
     //a := (b shl 4) or ((c shr 2) and $0F);
end;
gibts nen Fehler "Fehler bei Bereichsprüfung".

Der Code stammt aus der DCPCrypt Sammlung von David Barton, und ist aus der Base64Encode Prozedur.

Luckie 27. Mär 2006 08:59

Re: Gestern liefs noch, heut Compilererror
 
Wieso das Ergebnis 848 ist:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a: Integer;
begin
     a := 53 shl 4;
     ShowMessage(IntToStr(a));
end;
Weil es Delphi sagt. Mach aus Byte mal Integer und guck es dir an. Du verschiebst alle Bytes um 4 Stellen nach links:
Code:
0000 0001 shl 4 = 0000 1000 => 1 -> 8
Und jetzt mach das mal mit 53.

Schalt mal die Bereichsprüfung aus, dann kommt es zu einem Überlauf, der eventeull gewollt sein könnte. Hab eich bei Source von Hagen auch schon mal gesehen:

Delphi-Quellcode:
procedure RC4Init(var RC4: TRC4Context; const Key: String);
var
  R,S,T,K: Byte;
  U,L: Integer;
begin
{$R-}
{$Q-}
  L := Length(Key);
  with RC4 do
  begin
    I := 0;
    J := 0;
    for S := 0 to 255 do D[S] := S;
    R := 0;
    U := 0;
    for S := 0 to 255 do
    begin
      if U < L then K := PByteArray(Key)[U] else K := 0;
      Inc(U);
      if U >= L then U := 0;

      Inc(R, D[S] + K);
      T   := D[S];
      D[S] := D[R];
      D[R] := T;
    end;
  end;
end;
Mit R- wird die Bereichsprüfung ausgeschaltet, um den gewollten Überlauf bei Inc() zu ermöglichen.

xaromz 27. Mär 2006 09:01

Re: Gestern liefs noch, heut Compilererror
 
Hallo,
Zitat:

Zitat von Jelly
Also Bits die über den linken Rand hinausgehen werden wieder rechts angehängt...

Das hört sich mehr nach dem Befehl rol(Rotate left) an.

Gruß
xaromz

sakura 27. Mär 2006 09:02

Re: Gestern liefs noch, heut Compilererror
 
Zitat:

Zitat von Jelly
Wieso ist das Ergebnis 848, wenn ich doch nur mit byte arbeite... Laut Delphi 2006 Onlinehilfe, ist das Ergebnis vom gleichen Typ wie x (x shl y). Also Bits die über den linken Rand hinausgehen werden wieder rechts angehängt...

Ganz bestimmt nicht rechts wieder angehängt. Das wäre was ganz Neues ;-) ShL steht für SHIFT LEFT, nicht ROTATE LEFT. RoR und RoL gibt es nicht direkt (ohne Inline ASM).

...:cat:...

Jelly 27. Mär 2006 09:11

Re: Gestern liefs noch, heut Compilererror
 
Stimmt, mit dem Dranhängen hab ich mich vertan...

Aber wieso lief denn die Routine vorher? Werd mal versuchen mit Integern zu arbeiten.

Luckie 27. Mär 2006 09:18

Re: Gestern liefs noch, heut Compilererror
 
Zitat:

Zitat von Jelly
Aber wieso lief denn die Routine vorher? Werd mal versuchen mit Integern zu arbeiten.

Sie kann nur gelaufen sein, wenn die Bereichsprüfung deaktiviert war.

Jelly 28. Mär 2006 08:15

Re: Gestern liefs noch, heut Compilererror
 
Sorry für die späte Rückmeldung... Also die Deaktivierung der Bereichsprüfung hat auch nix gebracht. Ich kann mir das Problem nicht erklären.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz