Вверх ↑
Этот топик читают: Гость
Ответов: 5227
Рейтинг: 587
#1: 2022-02-13 11:27:49 ЛС | профиль | цитата
Собственно пару функций для конвертера форматов (d4 & fpc), добавьте если нужно (для передачи по COM порту вероятно точно нужно)
Проверить можно тут http://www.binaryconvert.com/convert_double.html

Add(MainForm,2953706,28,161)
{
 Width=450
 Height=156
}
Add(InlineCode,10978967,154,119)
{
 WorkPoints=#13:doDoubleToHex|13:doHexToDouble|0:|
 EventPoints=#5:onHex|6:onReal|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|0:|9:   public|29:     onHex,onReal: THI_Event;|55:     procedure doHexToDouble(var dt: TData; idx: word);|55:     procedure doDoubleToHex(var dt: TData; idx: word);|5: end;|1: |49: function HexToDouble(const hex: string): Double;|47: function DoubleToHex(const d: Double): string;|0:|14:implementation|0:|36:procedure THiAsmClass.doHexToDouble;|5:begin|49:  _hi_OnEvent(onReal, HexToDouble(ToString(dt)));|4:end;|0:|36:procedure THiAsmClass.doDoubleToHex;|5:begin|46:  _hi_OnEvent(onHex, DoubleToHex(ToReal(dt)));|4:end;|0:|48:function HexToDouble(const hex: string): Double;|3:var|12:  d: Double;|45:  Overlay: array[1..2] of LongInt absolute d;|5:begin|29:  if LENGTH(hex) <> 16  then |49:    _Debug('Invalid hex string for HexToDouble');|72:  //  then raise EIEEEMath.Create('Invalid hex string for HexToDouble');|42:  Overlay[1] := cHex2Int(COPY(hex, 9, 8));|42:  Overlay[2] := cHex2Int(Copy(hex, 1, 8));|14:  Result := d;|4:end;|0:|46:function DoubleToHex(const d: Double): string;|3:var|45:  Overlay: array[1..2] of LongInt absolute d;|5:begin|73:  // Look at element 2 before element 1 because of "Little Endian" order.|60:  Result := Int2Hex(Overlay[2], 8) + Int2Hex(Overlay[1], 8);|5:end; |1: |4:end.|
 link(onHex,15426071:doText,[])
 link(onReal,5127712:doText,[(222,132)(222,174)])
}
Add(Edit,3844880,84,63)
{
 Left=15
 Top=20
 Text="1.7"
}
Add(Button,9185643,28,119)
{
 Left=80
 Top=20
 Width=85
 Caption="RealToHex"
 link(onClick,4444644:doData,[])
}
Add(Edit,15426071,245,119)
{
 Left=190
 Top=20
 Width=225
 Text=""
}
Add(DoData,4444644,84,119)
{
 link(onEventData,10978967:doDoubleToHex,[])
 link(Data,3844880:Text,[])
}
Add(Edit,9926444,84,161)
{
 Left=15
 Top=60
 Width=235
 Text="3FF0000000000000"
}
Add(Button,5509348,28,210)
{
 Left=265
 Top=60
 Width=85
 Caption="HexToReal"
 link(onClick,13471617:doData,[])
}
Add(Edit,5127712,245,168)
{
 Left=365
 Top=60
 Text=""
}
Add(DoData,13471617,84,210)
{
 link(onEventData,10978967:doHexToDouble,[(135,216)(135,132)])
 link(Data,9926444:Text,[])
}
Add(PointHint,5186153,35,14)
{
 Info=#65:для проверки -   http://www.binaryconvert.com/convert_double.html|
 Font=[MS Sans Serif,8,1,8388608,1]
 Width=456
}


Редактировалось 1 раз(а), последний 2022-02-13 11:28:48
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 249
Рейтинг: 4
#2: 2022-02-14 10:57:07 ЛС | профиль | цитата
andrestudio писал(а):
Собственно пару функций для конвертера форматов

