Hex: чтение 16-ричных чисел
Шестнадцатеричное цифры: преобразование из строки в число (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 вручную.
Мастер-класс от гитариста Deep Purple по скоростной работе пальцами для скальперов (декабрь 1971):