SysUtils

Тема в разделе "WASM.ZEN", создана пользователем x3r0n, 26 дек 2006.

  1. x3r0n

    x3r0n New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    34
    Всем привет!
    В общем такая проблемма...
    В моей программе нужно перевести переменную из типа PChar в Double
    и обратно...

    Я сделал это так:

    ......
    uses
    Windows,
    SysUtils;
    ......
    ///Разделителем в числе может быть точка, поэтому заменяем ее запятой.
    s := PChar(StringReplace(s, '.', ',', [rfReplaceAll]));
    x := StrToFloat(s);
    ......
    s := PChar(FloatToStr(x));
    ......

    Но при использовании SysUtils размер программы увеличивается в несколько раз!
    Вопрос:
    Как сделать то же самое но без использования SysUtils?
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    руками =))) но какое это отношение имеет к васму?
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Написать свои функции перевода double в string.
     
  4. x3r0n

    x3r0n New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    34
    Еслибы я создал этот топик на форуме про шкурки тушканчиков, тогда ты прав...
    Но вроде бы это форум по программированию...

    Может есть аналогичные функции в ассемблере?
     
  5. supersonic777

    supersonic777 New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2006
    Сообщения:
    25
    Вар.1 юзай sysutils а потом жми прогу любым пакером для PE
    Вар.2 писать свою функ. для конвертирования.

    Есть API но она конверит из int в pchar - wsprintf
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    x3r0n
    В директории Дельфи под названием Source должен быть файлик ffmt.asm в котором есть функции преобразования (это в Дельфи 5, а в Дельфи 7 ассемблерный код, который тебе пригодится, находится собственно в sysutils.pas, поищи, например, TextToFloat). На их основе можешь написать свое преобразование.
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Юзай старые добрые Val и Str, прописанные в System со времен TP ;)
    Правда в качестве разделителя они как раз принимают точку, а не "бухгалтерскую" запятую ;))
    Для защиты от "бухгалтера" можно делать так
    Код (Text):
    1. var  x:double; s:string;k:integer;
    2.   ...
    3.   Val(s,x,k);
    4.   if (k > 0) and (s[k] =',') then
    5.   begin
    6.     s[k]:='.';
    7.     Val(s,x,k);
    8.   end;
     
  8. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    leo
    Этим вроде бы переменной DecimalSeparator можно управлять.
     
  9. x3r0n

    x3r0n New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    34
    Спасибо, тема закрыта
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    crypto
    Ни-зя, DecimalSeparator в SysUtils сидит, а в Val и Str жестко точка закодирована
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    на самом деле SysUtils не так уж и много добавляет к экзешнику, я не пишу на дельфи,
    но когда-то побаловался и попробовал, у меня получилась 52Кб что для дельфи кодера следует
    считать малым размером :)

    сорс был такой:
    Код (Text):
    1. program Calculate;
    2.  
    3. uses
    4.   Windows, Messages, SysUtils;
    5. const
    6.   IDD_DIALOG_1    =  200;
    7.   IDC_BUTTON_2    =  112;
    8.   IDC_BUTTON_1    =  111;
    9.   IDC_EDIT_10     =  110;
    10.   IDC_EDIT_9      =  109;
    11.   IDC_EDIT_8      =  108;
    12.   IDC_EDIT_7      =  107;
    13.   IDC_EDIT_6      =  106;
    14.   IDC_EDIT_5      =  105;
    15.   IDC_EDIT_4      =  104;
    16.   IDC_EDIT_3      =  103;
    17.   IDC_EDIT_2      =  102;
    18.   IDC_EDIT_1      =  101;
    19.   MAINICON        =  400;
    20.  
    21.  
    22. function DlgProc(hDlg, uMsg, wParam, lParam: Integer): Integer; stdcall;
    23. var
    24. sBuff                   : array [1..32] of byte;
    25. S1, S2, S3, S4, S5, S6  : String;
    26. begin
    27.  Result := 1;
    28.   CASE uMsg OF
    29.     WM_INITDIALOG :
    30.       begin
    31.         SendMessage(hDlg, WM_SETICON, ICON_BIG,
    32.                     LoadIcon(hInstance, PChar(MAINICON)));
    33.         SendMessage(hDlg, WM_SETICON, ICON_SMALL,
    34.                     LoadImage(hInstance, PChar(MAINICON), IMAGE_ICON, 16, 16, 0));
    35.       end;
    36.     WM_COMMAND :
    37.       begin
    38.         CASE (LOWORD(wParam)) OF
    39.           IDC_BUTTON_1 :
    40.             begin
    41.              try
    42.               if GetDlgItemText(hDlg, IDC_EDIT_1, ADDR(sBuff), 32) <> 0 then S1 := StrPas(ADDR(sBuff));
    43.               if GetDlgItemText(hDlg, IDC_EDIT_2, ADDR(sBuff), 32) <> 0 then S2 := StrPas(ADDR(sBuff));
    44.               if GetDlgItemText(hDlg, IDC_EDIT_3, ADDR(sBuff), 32) <> 0 then S3 := StrPas(ADDR(sBuff));
    45.               if GetDlgItemText(hDlg, IDC_EDIT_4, ADDR(sBuff), 32) <> 0 then S4 := StrPas(ADDR(sBuff));
    46.               if GetDlgItemText(hDlg, IDC_EDIT_5, ADDR(sBuff), 32) <> 0 then S5 := StrPas(ADDR(sBuff));
    47.               if GetDlgItemText(hDlg, IDC_EDIT_6, ADDR(sBuff), 32) <> 0 then S6 := StrPas(ADDR(sBuff));
    48.  
    49.               SetDlgItemText(hDlg, IDC_EDIT_7, PChar(FloatToStr(StrToInt(S1) * StrToFloat(S4))));
    50.               SetDlgItemText(hDlg, IDC_EDIT_8, PChar(FloatToStr(StrToInt(S2) * StrToFloat(S5))));
    51.               SetDlgItemText(hDlg, IDC_EDIT_9, PChar(FloatToStr(StrToInt(S3) * StrToFloat(S6))));
    52.  
    53.               SetDlgItemText(hDlg, IDC_EDIT_10, PChar(FloatToStr(StrToInt(S1) * StrToFloat(S4) +
    54.                                                                  StrToInt(S2) * StrToFloat(S5) +
    55.                                                                  StrToInt(S3) * StrToFloat(S6))));
    56.              except
    57.              end;
    58.             end;
    59.           IDC_BUTTON_2 :
    60.             begin
    61.               SendMessage(hDlg, WM_CLOSE, 0, 0);
    62.             end;
    63.         ELSE
    64.          Result := 0;
    65.         END; {CASE}
    66.       end;
    67.     WM_CLOSE :
    68.       begin
    69.         EndDialog(hDlg, 0);
    70.       end;
    71.   ELSE
    72.    Result := 0;
    73.   END; {CASE}
    74. end;
    75.  
    76. {$R Calculate.res}
    77.  
    78. begin
    79.   DialogBoxParam(hInstance, PChar(IDD_DIALOG_1), 0, @DlgProc, 0);
    80. end.
     
  12. x3r0n

    x3r0n New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    34
    Это сжатый размер?

    Совсем чуть-чуть... Прога стала меньше в 2(!) раза...
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    нет чистый
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну мой D7 генерит 14.848 пустой exe. 39.936 с uses SysUtils.