Вверх ↑
Этот топик читают: Гость
Ответов: 4621
Рейтинг: 746
#571: 2021-04-19 10:56:55 ЛС | профиль | цитата
Попробую, но не факт что получится, так как часть функционала компонента реализуется средой.
карма: 26

1
Голосовали:lisnic
Ответов: 4621
Рейтинг: 746
#572: 2021-04-26 11:31:45 ЛС | профиль | цитата
Для работы Translator в Unicode достаточно поменять кодировку файлов перевода на UTF-16 LE.
Но я переработал компонент на использование UTF-8.
Для отображения всего диапазона символов на разных языках в элементах управления нужно поставить другой шрифт.
карма: 26

1
файлы: 1hiTranslator_Unicode_fix.zip [1.2KB] [441]
Голосовали:lisnic
Ответов: 194
Рейтинг: 2
#573: 2021-04-28 00:55:58 ЛС | профиль | цитата
Netspirit, Работают даже кнопки!!!!
Netspirit, спасибо большое!
карма: 0

0
Ответов: 194
Рейтинг: 2
#574: 2021-05-18 21:15:53 ЛС | профиль | цитата
Компонент "принтер" не работает под FPC 2.6.0.... 32U

Редактировалось 1 раз(а), последний 2021-05-21 19:22:32
карма: 0

0
Ответов: 4621
Рейтинг: 746
#575: 2021-05-20 17:50:43 ЛС | профиль | цитата
У кого были проблемы с отображением результатов вычислений (преобразование чисел в строку) - протестируйте это.

1) Откройте файл HiAsm\compiler\FPC2\src\packages\KOL\kol.pas нормальным "Блокнотом" (Notepad++, SciTE, AkelPad и т.п.)
2) Замените функцию Extended2Str() со строки 20235 (до строки 20332) на эту:

function Extended2Str(E: Extended): KOLString;
const
DS: Char = '.';
PP = 3;
//15+8 = Extended
//15+7 = Double
Precision = {$ifdef FPC64}22{$else}23{$endif};
DefPE = 18; //= 19 in 64bit for Precision=23

var
Exponent, Q{, PP}, PE, DstL: Integer;
S: string;
Dst: PChar;

begin
Str(E:Precision, S); // '-2.00000000000000E+0001'

//PP := Pos('.', S);
if {PP = 0} S[PP] <> '.' then { NAN or other special case }
begin
Result := Trim(S); { Delete spaces }
// Result := '0';
Exit;
end;


{ Consider removing exponent }
//PE := Pos('E', Result);
//if PE = 0 then Exit; // Something wrong?
PE := DefPE;

{ Read exponent }
Exponent := 0;
Dst := @S[PE + 2]; // E+'0001' ; E+'001' in 64bit prec=23
while Dst^ <> #0 do
begin
Exponent := Exponent*10 + Ord(Dst^)-Ord('0');
Inc(Dst);
end;
if S[PE+1] = '-' then
Exponent := -Exponent;

{ Trim trailing zeros}
Dst := @S[PE - 1];
while (Dst^ = '0') do // Stop at non-zero or '.'
begin
Dec(PE);
Dec(Dst);
end;

if (PE = PP + 1) and (S[2] = '0') then // ' 0.00000000000000E+0000'
begin
Result := '0';
Exit;
end;


if Exponent >= 0 then
begin
{ Shift point to right }

DstL := Exponent + 1; // Digits before dst '.'

if S[1] = '-' then Inc(DstL); // '-' symbol

Q := PE - PP - 1; // Digits between src '.' and 'E'
if Q > Exponent then
begin
Inc(DstL); // Need '.' symbol in output
Inc(DstL, Q - Exponent); // Digits after dst '.'
end;

{ Compose output string }
SetLength(Result, DstL);
Dst := Pointer(Result);

// '-' symbol
if S[1] = '-' then
begin
Dst^ := '-';
Inc(Dst);
end;