Когда надо было не нашел, а когда ненужно, появилось.
Спасибо добрый человек, взял на заметку.

nesko обнови плиз ConvertorEx.
карма: 1

0
Разработчик
Ответов: 26251
Рейтинг: 2140
#3: 2022-02-14 13:48:41 ЛС | профиль | цитата
ric писал(а):
обнови плиз ConvertorEx

Добавил на SVN в ConvertorEx вместе с новыми иконками.

Редактировалось 1 раз(а), последний 2022-02-14 13:48:52
карма: 22

0
Ответов: 5227
Рейтинг: 587
#4: 2022-02-15 19:36:38 ЛС | профиль | цитата
Возможно кому то захочется округлить реальные числа до определённого числа знаков после запятой не переводя это число в строку возможно пригодится этот код.

Add(MainForm,2953706,21,70)
{
 Width=249
 Height=161
}
Add(InlineCode,9717935,294,175)
{
 WorkPoints=#7:doRound|
 EventPoints=#5:onRes|
 DataPoints=#5:Count|
 Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Windows,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|5:     |9:   public|28:     Count,onRes: THI_Event;|49:     procedure doRound(var dt: TData; idx: word);|5: end;|0:|14:implementation|0:|85:function SimpleRoundTo(const AValue: Extended; const ADigit: integer = -2): Extended;|3:var|20:  LFactor: Extended;|5:begin|34:  LFactor := IntPower(10, ADigit);|20:  if AValue < 0 then|55:    Result := Trunc((AValue / LFactor) - 0.5) * LFactor|6:  else|56:    Result := Trunc((AValue / LFactor) + 0.5) * LFactor;|4:end;|0:|30:procedure THiAsmClass.doRound;|3:var|14:  d,Res: Real;|13:  i: integer;|5:begin|19:   d := ToReal(dt);|33:   i := ToIntegerEvent(Count)*-1;|29:   Res := SimpleRoundTo(d,i);|25:  _hi_onEvent(onRes,Res);|4:end;|3:   |4:end.|
 link(onRes,8944723:doEvent,[])
 link(Count,11758678:Text,[])
}
Add(Timer,6214879,105,70)
{
 Interval=3000
 link(onTimer,4947192:doRandom,[])
}
Add(Random,4947192,161,70)
{
 Min=-100
 Mode=1
 link(onRandom,2392438:doEvent1,[])
}
Add(Label,4759657,294,70)
{
 Left=25
 Top=20
}
Add(Hub,2392438,210,70)
{
 OutCount=3
 link(onEvent1,4759657:doText,[])
 link(onEvent2,9717935:doRound,[(266,83)(266,181)])
 link(onEvent3,3719503:doConvert,[(254,90)(254,230)])
}
Add(Edit,11758678,294,119)
{
 Left=25
 Top=55
 Text="3"
}
Add(Label,14798682,364,175)
{
 Left=95
 Top=55
}
Add(ConvertorEx,3719503,294,224)
{
 Mode=15
 Decimals=3
 link(onResult,6617061:doEvent,[])
}
Add(Label,15275088,364,224)
{
 Left=95
 Top=75
}
Add(Debug,8944723,336,175)
{
 link(onEvent,14798682:doText,[])
}
Add(Debug,6617061,336,224)
{
 link(onEvent,15275088:doText,[])
}

карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26251
Рейтинг: 2140
#5: 2022-02-15 19:45:37 ЛС | профиль | цитата
andrestudio писал(а):
Возможно кому то захочется округлить реальные числа до определённого числа знаков после запятой не переводя это число в строку возможно пригодится этот код

А чем тебя вот это не устраивает?

Add(Math,7834236,686,399)
{
 OpType=35
 Op2=0.001
}

карма: 22

0
Ответов: 5227
Рейтинг: 587
#6: 2022-02-15 19:52:59 ЛС | профиль | цитата
nesco, Мы же лёгких путей не ищем
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
6
Сообщение
...
Прикрепленные файлы
(файлы не залиты)