это я знаю, мне надо объявить типы double и float, чтобы полноценно с ними работать (передавать как параметры, складывать, умножать,и т.д.)
Хм, интересно, а как и чем инициализировать такой класс? Допустим, есть такое: Код (Text): class myDouble{ public: int data;// или что, если не int? myDouble& operator=(myDouble v1); }; myDouble &myDouble::operator=(myDouble &a){ return *this; } #undef double #define double myDouble Как в коде объявить переменную типа double и присвоить ей значение например 0.5?
cresta Хмм, а точно есть такая проблема? Код (Text): // cl /MD 1.c kernel32.lib && dumpbin /disasm 1.obj && del *.obj #include <windows.h> #pragma comment(linker, "/NODEFAULTLIB") #pragma comment(linker, "/ENTRY:zmain") #pragma comment(linker, "/SUBSYSTEM:console") int _fltused = 0x9875; void zmain(void) { double x = 0.0; x += 1.0; ExitProcess(0); }
cresta Какие ф-ции из CRT требуются? Если ftol[2], то можно попробовать опцию компилятора /QIfist (правда, не знаю, работает ли она с VC8). На крайний случай можно линковаться с CRT-шным ftol.obj - он маленький и зависимостей от CRT не имеет.
green мне нужны не только строковые функции, мне нужно производить вычисления (арифметические действия) с числами double и float. censored Действительно проблема есть: Код (Text): #define WIN32_LEAN_AND_MEAN //======================== Options ================ #pragma comment(linker, "/MERGE:.rdata=.text") #pragma comment(linker, "/subsystem:windows") #pragma comment(linker, "/entry:n_main") #pragma comment(linker, "/nodefaultlib:LIBCMT") #pragma comment(linker, "/nodefaultlib:LIBC") //======================== Libraries ============== #pragma comment(lib, "kernel32.lib") #pragma comment(lib, "user32.lib") #pragma comment(lib, "Shell32.lib") #pragma comment(lib, "gdi32.lib") #pragma comment(lib, "comctl32.lib") //======================== Includes =============== #include <windows.h> #include <commctrl.h> #include <Wingdi.h> int __fltused = 0x9875; void n_main(){ double d; d = 0.5; } seller.obj : error LNK2001: unresolved external symbol __fltused Если вставлять директиву #pragma comment(linker, "/NODEFAULTLIB"), то на __fltused перестает ругаться, но при этом автоматом все апи, используемые в приложении, переходят в разряд unresolved symbols. Вот такая хрень. Видимо придётся dll писать на асме и через неё работать с fpu. По другому даже не знаю.
cresta, блин, я же говорю, подруби #pragma comment(lib,"ntdll.lib") там есть все эти апишки: _fltused _ftol sin sqrt tan __eF2XM1 __eFABS __eFADD32 __eFADD64 __eFADDPreg __eFADDreg __eFADDtop __eFCHS __eFCOM ...
Какая же нудная вещь эта crt... Никак от неё не отцепиться. Перенес имена либ в командную строку - снова перестал видеть __fltused Чем терять время, лучше нарисую эти 2 функции (сложение и умножение) asm-вставками. Всё равно исходные данные и требуемый результат в виде строк Код (Text): char *mult(char *doubleString1, char *doubleString2){ __asm{ .... } }
так ты убери все дефаулт либы и пропиши только те, которые тебе там нужны (kernel32.lib user32.lib ntdll.lib ws2_32.lib wininet.lib ...). После этого компилятор тебе никакую гадость в код встраивать не будет. все функции будет брать только из импорта.
если не юзаем crt, то от просьб fltused избавляемся вот так extern "C" unsigned int _fltused=0; а все остальное (double, float) неплохо компилится и без crt (и ntdll), только без crt придется писать свои функции atod/dtoa, ftoa/atof (ну это конечно если потребуется ascii)
Av0id А если при проведении расчетов возникнет исключение? У вещественных чисел куча ошибок существует, не только деление на ноль... crt вроде их обрабатывает, а без библиотеки прога скорее всего упадет. Могу и ошибаться, поправте.
CoolCmd, во-первых, тема топика не обрабатывать исключения, а расчет чисел с точкой без crt во-вторых, можно достаточно просто добавить обработчик исключений, вроде проверки знаменателя на ноль при делении и прочие критические варианты, и в третьих, seh никто не отменял
Av0id Там при ошибках нужно с регистрами fpu мухлевать, а ты знаешь как? А seh без crt - задачка не для слабонервных. Разве что в wdk компилировать.
CoolCmd, юзайте crt и не задавайте мне таких вопросов, а то спать буду плохо по ночам не совсем понятно зачем мухлевать с регистрами fpu? вы имеете в виду control words? ps. если не хочется заморачиваться с написанием обработчика seh, то можно просто прилинковать к проекту либу из трех-четырех объектников (sehprolg.obj, exsup.obj, exsup2.obj, exsup3.obj из исходников crt) + 15-20 КБ к общему размеру