![]() |
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; |
Re: Gestern liefs noch, heut Compilererror
Das Ergebnis ist 848 und jetzt über leg mal, ob das noch in den Datentyp Byte passt: ;)
|
Re: Gestern liefs noch, heut Compilererror
Zitat:
Wie hast es dann gestern geschft? :shock: MfG freak |
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:
gibts nen Fehler "Fehler bei Bereichsprüfung".
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; Der Code stammt aus der DCPCrypt Sammlung von David Barton, und ist aus der Base64Encode Prozedur. |
Re: Gestern liefs noch, heut Compilererror
Wieso das Ergebnis 848 ist:
Delphi-Quellcode:
Weil es Delphi sagt. Mach aus Byte mal Integer und guck es dir an. Du verschiebst alle Bytes um 4 Stellen nach links:
procedure TForm1.Button1Click(Sender: TObject);
var a: Integer; begin a := 53 shl 4; ShowMessage(IntToStr(a)); end;
Code:
Und jetzt mach das mal mit 53.
0000 0001 shl 4 = 0000 1000 => 1 -> 8
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:
Mit R- wird die Bereichsprüfung ausgeschaltet, um den gewollten Überlauf bei Inc() zu ermöglichen.
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; |
Re: Gestern liefs noch, heut Compilererror
Hallo,
Zitat:
Gruß xaromz |
Re: Gestern liefs noch, heut Compilererror
Zitat:
...:cat:... |
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. |
Re: Gestern liefs noch, heut Compilererror
Zitat:
|
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