Строка -> число с плавающей точкой -> Строка

Тема в разделе "LANGS.C", создана пользователем x3r0n, 23 мар 2007.

  1. x3r0n

    x3r0n New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    34
    Привет всем!
    Вапрос такой, как БЕЗ использования RTL сделать преобразования:

    строка -> число(Разделителем может быть как точка так и запятая)

    На паскале я бы сделал это примерно так:
    Код (Text):
    1. function StrToDouble(s: ShortString): Double; stdcall;
    2. var
    3.   i, j: Dword;
    4. begin
    5.   j := SizeOf(s) ;
    6.   for i := 1 to j do
    7.   if s[i] = ',' then s[i] := '.';
    8.   Val(s, Result, i);
    9. end; //StrToDouble
    И обратно из числа в строку:
    Код (Text):
    1. function DoubleToStr(x: Double): PChar; stdcall;
    2. var
    3.   s: String;
    4. begin
    5.   Str(x : 0 : 2, s);
    6.   Result := PChar(s);
    7. end; //DoubleToStr
    Подскажите плиз как это можно сделать на си, или с использованием Inline Asm'a...
     
  2. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    зайди сюда

    http://board.flatassembler.net/topic.php?t=4377&start=60
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    x3r0n
    в K&R Книга ответов есть и то и другое.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А Val - это не rtl?
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    в масм32 есть fpulib. из нее можно дллку скомпилеть и юзать.
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Такая же мысль была ;)
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    дык ему на Си без RTL, а на паскале хоть как :P
     
  8. x3r0n

    x3r0n New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    34
    Avoidik посмотрел, то что надо но, не получается портировать...
    Не пинайте сильно, я только учусь... Помогите плиз...
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    x3r0n
    Скомпилируйте тот сэмпл на фасме в .obj и прилинкуйте его к основной программе.
    И не надо ничего портировать.
     
  10. x3r0n

    x3r0n New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    34
    На дельфи есть переписанные SysUtils,System без ртл, но со всеми остальными функциями)

    Спасибо, сейчас попробую ;)
     
  11. x3r0n

    x3r0n New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    34
    Обьясните плиз как правильно сделать, и правильно ли я делаю вообще...
    В общем в директории C:\masm32\fpulib есть 2 файла:
    FpuFLtoA.asm
    FpuAtoFL.asm
    Судя по описанию это то что нужно...
    Дальше в масме делаю Project->Assemble ASM file
    Получаю 2 obj файла...
    Дальше в своем проекте пишу:

    #pragma resource "FpuFLtoA.obj"
    #pragma resource "FpuAtoFL.obj"

    HWND Handle;
    char buf[512];
    float i;
    int start( void )
    {
    Handle = FindWindow(0, "Мое окно");
    Handle = GetWindow(Handle, GW_CHILD);
    SendMessage(Handle, WM_GETTEXT, (WPARAM) sizeof(buf), (LPARAM) buf);
    ...

    В buf хранится строка представляющая из себя число,
    в котором разделителем может быть как точка так и запятая...
    Подскажите плиз как мне используя FpuAtoFL перевести ее в число, потом например прибавить к нему 1 и перевести обратно с помощью FpuFLtoA в строку...
    Прототипы этих функций:
    FpuAtoFL lpSrc:lol: WORD, lpDest:lol: WORD, uID:lol: WORD
    FpuFLtoA lpSrc:lol: WORD, lpDecimal:lol: WORD, lpDest:lol: WORD, uID:lol: WORD
    Не пинайте сильно все вы когда-то были новичками ;)
     
  12. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    в масме создай объектники своих функций и через линкер создай либу, либу подключай к своему проекту, по аналогии масмовых прототипов напиши свой файл заголовков (.h) и юзай
     
  13. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
     
  14. x3r0n

    x3r0n New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    34
    Ты имеешь ввиду создать длл или *.lib? Если длл, такой вариант не подходит т.к. размер сильно увеличится...
    *.lib создать у меня не получилось :dntknw: сделал как написано в FAQ:
    КОМПИЛЯЦИЯ В LIB(MS WINDOWS)
    MASM:
    ml /c /coff file_name.asm
    Lib file_name.obj

    Ошибок нет, но и нет либ файлов...
    Обьясните плиз как это сделать, на примере FpuAtoFL...
     
  15. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    x3r0n
    link -lib /OUT:file_name.lib file_name.obj
    Хотя нет особого смысла создавать либ-файл, т.к. obj можно использовать напрямую.
     
  16. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    #define IsDigit(c) ((c) >= '0' && (c) <= '9')

    double StringToDouble (char s[])
    {
    int i=0;
    double val, power;

    for (val = 0.0; IsDigit(s); i++)
    val = 10.0 * val + (s - '0');
    if (s == '.')
    i++;
    for (power = 1.0; IsDigit(s); i++) {
    val = 10.0 * val + (s - '0');
    power *= 10.0;
    }

    val = val / power;

    return val;
    }

    сдается мне товарищ мутит очередного мега трояна для WM :)
     
  17. x3r0n

    x3r0n New Member

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