Page 1 of 1

Компиляция / Compilation of WPS classes + OpenWatcom

Posted: Sat Feb 09, 2013 22:48
by Eugene Gorbunoff
From: Glassman:

If you have troubles with creation of WPS classes (with OpenWatcom compiler).
The problem may occur because of co-processor initialization. Use this code to get stable creation of WPS class.

Проблемы с созданием WPS классов с помощью Open Watcom
И, собственно, любыми другими средствами. Проблема в инициализации сопроцессора. Среды выполнения всех компиляторов инициализируют его при загрузке DLL и, как выяснилось, инициализируют по разному. Из-за этого начинают происходить разные странности, например, размер файлов в детальном виде папки начинает отображаться с точностью до нескольких знаков после запятой.

Так как повлиять на классы, написанные IBM с помощью IBM C/C++ уже никак нельзя, то, как представляется, единственный путь - это инициализировать сопроцессор в своем классе точно также, как и IBM. А потом уже у себя разгребаться с возможными проблемами. Код для Open Watcom, инициализирующий сопроцессор соответствующим образом после загрузки DLL:

Code: Select all

int __dll_initialize( void )
{
  // We need to initialize FPU exactly in the way IBM C/C++, otherwise
  // all WPS classes get some of the side effects related to rounding
  // of floating point values.
  _control87( EM_INVALID | EM_DENORMAL | EM_ZERODIVIDE | EM_OVERFLOW | EM_UNDERFLOW | EM_INEXACT | RC_DOWN | PC_64,
              MCW_EM | MCW_IC | MCW_RC | MCW_PC );
  return 1;
}