double без crt: как?

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

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Хочу double/float - предлагают libc :dntknw:
    как обойти?
     
  2. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    вообще в ntdll есть апи-шки для работы с вещественными числами.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    это я знаю, мне надо объявить типы double и float, чтобы полноценно с ними работать (передавать как параметры, складывать, умножать,и т.д.)
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    cresta
    class my_double {
    operator +=(...);
    ...
    };
    #undef double
    #define double my_double
    ?
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Хм, интересно, а как и чем инициализировать такой класс?
    Допустим, есть такое:

    Код (Text):
    1. class myDouble{
    2.     public:
    3.         int data;// или что, если не int?
    4.         myDouble& operator=(myDouble v1);
    5.  
    6. };
    7.  
    8. myDouble &myDouble::operator=(myDouble &a){
    9.     return *this;
    10. }
    11.    
    12. #undef double
    13. #define double myDouble
    Как в коде объявить переменную типа double и присвоить ей значение например 0.5?
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    cresta
    Хмм, а точно есть такая проблема?
    Код (Text):
    1. // cl /MD 1.c kernel32.lib && dumpbin /disasm 1.obj && del *.obj
    2.  
    3. #include <windows.h>
    4.  
    5. #pragma comment(linker, "/NODEFAULTLIB")
    6. #pragma comment(linker, "/ENTRY:zmain")
    7. #pragma comment(linker, "/SUBSYSTEM:console")
    8.  
    9. int _fltused = 0x9875;
    10.  
    11. void zmain(void) {
    12.   double x = 0.0;
    13.   x += 1.0;
    14.   ExitProcess(0);
    15. }
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    +1 операции с int64 могут вызвать проблемы, а вот с double вроде всегда было ясно.
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    cresta
    Какие ф-ции из CRT требуются?
    Если ftol[2], то можно попробовать опцию компилятора /QIfist (правда, не знаю, работает ли она с VC8).
    На крайний случай можно линковаться с CRT-шным ftol.obj - он маленький и зависимостей от CRT не имеет.
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    green

    мне нужны не только строковые функции, мне нужно производить вычисления (арифметические действия) с числами double и float.

    censored
    Действительно проблема есть:

    Код (Text):
    1. #define WIN32_LEAN_AND_MEAN
    2. //======================== Options ================
    3.     #pragma comment(linker, "/MERGE:.rdata=.text")
    4.     #pragma comment(linker, "/subsystem:windows")
    5.     #pragma comment(linker, "/entry:n_main")
    6.     #pragma comment(linker, "/nodefaultlib:LIBCMT")
    7.     #pragma comment(linker, "/nodefaultlib:LIBC")
    8.    
    9. //======================== Libraries ==============
    10.     #pragma comment(lib, "kernel32.lib")
    11.     #pragma comment(lib, "user32.lib")
    12.     #pragma comment(lib, "Shell32.lib")
    13.     #pragma comment(lib, "gdi32.lib")
    14.     #pragma comment(lib, "comctl32.lib")
    15.  
    16. //======================== Includes ===============
    17.     #include <windows.h>
    18.     #include <commctrl.h>
    19.     #include <Wingdi.h>
    20.  
    21. int __fltused = 0x9875;
    22. void n_main(){
    23.     double d;
    24.     d = 0.5;
    25. }
    26.  
    27. seller.obj : error LNK2001: unresolved external symbol __fltused
    Если вставлять директиву #pragma comment(linker, "/NODEFAULTLIB"), то на __fltused перестает ругаться, но при этом автоматом все апи, используемые в приложении, переходят в разряд unresolved symbols.

    Вот такая хрень.
    Видимо придётся dll писать на асме и через неё работать с fpu.
    По другому даже не знаю.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Задавай их не в сорце, а в командной строке линкера, если имеется ввиду kernel32 & K°.
     
  11. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    cresta, блин, я же говорю, подруби

    #pragma comment(lib,"ntdll.lib")

    там есть все эти апишки:

    _fltused
    _ftol
    sin
    sqrt
    tan
    __eF2XM1
    __eFABS
    __eFADD32
    __eFADD64
    __eFADDPreg
    __eFADDreg
    __eFADDtop
    __eFCHS
    __eFCOM
    ...
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Какая же нудная вещь эта crt... Никак от неё не отцепиться. Перенес имена либ в командную строку - снова перестал видеть __fltused :dntknw:
    Чем терять время, лучше нарисую эти 2 функции (сложение и умножение) asm-вставками. Всё равно исходные данные и требуемый результат в виде строк

    Код (Text):
    1. char *mult(char *doubleString1, char *doubleString2){
    2.     __asm{
    3.         ....
    4.     }
    5. }
    :)
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Quark

    Блин, опять пробовать :)))
    Сейчас попробую.......
     
  14. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    так ты убери все дефаулт либы и пропиши только те, которые тебе там нужны (kernel32.lib user32.lib ntdll.lib ws2_32.lib wininet.lib ...). После этого компилятор тебе никакую гадость в код встраивать не будет. все функции будет брать только из импорта.
     
  15. Av0id

    Av0id New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    87
    если не юзаем crt, то от просьб fltused избавляемся вот так

    extern "C" unsigned int _fltused=0;

    а все остальное (double, float) неплохо компилится и без crt (и ntdll), только без crt придется писать свои функции atod/dtoa, ftoa/atof (ну это конечно если потребуется ascii)
     
  16. CoolCmd

    CoolCmd New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    21
    Адрес:
    Moscow
    Av0id
    А если при проведении расчетов возникнет исключение? У вещественных чисел куча ошибок существует, не только деление на ноль... crt вроде их обрабатывает, а без библиотеки прога скорее всего упадет.
    Могу и ошибаться, поправте.
     
  17. Av0id

    Av0id New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    87
    CoolCmd, во-первых, тема топика не обрабатывать исключения, а расчет чисел с точкой без crt :) во-вторых, можно достаточно просто добавить обработчик исключений, вроде проверки знаменателя на ноль при делении и прочие критические варианты, и в третьих, seh никто не отменял
     
  18. CoolCmd

    CoolCmd New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    21
    Адрес:
    Moscow
    Av0id
    Там при ошибках нужно с регистрами fpu мухлевать, а ты знаешь как?
    А seh без crt - задачка не для слабонервных. Разве что в wdk компилировать.
     
  19. Av0id

    Av0id New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    87
    CoolCmd, юзайте crt и не задавайте мне таких вопросов, а то спать буду плохо по ночам :) не совсем понятно зачем мухлевать с регистрами fpu? вы имеете в виду control words?

    ps. если не хочется заморачиваться с написанием обработчика seh, то можно просто прилинковать к проекту либу из трех-четырех объектников (sehprolg.obj, exsup.obj, exsup2.obj, exsup3.obj из исходников crt) + 15-20 КБ к общему размеру