ホーム » VC (ページ 9)
「VC」カテゴリーアーカイブ
VC 6 LNK2001 __beginthreadex
空のコンソール AP プロジェクトで,Afx.h を追加でインクルードしてビルドすると,
--------------------構成: MkBG_up - Win32 Debug-------------------- リンク中... nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__endthreadex" は未解決です nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__beginthreadex" は未解決です c:\Temp\Test_3D\MkBG_up\Debug.060/MkBG_up.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー MkBG_up.exe - エラー 3、警告 0
プロジェクトの設定で「共有 DLL で MFC を使用」などに変更.
2018/06/29 追記
エラーが出た直後の場合は,リビルドが必要.
template の利用
inline tstring x_To_tstring (const i_64 v) { return ::i64tot (v,10) ; } inline tstring x_To_tstring (const u_64 v) { return ::u64tot (v,10) ; } inline tstring x_To_tstring (const long v) { return ::i64tot (v,10) ; } inline tstring x_To_tstring (const int v) { return ::i64tot (v,10) ; } inline tstring x_To_tstring (const float v) { return ::To_tstring_rz (v,0, 7) ; } inline tstring x_To_tstring (const double v) { return ::To_tstring_rz (v,0,15) ; } template <class V2> tstring V2_To_tstring(const V2& vt,LPCTSTR sp=_T(" ")) { tstring str = ::x_To_tstring(vt.x) + sp ; str+= ::x_To_tstring(vt.y) + sp ; return str ; } template <class V2> tstring V2_To_tstring(const std::vector<V2>& va,LPCTSTR sp2=_T("\t"),LPCTSTR sp=_T("\r\n")) { tstring str ; for (size_t index=0 ; index<va.size() ; index++) { str += ::V2_To_tstring<V2>(va[index],sp2) + sp ; } return str ; }
次の様にすると, tstring pt_str = ::V2_To_tstring(pt2) ; C:\...\T_SplVw.cpp(99) : error C2667: 'V2_To_tstring' : 2 個のオーバーロード関数があいまいで最適な変換ができません。 C:\...\T_SplVw.cpp(99) : error C2668: 'V2_To_tstring' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
呼出し方法を忘れるので…
Vl2A pt2 ;
tstring pt_str = ::V2_To_tstring<Vl2>(pt2) ;
他にも,
::V2_To_tstring<Vd2>(::ToVd2A(tuvs)) ;
空のコンソール AP でビルドすると
空のコンソール AP プロジェクトを追加して,何度かビルドしていると…
--------------------構成: up_nView - Win32 Debug-------------------- コンパイル中... up_nView.cpp \\devs\...\__cpr_\straryfn.hxx(254) : error C2065: 'MessageCon' : 定義されていない識別子です。 \\devs\...\__cpr_\straryfn.hxx(254) : error C2146: 構文エラー : ';' が、識別子 'bar' の前に必要です。 \\devs\...\__cpr_\straryfn.hxx(254) : error C2065: 'bar' : 定義されていない識別子です。 \\devs\...\__cpr_\straryfn.hxx(258) : error C2228: '.SetBarInc' : 左側がクラス、構造体、共用体ではありません。 \\devs\...\__iwao\messbar.hxx(23) : warning C4005: 'MessageBar' : マクロが再定義されました。 c:\documents...\up_nview\up_nview.cpp(19) : 'MessageBar' の前の定義を確認してください Message::SetMessage No Support MsgStr \\devs\...\__iwao\enumfile.hxx(342) : error C2146: 構文エラー : ';' が、識別子 'bar' の前に必要です。 \\devs\...\__iwao\enumfile.hxx(346) : error C2228: '.SetBarInc' : 左側がクラス、構造体、共用体ではありません。 \\devs\...\__iwao\enumfile.hxx(412) : error C2146: 構文エラー : ';' が、識別子 'bar' の前に必要です。 \\devs\...\_.src\__iwao\enumfile.hxx(419) : error C2228: '.SetBarMax' : 左側がクラス、構造体、共用体ではありません。 \\devs\...\develop\_.src\__iwao\enumfile.hxx(420) : error C2228: '.SetBarInc' : 左側がクラス、構造体、共用体ではありません。 ... cl.exe の実行エラー up_nView.exe - エラー 31、警告 1
「プリコンパイル済みヘッダーを自動的に使用」になっていることがあるので「…使用しない」に.
データの送信 socket
3D データをアップするのに,複数のファイルを指定するのが面倒
調べてみると socket でいけそう?
利用するのは Win AP なので,MFC で良いかと思い調べると
CAsyncSocket や CSocket は適切ではないとのこと.
プログラミング Visual C++.NET Vol.2 活用編
第28章 インターネット通信の基礎 313 ページ
28.3.2 MFC の Winsock クラス
参考になるコードを探したが,その範囲でわかりやすかったのがここ.
http://www.katto.comm.waseda.ac.jp/~katto/
http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/socket.html
但し,そのままのコードではコンパイルエラーなどが少しあったので修正.
また,#ifdef _MSC_VER で一つのコードに.
sock_tcp.zip
VC 6 と DS115j でビルドし動作を確認.
ここまでの範囲では,クライアントからサーバに固定の文字列を送信.
LAN 内の PC と NAS などで相互に確認済み.
tcp_s.cpp のコードを一部修正.
char buffer[BUFFER_SIZE+10]; // +10 の大きさに
受信部分で
while(1) {
memset(&buffer,0,sizeof(buffer)) ; // バッファのクリアを追加
numrcv = recv(dstSocket, buffer, BUFFER_SIZE, 0);
…
}
サーバ側の tcp_s.exe を実行.
次の様な html を用意して,ブラウザで開く.
<!DOCTYPE html>
<html lang=”ja” >
<head >
<meta charset=”UTF-8″ />
</head>
<body >
<form action=”http://localhost:9876/” method=”post” enctype=”multipart/form-data”>
<input type=”file” name=”fname”>
<input type=”submit” value=”upload”>
</form>
</body>
</html>
何も指定せずに「upload」.
C:\…\Iwao>”C:\…\tcp\tcp_s\Release\tcp_s.exe”
Waiting for connection …
Connected from 127.0.0.1
received: POST / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, appli
cation/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/ms
received: word, */*
Referer: http://ds115j/Test/test_up/test_up.htm
Accept-Language: ja
Content-Type: multipart/form-data; boundary=—————————7e13a71ce4098a
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows N
received: T 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)
Host: localhost:9876
Content-Length: 195
Connection: Keep-Alive
Cache-Control: no-cache
—————————
received: –7e13a71ce4098a
Content-Disposition: form-data; name=”fname”; filename=””
Content-Type: application/octet-stream
—————————–7e13a71ce4098a–
C:\…\Iwao>
ClassicASP や ASP.NET でのファイルのアップロード
ASP を使用して Web サーバーにファイルをアップロードする方法
IIS7 ファイルアップロード用ページを簡単に作成する方法
ASP.NET の方は動作確認済み.
http://www.geekpage.jp/
http://www.geekpage.jp/programming/winsock/
EnumFilesTree で無限ループ
フォルダ以下の全てのファイルを列挙する関数
v_tstring EnumFilesTree (LPCTSTR path)
{
v_tstring foundFiles = ::EnumFiles(path) ;
v_tstring foundFolds = ::ExtractFolders(foundFiles) ;
for (size_t index=0 ; index<foundFolds.size() ; index++) {
tstring subFold = foundFolds[index] ;
v_tstring chFiles = ::EnumFiles(subFold.c_str()) ;
v_tstring chFolds = ::ExtractFolders(chFiles) ;
foundFolds.insert(foundFolds.end(),chFolds.begin(),chFolds.end()) ;
foundFiles.insert(foundFiles.end(),chFiles.begin(),chFiles.end()) ;
}
return foundFiles ;
}
今まで特に問題なく動作していたが,
先週末 VC 14 i3DV のデバッグ版を実行すると無限ループに.
Release 版や,VC 12 のデバッグ版などでは OK .
昨日は,別の PC 環境だったため再現せず.
今日デバッガを使用して調査すると,
フォルダの「作成日時」が正しくない.
/wordpress/dev/2016/09/15/
そのため,_wstat64 が正しく帰ってこない.
v_tstring EnumFiles (LPCTSTR path_,const bool skipDot=true)
{
tstring path = ::Path_DelLastSP(path_) ;
if (!File_IsDirectory(path.c_str())) {
path = ::Path_GetDir(path) ;
}
v_tstring foundFiles ;
#if defined __GNUC__
foundFiles = ::EnumFiles_GNUC (path,skipDot) ;
#elif defined _MFC_VER
foundFiles = ::EnumFiles_MFC (path,skipDot) ;
#elif defined _MSC_VER
foundFiles = ::EnumFiles_MSC (path,skipDot) ;
#endif
return foundFiles ;
}
ここの,File_IsDirectory(…) で,stat を利用している.
次の様に ::GetFileAttributes(…) の判断を追加.
if (!::File_IsDirectory(path.c_str())) {
#if (_MSC_VER == 1900)
{
if (!::FA_Is_Directory(path)) {
path = ::Path_GetDir(path) ;
}
}
#else
{
path = ::Path_GetDir(path) ;
}
#endif
}
CString , tstring
typedef std::basic_string <TCHAR,std::char_traits<TCHAR>,std::allocator<TCHAR> > tstring ;
CString | tstring |
---|---|
Left (count) | substr (0,count) |
Mid (first) | substr (first) |
Mid (first,count) | substr (first,count) |
Right (count) | |
IsEmpty | empty |
Empty | clear |
vector 要素の削除
MSDN vector::erase
MFC の CArray::RemoveAt(index,count=1)
先頭要素の削除
v1.erase( v1.begin( ) );
[1] の削除
v1.erase( v1.begin( )+1 );
VC 6 getline
先日のキー入力の動作を c++ で書き直し.
while (_ftprintf(stderr,_T(“%s=”),_T(“入力?”)) ,
_fgetts(buf,sizeof(buf),stdin) != NULL) { … }
最初次の様にしたが,
while (std::terr << _T(“入力?=”) ,
std::getline(std::tin,buf))
buf に一つずれて入ってくる.
次の方法では OK.
while (std::terr << _T(“入力?=”) ,
std::tin.getline(&buf[0],buf.size()))
VC 6 の問題の様で,VC 7 以降では上の方法で動作する.
コンマ演算子
古いデバッグ用のコードを見ていたら,こんなのがあった.
while (_ftprintf(stderr,_T(“%s=”),_T(“入力してください”)) ,
_fgetts(buf,sizeof(buf),stdin) != NULL) { … }
最近あまりこの様なコードを書くことがなく忘れていた.
while の条件式の括弧の中に複数の文.コンマで区切られている.
for ではインクリメントなどの変化式で使う.
MSDN コンマ演算子: ,
次の様にすると,i には c が代入されるらしい.
i = ( b , c ) ;
括弧がないと b .
i = b , c ;
MSDN コンマ演算子 (,) (JavaScript)
JavaScript でも同じ様な動作なら,今やっている所で使えそう.
C2059 , C2238
あるプロジェクト VC 6 をビルドしていてエラー.VC 12 などでは OK .
——————–構成: BLCombi – Win32 Debug——————–
コンパイル中…
ComUse02.cpp
c:\program files\…\vc98\include\oaidl.h(446) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(446) : error C2238: ‘;’ の前に不正なトークンがあります。
c:\program files\…\vc98\include\oaidl.h(452) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(452) : error C2238: ‘;’ の前に不正なトークンがあります。
c:\program files\…\vc98\include\oaidl.h(519) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(519) : error C2238: ‘;’ の前に不正なトークンがあります。
c:\program files\…\vc98\include\oaidl.h(526) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(526) : error C2238: ‘;’ の前に不正なトークンがあります。
c:\program files\…\vc98\include\oaidl.h(912) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(1294) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(3258) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(3615) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(4487) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(4717) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(4810) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(5013) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(5082) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(5162) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(6733) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(6742) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(6802) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oaidl.h(6811) : error C2059: 構文エラー : ‘constant’
c:\program files\…\vc98\include\oleauto.h(61) : warning C4091: 空白の宣言が見つかりました。
c:\program files\…\vc98\include\oleauto.h(61) : error C2143: 構文エラー : ‘;’ が ‘constant’ の前に必要です。
c:\program files\…\vc98\include\oleauto.h(61) : fatal error C1004: 予期せぬ EOF が検出されました。
cl.exe の実行エラー
ComUse02.obj – エラー 24、警告 1
ここで使用している Calc.cxx が原因.
#include <ShlObj.h> を先頭に追加して OK .
WinXP で VC 14 _stat
WinXP では,_stat がうまく機能しないみたい.
Visual C++ 2015 express: _stat not working on Windows XP
VC 12 などと比べると _stat 関係は大幅に変更されている?
Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3 をインストールして
「共有 DLL で MFC を使う」とした exe は正しく動作することを確認.
i3DV.2016.07.01.zip
VC 14 exe を XP でデバッグ
昨日リモートデバッグの環境を作っていったが,VC 14 では XP 上のリモートデバッグができない?
VC 11 以降 XP などについて具体的には書かれてない.
今回リモートデバッグしようと思ったのは,VC 14 でビルドした exe が XP で実行できないことにあった.
Win 7 などでは問題ない.また,VC 12 などでビルドした exe なら大丈夫.
現象は,exe の起動はできるが 3D モデルを開く時,エラーメッセージも出ずに終了してしまう.
デバッグ版のプロジェクトで以下を設定.
スタティック ライブラリで MFC を使用する
Visual Studio 2015 – Windows XP (v140_xp)
ビルドして,リリース版と同様の現象になることを確認.
XP 環境には VC 8 が入っているので,
デバッグ版 exe をエクスプローラなどから起動し,「ツール」-「プロセスにアタッチ」.
_tstati64 の呼び出しで,errno が 22(EINVAL 引数が無効です)となってしまう.
exe が終了してしまったのは,ファイルサイズが正しく取れなかったための無限ループ.
bool v_c_Save (LPCTSTR pathName,const std::vector text) { FILE* ofp = ::Open_File(pathName,_T("wb")) ; if (ofp == NULL) { return false ; } if (text.size() > 0) { ::fwrite(&text[0],sizeof(char),text.size(),ofp) ; } ::fclose(ofp) ; if (text.size() > 0) { u_64 fSize =F_Stat::GetSize(pathName) ; if (fSize == 0) { return v_c_Save(pathName,text) ; } } return true ; }
無限ループにならない様に,ループカウンタを追加.
exe が抜ける現象は解消されて 3D モデルが表示できる様にはなったが,stat の部分の対応はこれから.
リモートデバッグ
以前仮想マシンの XP にリモート環境を作って,その当時はそれなりに使ったと思う.
どうも起動が不安定だったが,複数のアダプターが影響していた?
リモート PC は,TestInst .
ローカルは DevXP と T54W7U64 .
VC 6
プロジェクトの設定で,スタティックにするなどして,対象 exe 以外の dll などがなくても動作する様にしている.
リモート側で \\DevXP\….\Debug.060\i3DV.exe を実行できる様にする.
ローカル側でも同様の指定で実行可能な設定にしている.
VC 6 の設定で,メニューの「ビルド」-「デバッガリモート接続」でリモート PC を設定.
デバッグモニタの設定は,
VC 8
プロジェクトの設定は,場所が違うだけで内容は VC 6 と同じようなもの.
リモート側では exe はこの様に見える.
デバッグモニタの設定は,
デバッガで実行すると,i3DV.exe が起動する.
VC 10
リモートデバッガのインストールから.DVD 内の rdbgsetup_x86.exe を実行してインストール.
他は,VC 8 などと同様.
_MBCS _tcspbrk
MBCS.exe で _tcspbrk を使用していて,ファイルパスの 0x5c の認識がうまくなかった.
_tcs… の関数を MBCS exe としてデバッガで見てみると
30: LPTSTR result1 = _tcschr (_T(“Test”),_T(‘s’)) ;
0040238A push 73h
0040238C push offset string “Test” (0048b0b0)
00402391 call @ILT+985(__tcschr) (004013de)
00402396 add esp,8
00402399 mov dword ptr [ebp-10h],eax
31: LPTSTR result2 = _tcsstr (_T(“Test”),_T(“sp”)) ;
0040239C push offset string “sp” (0048b0ac)
004023A1 push offset string “Test” (0048b0b0)
004023A6 call strstr (0042d170)
004023AB add esp,8
004023AE mov dword ptr [ebp-14h],eax
32: LPTSTR result3 = _tcspbrk(_T(“Test”),_T(“sp”)) ;
004023B1 push offset string “sp” (0048b0ac)
004023B6 push offset string “Test” (0048b0b0)
004023BB call strpbrk (0042d130)
004023C0 add esp,8
004023C3 mov dword ptr [ebp-18h],eax
33: size_t result4 = _tcsspn (_T(“Test”),_T(“sp”)) ;
004023C6 push offset string “sp” (0048b0ac)
004023CB push offset string “Test” (0048b0b0)
004023D0 call @ILT+1260(__tcsspn) (004014f1)
004023D5 add esp,8
004023D8 mov dword ptr [ebp-1Ch],eax
Afx.h をインクルードすると?
576: int CString::FindOneOf(LPCTSTR lpszCharSet) const
…
579: LPTSTR lpsz = _tcspbrk(m_pchData, lpszCharSet);
5F42E312 mov edx,dword ptr [lpszCharSet]
5F42E315 push edx
5F42E316 mov eax,dword ptr [this]
5F42E319 mov ecx,dword ptr [eax]
5F42E31B push ecx
5F42E31C call _tcspbrk (5f4012b0)
5F42E321 add esp,8
5F42E324 mov dword ptr [lpsz],eax
35: LPTSTR result1 = _tcschr (_T(“Test”),_T(‘s’)) ;
00401D14 push 73h
00401D16 push offset string “Test” (004230b0)
00401D1B call @ILT+485(__tcschr) (004011ea)
00401D20 add esp,8
00401D23 mov dword ptr [ebp-14h],eax
36: LPTSTR result2 = _tcsstr (_T(“Test”),_T(“sp”)) ;
00401D26 mov esi,esp
00401D28 push offset string “sp” (004230ac)
00401D2D push offset string “Test” (004230b0)
00401D32 call dword ptr [__imp__strstr (00426668)]
00401D38 add esp,8
00401D3B cmp esi,esp
00401D3D call _chkesp (0040e246)
00401D42 mov dword ptr [ebp-18h],eax
37: LPTSTR result3 = _tcspbrk(_T(“Test”),_T(“sp”)) ;
00401D45 mov esi,esp
00401D47 push offset string “sp” (004230ac)
00401D4C push offset string “Test” (004230b0)
00401D51 call dword ptr [__imp__strpbrk (0042666c)]
00401D57 add esp,8
00401D5A cmp esi,esp
00401D5C call _chkesp (0040e246)
00401D61 mov dword ptr [ebp-1Ch],eax
38: size_t result4 = _tcsspn (_T(“Test”),_T(“sp”)) ;
00401D64 push offset string “sp” (004230ac)
00401D69 push offset string “Test” (004230b0)
00401D6E call @ILT+655(__tcsspn) (00401294)
00401D73 add esp,8
00401D76 mov dword ptr [ebp-20h],eax
VC 11 以降の ODMenu
自前の UndoRedo テンプレートで,VC 11 以降メニューの表示が更新されなくなった.
対応は,アプリケーションクラスのヘッダで,ODMRoot.hxx のインクルードを追加すれば良い.
これとは別の動的なメニューも正しく表示できてないが,こちらはまだ原因を特定できてない.
CCmdUI::SetText
コンストラクタで static
次の様なクラスで,VC 14 ではコンストラクタ内の static を呼出した段階で止まってしまう?
VC 12 まででは OK .
class T_static {
public:
T_static () ;
} ;
T_static::T_static ()
{
{
static T_static root ;
}
std::tout << _T("T_static") << std::endl ;
}
コンストラクタの初期化動作を次の様に変更.
T_static::T_static ()
{
static bool Initialized = false ;
if (!Initialized) {
Initialized = true ;
static T_static root ;
}
std::tout << _T("T_static") << std::endl ;
}
VC 6 コンソール AP を VC 11 で…
VC 6 コンソール AP を順にアップしたプロジェクトを VC 11 でビルドすると,
—— すべてのリビルド開始: プロジェクト: T_DbgCls, 構成: Debug Win32 ——
T_DbgCls.cpp
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
c:\program files (x86)\microsoft sdks\windows\v7.1a\include\sal_supp.h(57):
warning C4005: ‘__useHeader’ : マクロが再定義されました。
c:\program files (x86)\microsoft visual studio 11.0\vc\include\sal.h(2872) :
’__useHeader’ の前の定義を確認してください
c:\program files (x86)\microsoft sdks\windows\v7.1a\include\specstrings_supp.h(77):
warning C4005: ‘__on_failure’ : マクロが再定義されました。
c:\program files (x86)\microsoft visual studio 11.0\vc\include\sal.h(2882) :
’__on_failure’ の前の定義を確認してください
c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\atlcore.h(638):
error C2039: ‘SetDefaultDllDirectories’ : ‘`global namespace” のメンバーではありません。
c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\atlcore.h(638):
error C2065: ‘SetDefaultDllDirectories’ : 定義されていない識別子です。
c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\atlcore.h(640):
error C2065: ‘LOAD_LIBRARY_SEARCH_SYSTEM32’ : 定義されていない識別子です。
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========
プロジェクト設定の,「プラットフォームツールセット」を「Visual Studio 2012 (v110) 」とすれば通る.
さらに,VC 12 では,
—— ビルド開始: プロジェクト:T_DbgCls, 構成:Debug Win32 ——
T_DbgCls.obj : warning LNK4075: /EDITANDCONTINUE は /OPT:LBR の指定によって無視されます。
LINK : fatal error LNK1104: ファイル ‘mfc120d.lib’ を開くことができません。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
VC 6 Release inline
次の様な呼出しで,Release ビルドでうまく動作しないことがあった.
…\PntFnc\TCrossL\TCrossLD.cpp 2 円の交点のエラー時の動作
Vd2 cp1 = ::get_point_on_line (l1c,l2c,l1r) ;
デバッグ版では意図した動作となる.
inline Vd2 get_point_on_line ( const Vd2& ls, const Vd2& le, const double d )
{
if (ls == le) { return ls ; }
Vd2 unit = (le-ls).Normalized() ;
Vd2 pos = ls + unit * d ;
return pos ;
}
ls と le を比較している部分で抜けてしまっている?
VC 7 では OK.
よくわからないので,間接的に呼出す様に変更.
inline Vd2 get_point_on_line(const Vd2& ls,const Vd2& le,const double d) { return get_point_on_line_(ls,le,d); }