手元の C++ Builder が 10.4 と少し古かったので、最新の C++ Builder 11.3 をインストールして
試してみたところ、載せていただいたプログラムで Error:"floating point divided by zero の
エラーが発生しました
調べてみたところ、原因は恐らくコンパイラのバグでした
bullet Physics ライブラリの以下の関数でゼロ除算エラーを回避するために除算に使用する値が
0 かどうかを if文でチェック( if (mass == D_btScalar(0.))等 )しているのですが、
void D_btRigidBody::setMassProps(D_btScalar mass, const D_btVector3& inertia)
{
if (mass == D_btScalar(0.))
{
m_collisionFlags |= D_btCollisionObject::D_CF_STATIC_OBJECT;
m_inverseMass = D_btScalar(0.);
} else
{
m_collisionFlags &= (~D_btCollisionObject::D_CF_STATIC_OBJECT);
m_inverseMass = D_btScalar(1.0) / mass;
}
m_invInertiaLocal.setValue(inertia.x() != D_btScalar(0.0) ? D_btScalar(1.0) / inertia.x(): D_btScalar(0.0),
inertia.y() != D_btScalar(0.0) ? D_btScalar(1.0) / inertia.y(): D_btScalar(0.0),
inertia.z() != D_btScalar(0.0) ? D_btScalar(1.0) / inertia.z(): D_btScalar(0.0));
}
最適化を有効にするとどうもこのゼロかどうかのチェックが無効化(?)されてしまうようで、
if (mass == D_btScalar(0.)) や inertia.x() != D_btScalar(0.0) のチェックをすり抜け、
ゼロ除算が行われてしまい、Error:"floating point divided by zero が発生してしまう
という状況のようでした( なので最適化を無効にするとエラーは発生しませんでした )
float型の値の == の比較が無効化されるようなので、以下のように unsigned int型で
ゼロかどうかを判定するようにしたところ、Error:"floating point divided by zero は
発生しなくなりました
void D_btRigidBody::setMassProps(D_btScalar mass, const D_btVector3& inertia)
{
if ( ( *((unsigned int *)&mass) & 0x7fffffff ) == 0 )
{
m_collisionFlags |= D_btCollisionObject::D_CF_STATIC_OBJECT;
m_inverseMass = D_btScalar(0.);
} else
{
m_collisionFlags &= (~D_btCollisionObject::D_CF_STATIC_OBJECT);
m_inverseMass = D_btScalar(1.0) / mass;
}
m_invInertiaLocal.setValue(
( *((unsigned int *)&inertia.x()) & 0x7fffffff ) != 0 ? D_btScalar(1.0) / inertia.x(): D_btScalar(0.0),
( *((unsigned int *)&inertia.y()) & 0x7fffffff ) != 0 ? D_btScalar(1.0) / inertia.y(): D_btScalar(0.0),
( *((unsigned int *)&inertia.z()) & 0x7fffffff ) != 0 ? D_btScalar(1.0) / inertia.z(): D_btScalar(0.0));
}
上記の変更を行ったバージョンをこちらにアップしましたので、よろしければお試しください m(_ _)m
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 11.3 用
あと、今回 64bitプラットフォーム用のビルドもできることに気付いたので、
64bitプラットフォーム用のライブラリファイルも加えました
なので、zipファイルの中には Win32 と Win64 のフォルダが入っています
今まで通りの 32bitプラットフォーム用のビルドを行う際は Win32フォルダの中の
ファイルを使用してください m(_ _)m
> 3.23: 問題なし <=このバージョンを使用していました。
> 3.23b: 問題なし
> 3.23d; Error:未解決の外部シンボル'__pure_error_'等
> 3.23f, 3.24, 3.24b: Error:"floating point divided by zero at アドレス"
無料で使用できる C++ Builder は約1年で無料ライセンスの期限が切れるため都度新しい
バージョンをインストールしているのですが( 1年以内に次のバージョンが登場するため、
無料で使い続けたい場合は約1年毎に半強制的に新バージョンに移行しなくてはいけないシステム? )、
恐らく 3.23b の頃までライブラリファイルのコンパイルに使用していた C++ Builder のバージョンで作成した
ライブラリファイルはたまたま C++ Builder 11.3 でも問題なく使用できて、3.23d 以降のライブラリファイルを
コンパイルする際に使用していた C++ Builder のバージョンで作成したライブラリファイルは
C++ Builder 11.3 では正常に使用できなかった、ということかと思います
同じコンパイラで作成したライブラリファイルでも、
『ライブラリファイルの作成に使用したコンパイラのバージョン』と、
『そのライブラリファイルを使用するプログラムのコンパイルに使用するコンパイラのバージョン』
が異なると正常に使用できないということは Microsoft系のコンパイラでも Gnu C 系のコンパイラでも存在しますので…