Dst^ := S[2]; Inc(Dst); // 1 digit before src '.'

// Digits from S[3] to dst '.'
Q := PP + 1; // After src '.'
while (Q < PE) and (Exponent > 0) do
begin
Dst^ := S[Q];
Inc(Dst);
Inc(Q);
Dec(Exponent);
end;

if Q < PE then
begin
Dst^ := DS; // Dst '.'
Inc(Dst);
// Digits after dst '.'
while Q < PE do
begin
Dst^ := S[Q];
Inc(Dst);
Inc(Q);
end;
end
else // Extra '0'-s at the dst end
begin
while Exponent > 0 do
begin
Dst^ := '0';
Inc(Dst);
Dec(Exponent);
end;
end;

end
else
begin
{Shift point to left}
DstL := PE - PP - 1; // Digits between src '.' and 'E'
if S[1] = '-' then Inc(DstL); // '-' symbol
Inc(DstL); // '0' before '.'
Inc(DstL); // '.' symbol in output

Exponent := -Exponent; // Abs(Exponent)
Inc(DstL, Exponent); // Extra zeros at left

{ Compose output string }
SetLength(Result, DstL);
Dst := Pointer(Result);

// '-' symbol
if S[1] = '-' then
begin
Dst^ := '-';
Inc(Dst);
end;

Dst^ := '0'; Inc(Dst); // First '0'
Dst^ := DS; Inc(Dst); // '.'

for Q := 2 to Exponent do // Remained extra zeros at left
begin
Dst^ := '0';
Inc(Dst);
end;

Dst^ := S[2]; Inc(Dst); // 1 digit before src '.'
// Digits between src '.' and 'E'
for Q := PP + 1 to PE - 1 do
begin
Dst^ := S[Q];
Inc(Dst);
end;
end;

end;
3) Сохранитесь.
4) Выполните файлы
HiAsm\compiler\FPC2\src\_make_KOL_A.bat
HiAsm\compiler\FPC2\src\_make_KOL_U.bat



lisnic писал(а):
Компонент "принтер" не работает
Посмотрю.
карма: 26

0
Ответов: 207
Рейтинг: 14
#576: 2021-05-20 19:19:47 ЛС | профиль | цитата
Netspirit писал(а):
протестируйте это

Взял этот пример https://forum.hiasm.com/post/308324
К сожалению на FPC-64/FPC-64U без изменений 49744124.9999999

Редактировалось 1 раз(а), последний 2021-05-20 19:19:58
карма: 2

0
Ответов: 4621
Рейтинг: 746
#577: 2021-05-21 11:09:41 ЛС | профиль | цитата
Вероятно, это не относится к функции конвертации числа в текст. Где-то есть потеря точности при вычислениях. Гляну.
карма: 26

0
Ответов: 4621
Рейтинг: 746
#578: 2021-05-27 16:47:01 ЛС | профиль | цитата
Обновлен компилятор FPC до версии 3.2.2 и пакет до ревизии 2346 основного SVN

http://depositfiles.com/files/1jqb9xs4v
карма: 26

3
Голосовали:Joiner, lisnic, Konst
Ответов: 207
Рейтинг: 14
#579: 2021-07-09 11:32:56 ЛС | профиль | цитата
Netspirit писал(а):
Где-то есть потеря точности при вычислениях

Не знаю почему, но в прошлой версии я ставил точность 21 для FPC64 и все работало. В нынешней реализации тоже помогло.
  Precision = {$ifdef FPC64}21{$else}23{$endif};
DefPE = {$ifdef FPC64}17{$else}18{$endif};
Проверил на 50000 разных значений. Результат верный.

Редактировалось 1 раз(а), последний 2021-07-09 11:35:16
карма: 2

