Hex: чтение 16-ричных чисел

Опубликовано в QPILE

Шестнадцатеричное цифры: преобразование из строки в  число (QPILE не умеет). Привожу текст, полученный после препроцессора (то есть готовый к исполнению). Распознаются натуральные числа.

 

func Int_Base(Str)
   if substr(Str,0,2) == "0x"
      Str = substr(Str,2,len(Str)-2)
   end if
   result = 0
   for __2 from 0 to len(Str)-1
      __1 = find("0123456789ABCDEF",0,substr(Str,__2,1))
      if __1 == -1
         Break
      End if
      result = result * 16 + __1
   end for END FUNC

Проверим:

a = Hex("0xFF")
a1 = Hex("FF")
a2 = Hex("10")
a3 = Hex("0xFF0011")
message(a & " " & a1 & " " &a2 & " " &a3,1)

Получим:

255   255   16   16711697 

Потребовалось для возможности задания пользователем разных цветовых схем в роботе.


Лёгкая модификация позволит читать числа в любой системе счисления. Вот вариант, который умеет читать натуральные числа в двоичной (0b10011), восьмеричной(0777), десятичной (1234) и шестнадцатеричной (0xFF00AA) системах. Написано с использованием М4.

 

Func Int_Base(Str)
   Local(Symbol,Base,Symbols_List)

   result = Str_Left(Str)
   if result != "0"
      Return(Float(Str))
   end if

   result = Chr_Upper(substr(Str,1,1))
   Switch(result)
      Case("X")
         Base = 16
         Str = Str_Right(Str,2)
      Case("B")
         Base = 2
         Str = Str_Right(Str,2)
      Default
         Base = 8
         Str = Str_Right(Str,1)
   EndSwitch result = 0
Symbols_List = Str_Left("0123456789ABCDEF",Base)   ForString(i,Str)
      Symbol = find(Symbols_List,0,Chr_Upprer(substr(Str,i,1)))
      if Symbol == Unknown
         Break
      End if
      result = result * Base + Symbol
   end for
EndFunc(Result)


Здесь нет никаких вызовов других пользовательских функций, только макросы, которые будут развёрнуты inline. При отсутствии препроцессора эти макросы необходимо заменить на допустимые конструкции qpile вручную.

 

Недостаточно прав для комментирования