1 Востаннє редагувалося Stanislav Stecenko (04.06.2015 23:53:26)

Тема: Delphi xe Поможіть виправити ошибку

function HEX2DEC(HEX: string): LONGINT;

  function Digt(Ch: CHAR): BYTE;
  const
    HEXDigts: string[16] = '0123456789ABCDEF';
  var
    I: integer;
    N: BYTE;
  begin
    N := 0;
    for I := 1 to Length(HEXDigts) do
      if Ch = HEXDigts[i] then // тут ошибка
        N := I - 1;
    Digt := N;
  end;

const
  HEXSet: set of CHAR = ['0' .. '9', 'A' .. 'F'];
var
  J: LONGINT;
  Error: BOOLEAN;
  DEC: LONGINT;
begin
  DEC := 0;
  Error := False;
  for J := 1 to Length(HEX) do
  begin
    if not(UpCase(HEX[J]) in HEXSet) then
      Error := True;
    DEC := DEC + Digt(UpCase(HEX[J])) shl ((Length(HEX) - J) * 4);
  end;
  if Error then
    HEX2DEC := 0
  else
    HEX2DEC := DEC;
end;

Видає ошибку Operator not applicable to this operand type

2

Re: Delphi xe Поможіть виправити ошибку

if Ch = Char(HEXDigts[i]) then // тут ошибка
        N := I - 1;
Подякували: Stanislav Stecenko1

3

Re: Delphi xe Поможіть виправити ошибку

А взагалі от

function HexToDec(Str: string): Integer;
var
  i, M: Integer;
begin
  Result:=0;
  M:=1;
  Str:=AnsiUpperCase(Str);
  for i:=Length(Str) downto 1 do
  begin
    case Str[i] of
      '1'..'9': Result:=Result+(Ord(Str[i])-Ord('0'))*M;
      'A'..'F': Result:=Result+(Ord(Str[i])-Ord('A')+10)*M;
    end;
    M:=M shl 4;
  end;
end;
Подякували: Stanislav Stecenko1

4 Востаннє редагувалося koala (05.06.2015 11:25:57)

Re: Delphi xe Поможіть виправити ошибку

Навіть не знаю, як простіше - ваш варіант чи

function HexStrToInt(Str : string) : integer;
const HexValues:array['0'..'F'] of integer = ( {'0'-'9'} 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
                                               {':'-'@'} 0, 0, 0, 0, 0, 0, 0,
                                               {'A'-'F'} 10, 11, 12, 13, 14, 15 );
var c:char;
begin
  HexStrToInt := 0;
  for c in Str do begin
    HexStrToInt := HexStrToInt shl 4 or HexValues[ c ]
  end
end;

Коротше і швидше - точно мій :)
Хоча краще замість shl 4 or все ж * 16 + писати, і хай в оптимізатора голова болить.

Подякували: Chemist-i1