Einzelnen Beitrag anzeigen

ma2xx

Registriert seit: 25. Nov 2005
22 Beiträge
 
#9

Re: UInt64 Typ-Problem bei Vorgabewerten

  Alt 24. Apr 2009, 13:14
Für die Übergabe von Strings in Hex-Darstellung genügt es, wenn man die Bereichsüberprüfung bei der Val-Funktion abschaltet:
Delphi-Quellcode:
{$R-}
Val(S, Result, E);
{$R+}
Bei Strings in Dezimaldarstellung klappt das aber nicht. Hier muss eine eigene Val her:
Delphi-Quellcode:
function ValUInt64(const s: AnsiString; var code: Integer): UInt64;
var
  i,l: Integer;
  dig: Integer;
  empty: Boolean;
begin
  l := Length(s);
  i := 1;
  dig := 0;
  Result := 0;
  if s = 'then
  begin
    code := i;
    exit;
  end;
  while s[i] = ' do
    Inc(i);
  if s[i] = '+then
    Inc(i);
  empty := True;
  if (s[i] = '$') or (Upcase(s[i]) = 'X')
    or ((s[i] = '0') and (Upcase(s[i+1]) = 'X')) then
  begin
    if s[i] = '0then
      Inc(i);
    Inc(i);
    while True do
    begin
      case s[i] of
      '0'..'9': dig := Ord(s[i]) - Ord('0');
      'A'..'F': dig := Ord(s[i]) - (Ord('A') - 10);
      'a'..'f': dig := Ord(s[i]) - (Ord('a') - 10);
      else
        break;
      end;
      {$R-}
      Result := Result shl 4 + dig;
      {$R+}
      if (l<i+1) then break;
      Inc(i);
      empty := False;
    end;
  end
  else
  begin
    while True do
    begin
      case s[i] of
      '0'..'9': dig := Ord(s[i]) - Ord('0');
      else
        break;
      end;
      {$R-}
      Result := Result*10 + dig;
      {$R+}
      if (l<i+1) then break;
      Inc(i);
      empty := False;
    end;
  end;
  if (s[i] <> #0) or empty then
    code := i
  else
    code := 0;
end;
Man beachte, dass es auch hier nötig ist, die Bereichsprüfung für das Aufsummieren des Results abzuschalten.

Mir düngt so langsam, dass intern UInt64=Int64 ist.
  Mit Zitat antworten Zitat