0
Ответов: 4621
Рейтинг: 746
#580: 2021-07-11 09:44:11 ЛС | профиль | цитата
Подобные манипуляции именно в этом месте - самообман: точность при вычислениях остается той же (если результат без вывода в окно подавать на дальнейшие вычисления), но происходит округление до меньшего количества знаков при выводе в окно (преобразовании в текст). Аналогичный эффект можно получить применив Math.round к результату. А изменение функции конвертации будет влиять на отображение всех чисел в программе.

Текущий вариант Extended2Str() был протестирован для получения одинаковых результатов со старой KOL в существующих компиляторах. Был задан набор известных чисел типа Double в двоичном виде (минимальных/максимальных значимых и др. - перечень в Википедии) и достигнуты одинаковые результаты с официальными компиляторами. При этом эта функция в официальных KOL падает на некоторых числах типа +/- Inf (моя - нет).

Редактировалось 1 раз(а), последний 2021-07-11 09:47:40
карма: 26

0
Ответов: 207
Рейтинг: 14
#581: 2021-07-11 11:30:25 ЛС | профиль | цитата
Netspirit писал(а):
происходит округление до меньшего количества знаков при выводе

Ясно, спасибо за разъяснение.
Netspirit писал(а):
Текущий вариант Extended2Str() был протестирован для получения одинаковых результатов со старой KOL

Я нисколько не сомневался в правильности твоей функции.
Netspirit писал(а):
в официальных KOL падает на некоторых числах

Так сам Кладов писал, что она глючная.
Я пробовал переделанную родную KOLовскую функцию под WIN64. В ней заметил еще большие отклонения.

function Extended2Str( E: Extended ): KOLString;
function UnpackFromBuf( const Buf: array of Byte; N: Integer ): KOLString;
var I, J, K, L: Integer;
begin
SetLength( Result, 16 );
J := 1;
for I := 7 downto 0 do
begin
K := Buf[ I ] shr 4;
Result[ J ] := KOLChar( Ord('0') + K );
Inc( J );
K := Buf[ I ] and $F;
Result[ J ] := KOLChar( Ord('0') + K );
Inc( J );
end;
//Assert( Result[ 1 ] = '0', 'error!' );
Delete( Result, 1, 1 );
if N <= 0 then
begin
while N < 0 do
begin
Result := '0' + Result;
Inc( N );
end;
Result := '0.' + Result;
end else
if N < Length( Result ) then
begin
Result := Copy( Result, 1, N ) + '.' + CopyEnd( Result, N + 1 );
end else
begin
while N > Length( Result ) do
begin
Result := Result + '0';
end;
Exit; {>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
end;
L := Length( Result );
while L > 1 do
begin
if (Result[ L ] <> '0')
and (Result[ L ] <> '.') then
break;
Dec( L );
if Result[ L + 1 ] = '.' then break;
end;
if L < Length( Result ) then Delete( Result, L + 1, MaxInt );
end;
var
S: Boolean;
var F: Extended;
N: Integer;
Buf1: array[ 0..9 ] of Byte;
I10: Integer;
{$IFDEF PAS_ONLY}
procedure Ext2BDC(E: Extended; Buf1: array of byte);
{$IFDEF WIN64} var F: Extended; {$ENDIF}
asm
{$IFDEF WIN64}
MOVQ qword ptr F, E
FLD F
{$ELSE}
FLD E
{$ENDIF}
FBSTP [Buf1]
end;
{$ENDIF}
begin
Result := '0';
if E = 0 then Exit; {>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
S := E < 0;
if S then E := -E;

N := 15;
F := 5E12;
I10 := 10;
while E < F do
begin
Dec( N );
E := E * I10;
end;
if N = 15 then
while E >= 1E13 do
begin
Inc( N );
E := E / I10;
end;

while TRUE do
begin
{$IFDEF PAS_ONLY}
Ext2BDC(E, Buf1);
// if TRUNC(Abs(E)) >= 10000000 then
// break;
{$ELSE}
asm
FLD [E]
FBSTP [Buf1]
end;
{$ENDIF}
if Buf1[ 7 ] <> 0 then break;
E := E * I10;
Dec( N );
end;
Result := UnpackFromBuf( Buf1, N );
if S then Result := '-' + Result;
end;
карма: 2

0
Ответов: 2059
Рейтинг: 131
#582: 2021-07-11 15:27:08 ЛС | профиль | цитата
Я не устанавливал FPC 2.6.0, в связи с этим у меня такой вопрос:
Хочу сделать несколько компонентов и под пакет Delphi, и под FPC.
Для этого хочу сделать так:
.....
{$IF Defined(FPC)}
.......
{$ELSEIF Defined(DELPHI)}
.....
{$IFEND}
Вопрос заключается в том, надо ли мне будет переделывать сегмент FPC в соответствии с KOL, как для Delphi, или будет работать чистый код FPC?
Подозреваю, что тоже надо править код.

Редактировалось 2 раз(а), последний 2021-07-11 15:30:15
карма: 6

0
Ответов: 4621
Рейтинг: 746
#583: 2021-07-12 21:24:45 ЛС | профиль | цитата
Дефайны могут выглядеть так:
{$ifdef FPC}
{$else}
{$endif}

flint2 писал(а):
надо ли мне будет переделывать сегмент FPC в соответствии с KOL

Это зависит от кода. Если твой код для Delphi работает в компоненте (с использованием KOL или без) - значит, в большинстве случаев будет работать и в FPC. А если не работает - надо выяснить причину и тогда пытаться обойти дефайнами. Конкретно в FPC можно использовать функции и типы данных, которые объявлены в модулях, находящихся в папках compiler\FPC2\unitsXXX (согласно перечисленных в uses стороннего кода, который ты пытаешься портировать в компонент).
карма: 26

0
Ответов: 2059
Рейтинг: 131
#584: 2021-07-12 22:01:39 ЛС | профиль | цитата
Netspirit писал(а):
Дефайны могут выглядеть так:
{$ifdef FPC}
{$else}
{$endif}

Да могут, но это не суть. Можно этот момент вообще опустить и сделать отдельные компоненты.
Я грешным делом понадеялся, что могу обойтись без KOL, или всё-же это возможно?
Я ещё не пробовал устанавливать FPC для HiAsm-а по этому говорить рано:
А если не работает - надо выяснить причину и тогда пытаться обойти дефайнами.

Не в них дело. Дело в возможности писать чистый код без KOL. В delphi это не возможно.
И вот ещё, Эта версия поддерживает переменные аргументы функции?
Например, Delphi 6 и выше поддерживают для совместимости с кодом, написанным в C.
function fann_create_standard(num_layers: Cardinal): PFann; cdecl; varargs;
function fann_create_sparse(connection_rate: single; num_layers: Cardinal): PFann; cdecl; varargs;
function fann_create_shortcut(connection_rate: single): PFann; cdecl; varargs;

Редактировалось 5 раз(а), последний 2021-07-12 22:13:24
карма: 6

0
Ответов: 4621
Рейтинг: 746
#585: 2021-07-14 18:17:08 ЛС | профиль | цитата
flint2 писал(а):
Дело в возможности писать чистый код без KOL. В delphi это не возможно.
В новом FPC таких возможностей больше благодаря большему количеству присутствующих в комплекте стандартных модулей. В частности, KOL заменяет собой модули SysUtils, StrUtils, Classes (и оконный интерфейс Forms, Controls и др.), поэтому таких модулей нет с компилятором Delphi. Но многие из них есть с моим FPC, и их функции можно использовать. Тем не менее, модули для оконного интерфейса отсутствуют по причине ненадобности в текущем пакете.
flint2 писал(а):
И вот ещё, Эта версия поддерживает переменные аргументы функции?
Точно не уверен, но новый FPC поддерживает большинство возможностей последних версий Delphi.

Редактировалось 1 раз(а), последний 2021-07-15 10:41:12
карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)