ホーム » VC (ページ 6)
「VC」カテゴリーアーカイブ
FindExecutable と C2664
::FindExecutable の動作を確認しようと思い次の様なコードを書いた.
#include <clocale> #include <iostream> #include <Windows.h> #include "i_define.hxx" #include "tstring.hxx" tstring Get_doc_exe (LPCTSTR doc) { tstring exe_path ; exe_path.resize(MAX_PATH,0) ; ::FindExecutable(doc,NULL,&exe_path[0]) ; return exe_path.c_str() ; } int _tmain (int argc,TCHAR* argv[]) { _tsetlocale(LC_ALL,_T("")) ; { tstring buf ; buf.resize(1000) ; { while (std::terr << _T("file ? =") , std::tin.getline(&buf[0],buf.size())) { tstring str = buf.c_str() ; if (str == _T("q")) { break ; } else if (str == _T("Q")) { break ; } // str = ::QuotM_Del_All(str) ; if (str.empty()) { continue ; } // if (::File_IsNothing(str)) { continue ; } std::tout << ::Get_doc_exe(str.c_str()) << std::endl ; } } } return 0 ; }
MBCS でビルドすると問題ないが,UNICODE にすると,
--------------------構成: get_exe - Win32 Release-------------------- コンパイル中... get_exe.cpp C:\Documents and Settings\All Users\Documents\Develop\VC_Test\PC_doc\get_exe\get_exe.cpp(37) : error C2664: 'class std::basic_istream<unsigned short,struct std::char_traits<unsigned short> > &__thiscall std::basic_istream<unsigned short,struct std:: char_traits<unsigned short> >::getline(unsigned short *,int)' : 1 番目の引数を 'char *' から 'unsigned short *' に変換できません。 (新しい機能 ; ヘルプを参照) 指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。 C:\Documents and Settings\All Users\Documents\Develop\VC_Test\PC_doc\get_exe\get_exe.cpp(37) : fatal error C1903: 直前のエラーを修復できません; コンパイルを中止します。 cl.exe の実行エラー get_exe.exe - エラー 2、警告 0
C2664 については ここ .
Windows.h の include を i_define.hxx より後に.
::FindExecutable ではうまくない様な記述もあるが,今回の目的にはこれで良いかなと思う.
https://dobon.net/vb/dotnet/system/findassociatedexe.html
https://itl.mydns.jp/…/get_exe_2020_09.zip
更にちょっと面白い動作があったので…
#include "i_define.hxx" #include "tstring.hxx" #include <Windows.h> #include <clocale> #include <iostream> int _tmain (int argc,TCHAR* argv[]) { _tsetlocale(LC_ALL,_T("")) ; { tstring buf ; buf.resize(1000) ; { while (std::terr << _T("file ? =") , std::tin.getline(&buf[0],buf.size())) { tstring str = buf.c_str() ; if (str == _T("q")) { break ; } else if (str == _T("Q")) { break ; } if (str.empty()) { continue ; } ::ShellExecute(NULL,NULL,str.c_str(),NULL,NULL,SW_SHOWNORMAL) ; } } } return 0 ; }
関連付けされているドキュメントは,::ShellExecute で普通に開く.
そうでないドキュメントは,エクスプローラでクリックしたのと同じような動作.
NotePad や MSPaint などと入力すると,幾つかの exe は起動できる.
起動できないものもあり,その違いは不明.
https://itl.mydns.jp/…/se_doc_2020_09.zip
Python から C の呼出し – 3
Win10 環境に入っている Python.h を検索.
C:\Users\Iwao> where /R \ Python.h
C:\CocosCreator\resources\utils\Python27\include\Python.h
C:\Microsoft\AndroidNDK64\android-ndk-r15c\prebuilt\windows-x86_64\include\python2.7\Python.h
C:\Microsoft\AndroidNDK64\android-ndk-r16b\prebuilt\windows-x86_64\include\python2.7\Python.h
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\Python\Core\Packages\ptvsd\_vendored\pydevd\pydevd_attach_to_process\dll\python.h
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\Python\Core\Packages\ptvsd\_vendored\pydevd\pydevd_attach_to_process\linux\python.h
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\Extensions\Microsoft\Python\Core\debugpy\_vendored\pydevd\pydevd_attach_to_process\common\python.h
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\Extensions\Microsoft\Python\Miniconda\Miniconda3-x64\include\Python.h
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\include\Python.h
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\pkgs\python-3.6.5-h0c2934d_0\include\Python.h
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\include\Python.h
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_86\include\Python.h
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\include\Python.h
C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r11c\prebuilt\windows-x86_64\include\python2.7\Python.h
C:\salt\bin\include\Python.h
C:\Users\All Users\Microsoft\AndroidNDK64\android-ndk-r11c\prebuilt\windows-x86_64\include\python2.7\Python.h
C:\Users\Iwao\AppData\Local\Microsoft\Linux\HeaderCache\1.0\-1863842710\usr\include\python2.7\Python.h
C:\Users\Iwao\AppData\Local\Microsoft\Linux\HeaderCache\1.0\-1863842710\usr\include\python3.7\Python.h
C:\Users\Iwao\AppData\Local\Microsoft\Linux\HeaderCache\1.0\-1863842710\usr\include\python3.7m\Python.h
C:\Windows.old\Users\All Users\Microsoft\AndroidNDK64\android-ndk-r11c\prebuilt\windows-x86_64\include\python2.7\Python.h
C:\Users\Iwao>
Python から CPP の呼出し – 3
//////////////////////////////////////////////////////////////////// // test_cpp.hpp // #pragma once #include "_s_func.hxx" #include "_t_func.hxx" #include "_tdefine.hxx" class test_class { public: test_class (LPCTSTR n) { name = n ; std::tout<< name + _T("\t***") << std::endl ; } virtual ~test_class () { std::tout<< name + _T("\t---") << std::endl ; } public: tstring name ; } ; inline test_class* get_test_class (void) { static test_class G_tc("G_test") ; return &G_tc ; } //////////////////////////////////////////////////////////////////// // test_cpp.cpp // #include "test_cpp.hpp" #include <clocale> #include <iostream> test_class tc(_T("global")) ; int _tmain (int argc,TCHAR* argv[]) { _tsetlocale(LC_ALL,_T("")) ; test_class tc(_T("local 1")) ; { test_class tc(_T("local 2")) ; std::tout << _T("hello") << std::endl ; } { test_class* gt = ::get_test_class() ; std::tout << gt->name << std::endl ; } return 0 ; } ////////////////////////////////////////////////////////////////////
Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/call_cpp/test_cpp $ g++ test_cpp.cpp -Wall Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/call_cpp/test_cpp $ ./a.out global *** local 1 *** local 2 *** hello local 2 --- G_test *** G_test local 1 --- G_test --- global --- Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/call_cpp/test_cpp $
//////////////////////////////////////////////////////////////////// // t_cpp.cpp // #include <Python.h> #include "test_cpp.hpp" #include <clocale> #include <iostream> test_class tc(_T("global")) ; static PyObject* local__ (PyObject* self, PyObject* args) { test_class tc(_T("local")) ; std::tout << tc.name << std::endl ; return Py_None; } static PyObject* global_ (PyObject* self, PyObject* args) { test_class* gt = ::get_test_class() ; std::tout << gt->name << std::endl ; return Py_None; } static PyMethodDef t_cpp_methods[] = { { "local__", local__, METH_NOARGS, "local__" }, { "global_", global_, METH_NOARGS, "global_" }, { NULL }, } ; static struct PyModuleDef t_cpp = { PyModuleDef_HEAD_INIT, "t_cpp", "test cpp module", -1, t_cpp_methods } ; PyMODINIT_FUNC PyInit_t_cpp(void) { return PyModule_Create(&t_cpp) ; } ////////////////////////////////////////////////////////////////////
Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/call_cpp/test_cpp $ g++ t_cpp.cpp -Wall -fPIC -shared -o t_cpp.so -I /volume1/.@plugins/AppCentral/python3/include/python3.7m/ Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/call_cpp/test_cpp $ python3 Python 3.7.0 (default, Aug 23 2018, 17:48:39) [GCC 4.6.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import t_cpp global *** >>> dir(t_cpp) ['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'global_', 'local__'] >>> t_cpp.local__() local *** local local --- >>> t_cpp.local__() local *** local local --- >>> t_cpp.global_() G_test *** G_test >>> t_cpp.global_() G_test >>> import t_cpp >>> t_cpp.local__() local *** local local --- >>> t_cpp.global_() G_test >>> exit() G_test --- global --- Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/call_cpp/test_cpp $
AS5202T Debian 10 と VC
VC で ASUSTOR NAS Linux Center の Debian 10 Desktop を使用するための設定.
SSH 接続を可能にして gcc などをインストールしておく必要がある.
Linux development with C++ in Visual Studio
VC の「ツール」-「オプション」,「クロスプラットフォーム」-「接続マネージャー」-「追加」.
SSH 接続する時の情報を設定する.
追加後「接続マネージャー」-「リモートヘッダー…」で「更新」するとエラー.
エラーが発生しました。Could not start the ‘rsync’ command on the remote host, please install it using your system package manager. Please see https://aka.ms/AA23jat for troubleshooting。詳細については、C:\Users\Iwao\AppData\Local\Temp\vslinux_header_update_log.txt を参照してください。トラブルシューティングを行うには、https://aka.ms/AA23jat をご覧ください。
この部分の対応方法はよくわからない.
これでビルドすれば大丈夫なはずだが,何故かエラー.
VC を再起動したり,プロジェクトを読み直したりしていたら通る様になった.
std::fixed でアプリケーションエラー
先日やっていた計算式のコード.これをテストしていてエラーに.
エラーとなるコードの場所は数値を文字列に変換する所.
その部分だけを抜き出したコードは次の様なもの.
bool test (c_tstring& str_) { tstring str = str_ ; { TCHAR* endPtr = 0 ; double val = double(_tcstod(str.c_str(),&endPtr)) ; std::tout << std::fixed << val << std::endl ; // if (-1e50 < val && val < 1e50) { std::tout << std::fixed << val << std::endl ; } // else { std::tout << std::scientific << val << std::endl ; } } return true ; }
1e300 などの値を std::fixed で表示すると,限られた環境でビルドした exe でエラーになる.
エラーが確認できたのは VC 6 で MFC を使用しないでビルドしたもの.
VC 6 でも DLL でリンクしている場合は,ランタイムの DLL のバージョンにより大丈夫.
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/mba_20/chk_big $ c++ chk_big.cpp -Wall Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/mba_20/chk_big $ ./a.out value ? =1e10 10000000000.000000 value ? =1e100 10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104.000000 value ? =1e200 99999999999999996973312221251036165947450327545502362648241750950346848435554075534196338404706251868027512415973882408182135734368278484639385041047239877871023591066789981811181813306167128854888448.000000 value ? =1e300 1000000000000000052504760255204420248704468581108159154915854115511802457988908195786371375080447864043704443832883878176942523235360430575644792184786706982848387200926575803737830233794788090059368953234970799945081119038967640880074652742780142494579258788820056842838115669472196386865459400540160.000000 value ? =1e400 inf value ? =1e307 9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000 value ? =1e308 100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336.000000 value ? =1e309 inf value ? =-1e100 -10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104.000000 value ? =-1e307 -9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000 value ? =-1e308 -100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336.000000 value ? =-1e309 -inf value ? =1.e-100 0.000000 value ? =1.e-300 0.000000
RC1047 , C2679
既存の VC 8 プロジェクトをビルドすると,うまくビルドできなくなっている.
https://itl.mydns.jp/i_Tools/Doc/blog/images/err_2004.txt
1>------ すべてのリビルド開始: プロジェクト: WatchPD, 構成: Debug Win32 ------ 1>リソースをコンパイルしています... 1>fatal error RC1047: too many -I# options, 'c:\DP340XPP\D_Drive\Develop\Lib\InkSDK.C80\include' 1>プロジェクト : error PRJ0002 : エラーの結果 1 が 'C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin\rc.exe' より返されました。 1>WatchPD - エラー 1、警告 0
先日サーバ環境を変更(共通ソースを DevS から DevX に)したことによる影響.
その時簡単にはテストしたがメインのプロジェクトでは確認していなかった.
RC1047 の原因は,インクルードパスが長すぎるみたい.
もう一つのエラー.
1>------ ビルド開始: プロジェクト: PlnCtrl, 構成: Debug Win32 ------ 1>ComUse06.cpp 1>\\devx\public\documents\develop\_.src\_yet\mouse.cxx(1819) : error C2679: 二項演算子 '<<' : 型 'const P2' の右オペランドを扱う演算子が見つかりません (または変換できません)。 1> c:\program files (x86)\microsoft visual studio 8\vc\include\ostream(656): 'std::basic_ostream<_Elem,_Traits> &std::operator <<<wchar_t,std::char_traits<wchar_t>>(std::basic_ostream<_Elem,_Traits> &,const char *)' の可能性があります。 1> with 1> [ 1> _Elem=wchar_t, 1> _Traits=std::char_traits<wchar_t> 1> ] 1>
こっちは暫くわからなかった.
afxDump で検索すると 先日書いた記事 が引っ掛かり…
#define afxDump std::terr
これが有効になる条件が間違っていた.
_AFXDLL ではなく _MFC_VER で判断する必要があった.
LNK2005 すでに ~.obj で定義…
このエラーは,複数のソースファイルに同じ関数などが定義されている場合に発生します.
別の表現をすると,リンク対象の obj や lib に同じ定義が含まれているということです.
次の様な関数のエラーは,プロジェクトの設定に問題があることがあります.
nafxcwd.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) はすでに LIBCD.lib(new.obj) で定義されています
https://dev.mish.work/wordpress/?s=lnk2005
他に,自前のコードでヘッダファイルに関数の実体を定義した場合にも発生します.
その場合はソースファイルに移すか,inline 関数として定義します.
base64.hxx
以下は個人的なもので,ちょっと異なる使い方で発生した時の対応です.
以前,ソースファイルに定義していたテーブルをヘッダファイルに.
struct CL_function { LPCTSTR Lower ; int FType ; } ; CL_function CL_fnc_tbl[] = { _T("atan2") , ATAN2 , // ... _T(" ") , FERROR , _T("\0") , FERROR , } ;
--------------------構成: pf_20 - Win32 Debug-------------------- コンパイル中... ComPrj01.cpp コードを生成中... コンパイル中... ComUse02.cpp pf_20.cpp pf_20Dlg.cpp コードを生成中... リンク中... ComUse02.obj : error LNK2005: "struct CL_function * CL_fnc_tbl" (?CL_fnc_tbl@@3PAUCL_function@@A) はすでに ComPrj01.obj で定義されています pf_20.obj : error LNK2005: "struct CL_function * CL_fnc_tbl" (?CL_fnc_tbl@@3PAUCL_function@@A) はすでに ComPrj01.obj で定義されています pf_20Dlg.obj : error LNK2005: "struct CL_function * CL_fnc_tbl" (?CL_fnc_tbl@@3PAUCL_function@@A) はすでに ComPrj01.obj で定義されています pf_20.exe - エラー 3、警告 0
次の様に static を付けて対応したが,ヘッダには static を書いてはいけない 様な記述が多い.
static CL_function CL_fnc_tbl[] = {
// ...
} ;
#pragma message (” ~ “) の利用
先日からやっているコードの解析部分を単体テスト用に分割していると,
--------------------構成: prs_frml - Win32 Debug-------------------- コンパイル中... prs_frml.cpp c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) : fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h> cl.exe の実行エラー prs_frml.exe - エラー 1、警告 0
「パッと見」でわかる時は良いが,今回はわかり難い.
そんな時に私が場所を限定していく手順.
次の様に影響していそうな所に #pragma message (” ~ “) を追加.
#pragma message ("pass 1") #include "StrAryTo.hxx" #pragma message ("pass 2") #ifdef _MSC_VER #ifdef _AFXDLL #else #ifndef afxDump #define afxDump std::terr #endif #endif #endif #pragma message ("pass 3")
今回は次の様になったので StrAyTo.hxx が原因とわかった.
pass 1 c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) : fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
StrAryTo.hxx は CStringArray と std::vector<tstring> を相互変換するコード.
インクルードから外すことで対応.
MFC を使用しているソースなどの対応方法は次の所.
https://dev.mish.work/wordpress/2019/04/05/c1189-windows-h-already-included/
C4244: ‘初期化中’: ‘INT_PTR’ から …
VC 2002 より前に作成した「ダイアログベース」のプロジェクトの場合 x64 対応に変更すると
XxxApp.cpp(73): warning C4244: ‘初期化中’: ‘INT_PTR’ から ‘int’ への変換です。データが失われる可能性があります。
生成されるスケルトンでは,アプリケーションクラスのダイアログの部分が次の様になっている.
CFBXtoMDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK) {
}
else if (nResponse == IDCANCEL) {
}
x86,x64 共に warning などを出なくするには,int となっている部分を INT_PTR に変更 する.
「MFC を使用しない」のエラー
’91 年に C で作成して,’95 年頃に C++ で書き直したコード.
その頃は MFC なしでも動作するようにコードを書いていた.
が,’06 頃の UNICODE 化で MFC に依存するようになってしまっている.
main 関数だけ用意して,対象の cpp をインクルードしてビルドすると,
--------------------構成: t_calc - Win32 Debug-------------------- コンパイル中... t_calc.cpp リンク中... nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) はすでに libcpd.lib(delop.obj) で定義されています nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__endthreadex" は未解決です nafxcwd.lib(thrdcore.obj) : error LNK2001: 外部シンボル "__beginthreadex" は未解決です C:\Temp\Debug\Calc\t_calc\Debug.060/t_calc.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー t_calc.exe - エラー 4、警告 0
どこかで Afx.h など MFC のコードをインクルードしてしまっている.
インクルードを順に辿るとすぐ見つかるが,どう修正するか悩むところ.
MFC を必要とする場合は今まで通りで,不要な場合は新しいコードに切り替えるか?
#ifdef _MFC_VER #include <Afx.h> #else #include "_s_func.hxx" #endif
ある程度必要なコードは特定できたがまだ書き直してないコードもありそう.
_MFC_VER で切り替えようと思ったが,コンソール AP ではうまく機能しない.
How to detect “Use MFC” in preprocessor
_MFC_VER は Afx.h の中で間接的(AfxVer_.h)に定義されている.
使えるのは _AFXDLL のみ?
次の様な感じ?
#ifdef _MSC_VER #ifdef _AFXDLL #include <Afx.h> #else #include <Windows.h> #endif #endif
2020/02/14
ヘッダファイルで CString などを使用しているコードの部分は
#ifdef _MFC_VER CString ChangeString (LPCTSTR str) ; #endif
2020/09/25
コンソール AP での define
VC /LARGEADDRESSAWARE
64 ビットバイナリの作成に関して調べていて /LARGEADDRESSAWARE を見つけたのでメモ.
/LARGEADDRESSAWARE (大きいアドレスの処理)
これを有効にすると 64 ビット環境で 2 GB を超えるメモリを利用できるみたい.
プロジェクトの「プロパティ」-「構成プロパティ」-「リンカ」-「システム」-「大きいサイズのアドレス」
次の様なコードで動作を確認.
#include <iostream> #include "memstat.hxx" #include "gettickc.hxx" int _tmain (int argc, TCHAR* argv[]) { u_32 free_M = 0 ; { MemoryStatus ms ; std::tout << long(ms.GetPhysFree()/1024/1024) << std::endl ; free_M = u_32(ms.GetPhysFree ()/1024/1024) ; } { std::vector <void*> memAry(1024,(void*)NULL) ; u_32 index =0 ; u_32 allocTotal = 0 ; u_32 allocSize = free_M/2 ; u_32 ngCount = 0 ; for (index=0 ; index<free_M && ngCount<10 ; ) { if (allocSize == 0) { break ; } void* pAlloc = calloc(allocSize,1024*1024) ; if (pAlloc != NULL) { allocTotal += allocSize ; } else { allocSize /= 2 ; ngCount++ ; continue ; } MemoryStatus ms ; std::tout << allocSize << _T("\t") << allocTotal << _T("\t") << long(ms.GetPhysFree()/1024/1024) << std::endl ; free_M = u_32(ms.GetPhysFree ()/1024/1024) ; memAry.at(index) = pAlloc ; ::Sleep_ms(1000) ; index++ ; if (ngCount > 100) { break ; } } for (index=0 ; index<free_M ; index++) { void* pAlloc = memAry.at(index) ; free(pAlloc) ; } } return 0; }
/LARGEADDRESSAWARE を有効にすることで 4 GB まで確保できている.
Microsoft Windows [Version 10.0.18362.592] (c) 2019 Microsoft Corporation. All rights reserved. C:\Users\Iwao>C:\Temp\TestCPP\t_mem\t_m_stat\release.080\T_m_stat.exe 3845 961 961 3844 480 1441 3847 240 1681 3845 120 1801 3845 120 1921 3845 60 1981 3837 15 1996 3836 7 2003 3830 7 2010 3830 7 2017 3831 3 2020 3826 3 2023 3826 This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. C:\Users\Iwao>C:\Temp\TestCPP\t_mem\t_physf\release.080\T_PhysF.exe 3814 1907 1907 3814 953 2860 3801 476 3336 3799 238 3574 3799 119 3693 3800 119 3812 3790 119 3931 3789 59 3990 3788 29 4019 3792 14 4033 3787 14 4047 3787 7 4054 3787 7 4061 3786 3 4064 3778 3 4067 3781 3 4070 3781 3 4073 3781 This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. C:\Users\Iwao>
以下は,デバッグ版とリリース版での違い.
C:\Users\Iwao>C:\Temp\TestCPP\t_mem\t_physf\debug.080\T_PhysF.exe 4606 1151 1151 3461 1151 2302 2300 575 2877 1713 575 3452 1188 287 3739 915 143 3882 758 71 3953 671 35 3988 629 17 4005 600 17 4022 582 17 4039 554 8 4047 566 8 4055 554 8 4063 539 4 4067 527 C:\Users\Iwao>C:\Temp\TestCPP\t_mem\t_physf\release.080\T_PhysF.exe 4406 1101 1101 4394 1101 2202 4401 550 2752 4393 550 3302 4403 275 3577 4403 137 3714 4403 68 3782 4403 68 3850 4403 68 3918 4402 34 3952 4502 34 3986 4503 17 4003 4501 17 4020 4502 17 4037 4499 17 4054 4498 8 4062 4499 8 4070 4498 4 4074 4497 This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. C:\Users\Iwao>
2020/02/05
(VS)\VC\bin\EditBin.exe でも同様の設定ができるみたい.
EDITBIN リファレンス
“C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\editbin.exe” /LARGEADDRESSAWARE C:\Users\Iwao\AppData\Local\Temp\i_Tools.tmp\CopyNewF\20200204\T_Phys_L.exe
2020/02/14
確保したメモリのアドレスを表示する様にしてみた.
Microsoft Windows [Version 10.0.18362.657] (c) 2019 Microsoft Corporation. All rights reserved. C:\Users\Iwao>\\TestXP\C_Temp\TestCPP\T_mem\T_m_stat\Release.060\T_m_s_2.exe 2030 1015 1015 2030 0000000000878020 507 1522 2030 000000003ff83020 253 1775 2030 000000005fa90020 126 1901 2029 00000000772a7020 63 1964 2029 000000006f7a6020 15 1979 1950 00000000736b7020 15 1994 1947 0000000074f65020 7 2001 1949 0000000075e73020 7 2008 1949 000000007f0b6020 3 2011 1946 0000000074868020 3 2014 2007 0000000074b7d020 3 2017 2009 000000007658e020 3 2020 2010 0000000076890020 3 2023 2011 000000007f7cb020 3 2026 2012 000000007fada020 1 2027 2013 00000000005f2020 1 2028 2013 00000000745c8020 1 2029 2013 0000000076e05020 1 2030 2013 0000000076f14020 abnormal program termination C:\Users\Iwao>\\TestXP\C_Temp\TestCPP\T_mem\T_m_stat\Release.060\T_m_s_4.exe 1935 967 967 1935 000000000087a020 967 1934 1996 000000007fff7020 967 2901 1996 ffffffffbc70c020 483 3384 1995 000000003cf8e020 241 3625 1996 000000005b293020 120 3745 1997 000000006a3a8020 120 3865 1994 00000000772aa020 60 3925 1996 fffffffff8e1d020 30 3955 1996 0000000071bbc020 30 3985 1996 fffffffffca2c020 15 4000 1874 0000000074f66020 15 4015 1832 000000007eab8020 15 4030 1996 fffffffffe838020 7 4037 2102 00000000739cd020 7 4044 2139 0000000075e7e020 3 4047 2181 00000000740dc020 3 4050 2254 00000000743ed020 3 4053 2255 0000000074868020 3 4056 2255 0000000074b76020 3 4059 2261 0000000076583020 3 4062 2372 000000007689f020 3 4065 2371 000000007f9c0020 3 4068 2371 000000007fcd5020 3 4071 2371 ffffffffff743020 3 4074 2372 ffffffffffa50020 1 4075 2372 00000000006ec020 1 4076 2296 0000000076e04020 1 4077 2296 0000000076f19020 abnormal program termination C:\Users\Iwao>
VC 6 C2059 C2091 C2809 C2954
2001/11 作成のプロジェクトをビルドしたらよくわからないエラー.
--------------------構成: MsgStCon - Win32 Debug-------------------- コンパイル中... MsgStCon.cpp c:\program files\microsoft visual studio\vc98\include\memory(16) : error C2059: 構文エラー : 'string' c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2091: 関数は関数を返せません。 c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2809: 'operator new' に仮引数リストがありません。 c:\program files\microsoft visual studio\vc98\include\memory(20) : error C2954: テンプレートの定義はネストできません。 cl.exe の実行エラー MsgStCon.obj - エラー 4、警告 0
ソースの先頭付近に #include <memory> を追加.
#include "StdAfx.h" #include "MsgStCon.h" #include <memory> // ① OK #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include <memory> // ② NG // ...
②の位置では現象は変わらず.①の位置に追加する必要がある.
2023/03/24
error C2061 , C2091 , C2809 , C2556
漢字を含むソースのテスト
’90 年代前半の頃は JIS と シフトJIS のソースを扱っていた.
そのプロジェクトの最初の頃は,ターゲット環境のみでソースを管理していた.
0x1c 0x2d 漢字 0x1c 0x2e の形式.wiki 漢字シフトコード
途中からソース管理は PC-9801DA などに移行してシフトJIS になった.
ターゲット環境に移す時,ソースのコピーとシフトJIS から JIS への変換を行っていた.
Linux 環境を意識し始めてから新規に書いた共通のコードは 7 ビットの範囲にしている.
Windows AP であれば rc ファイルの STRINGTABLE が使用できるが,これにあたるものをどうするか?
まず一番簡単な方法の漢字を含むソースでの動作をテストしてみた.
この中の ccc(const char* s) の部分はまだ暫定的なコードで,登録されたテーブルから対応する JPN を求めるもの.
#include <clocale> #include <iostream> #include "i_define.hxx" #include "_tdefine.hxx" #include "ccc_mlg.hxx" bool test (void) { ccc_mlg* cm = ::get_ccc_mlg() ; { ccc_mlg_1 cm_1 ; cm_1.Name = _T("Name_1") ; cm_1.JPN = _T("名称 1") ; ccc_mlg_1 cm_2 ; cm_2.Name = _T("Name_2") ; cm_2.JPN = _T("名称 2") ; ccc_mlg_1 cm_3 ; cm_3.Name = _T("Name_3") ; cm_3.JPN = _T("名称 3") ; ccc_mlg_1 cm_4 ; cm_4.Name = _T("Name_4") ; cm_4.JPN = _T("名称 4") ; ccc_mlg_1 cm_5 ; cm_5.Name = _T("Name_5") ; cm_5.JPN = _T("名称 5") ; cm->push_back(cm_1) ; cm->push_back(cm_2) ; cm->push_back(cm_3) ; cm->push_back(cm_4) ; cm->push_back(cm_5) ; } std::tout << ccc("Name_3") << std::endl ; return true ; } int _tmain(int argc, TCHAR* argv[]) { _tsetlocale(LC_ALL,_T("")) ; test() ; return 0 ; }
「gcc 漢字 shiftjis」で検索すると -finput-charset で文字コードを指定できるとある.
pi@raspberrypi:~/projects/cc_ml_1 $ g++ cc_ml_1.cpp pi@raspberrypi:~/projects/cc_ml_1 $ ./a.out ���� 3 pi@raspberrypi:~/projects/cc_ml_1 $ g++ -finput-charset=SJIS-WIN cc_ml_1.cpp pi@raspberrypi:~/projects/cc_ml_1 $ ./a.out 名称 3 pi@raspberrypi:~/projects/cc_ml_1 $
-finput-charset=SJIS ではよくわからないエラーになる.
cp932 でも良さそう.
Synology NAS DS116 は g++ の-finput-charset の指定では変換できないみたい.
Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ g++ cc_ml_1.cpp -Wall Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ ll total 72 drwxrwxrwx+ 3 Iwao users 4096 Jan 16 22:01 . drwxrwxrwx+ 10 Iwao users 4096 Jan 16 21:36 .. -rwxrwxrwx 1 Iwao users 50452 Jan 16 22:01 a.out drwxrwxrwx+ 2 Iwao users 4096 Jan 16 21:53 bak -rwxrwxrwx+ 1 Iwao users 2001 Jan 16 22:00 cc_ml_1.cpp Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ ./a.out 3 Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ uconv -f sjis cc_ml_1.cpp > dd.cpp Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ g++ dd.cpp Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ ./a.out 名称 3 Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ g++ -finput-charset=SJIS cc_ml_1.cpp cc1plus: error: conversion from SJIS to UTF-8 not supported by iconv Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ g++ -finput-charset=sjis cc_ml_1.cpp cc1plus: error: conversion from sjis to UTF-8 not supported by iconv Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$ iconv -sh: iconv: command not found Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_1$
Windows , Linux 共通の c++ コード
3 年位前から,少しずつ Windows や Linux に依存しない c++ のコードを書く様にしている.
ソースファイルの文字コードと改行コードは 7 ビットの範囲で crlf にしている.
.sh などは lf でないとうまくない.
html などの場合は UTF-8 .
扱うファイル名も 7 ビットの範囲に限定している.
これで UI を伴わない範囲ではほぼうまく機能している.
次のページからのリンク先で WebGL を使用したサーバのコードはソースレベルで互換性あり.
https://itl.mydns.jp/i_Tools/
他に Windows 専用のコードとの区別のため,ファイル名を小文字に.
これは Linux では大文字,小文字が区別されるため.
今回既存の AP ドキュメントを扱うことに.
Windows でいう「シフト JIS」と「UNICODE」のテキストファイル.
他に UTF-8 のファイルもあるが対応する必要性は未定.
UTF-8 ファイルは Windows のコードでは書いているが,テスト用に存在するのみ.
今までの Windows のコード(tstrmbwc.hxx)では _T や _UNICODE の有無でうまく機能している.
読み込んだ時に _UNICODE の有無でそれぞれの文字コードで保持すればほぼ OK .
「ほぼ」というのは「㎥」の様にシフト JIS にない文字は失われてしまうため.
他にもサロゲートペアにはうまく対応できていない.
Linux でも同様に考えると,読み込んだ時に UTF-8 にすれば良さそう.
wchar_t もあるみたいだが今の時点では考慮しないことにする.
と,思ってテスト用のコードを書いてみたがうまく動作しない.
恐らく変換関連の考え方が理解できていないため.
2020/02 「文字コードを変更してコピー」するツール
https://i–tools.blogspot.com/2020/02/copycc202001.html
GLUT でテクスチャ表示
今度はテクスチャ.次の様なコードで面に貼り付け.
#include "glut_cg.hxx" #include "gonsprmt.hxx" #include "i_dib_f.hxx" i_DIB tex_01 ; int main(int argc, char* argv[]) { { tstring test_bmp = _T("./Tex01.bmp") ; // test_bmp = _T("/run/user/1000/gvfs/smb-share:server=ds116.local,share=web/i_Tools/Doc/blog/3D_Data/Tex01.bmp") ; #ifdef _MSC_VER test_bmp = _T("//DS116/web/i_Tools/Doc/blog/3D_Data/Tex01.bmp") ; #endif tex_01 = ::DIB_Load(test_bmp.c_str()) ; } { GonsA gnsa ; { Gons1 box = ::Gons_Box(Vd3(5,0,5)) ; box.SetColor(0xffffff) ; gnsa.push_back(box) ; } ::set_GonsA(gnsa) ; ::set_Extent(::GonsA_GetExtent(gnsa)) ; { C_glut* gm = ::get_c_glut() ; gm->BG = Vd4(0.9) ; gm->EP = Vd3(0,-10,0) ; } } ::glutInitWindowPosition(200,100) ; ::glutInitWindowSize (600,600) ; ::glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) ; ::glutInit (&argc,argv) ; ::glutCreateWindow (argv[0]) ; ::glutReshapeFunc (cv_resize) ; ::glutDisplayFunc (cg_display) ; ::glutKeyboardFunc (cv_keyboard) ; ::glutMouseFunc (cv_mouse) ; ::glutMotionFunc (cv_motion) ; ::cv_init () ; { ::glPixelStorei(GL_UNPACK_ALIGNMENT,1) ; ::glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,tex_01.GetWidth(),tex_01.GetHeight(),0,GL_RGB,GL_UNSIGNED_BYTE,tex_01.GetP_Bits()) ; ::glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST) ; ::glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST) ; ::glEnable(GL_TEXTURE_2D) ; } ::glutMainLoop () ; return 0 ; }
::glTexImage2D の指定と Tex01.bmp の形式が合っていないため
32 ビット色の画像なので ::glTexImage2D の GL_RGB を GL_RGBA に.
色の順番が違うので ::glTexImage2D を見ると GL_BGRA_EXT があったのでこれを指定.
OpenGL 線を表示すると途切れる?
線の配列から連続線に変更して OpenGL で表示すると途切れた表示になってしまった.
線分として表示していた時のコード
for (size_t lIndex=0 ; lIndex<lins.size() ; lIndex++) { Vl2 ln = lins[lIndex] ; Vd3 p0 = ::Vx_get(pnts,ln.x) ; Vd3 p1 = ::Vx_get(pnts,ln.y) ; ::glBegin(GL_LINES) ; { ::glVertex(p0....) ; ::glVertex(p1....) ; } ::glEnd() ; }
途切れてしまったコード
for (size_t lIndex=0 ; lIndex<lins.size() ; lIndex++) { v_long lin = lins[lIndex] ; ::glBegin(GL_LINES) ; // ::glBegin(GL_LINE_STRIP) ; for (size_t vIndex=0 ; vIndex<lin.size() ; vIndex++) { long ln = lin[vIndex] ; Vd3 pt = ::Vx_get(pnts,ln) ; ::glVertex(pt....) ; } ::glEnd() ; }
原因は glBegin の指定が GL_LINES のままだった.
GL_LINE_STRIP に修正して意図した表示になった.
OpenGL Programming Guide
Chapter 2 State Management and Drawing Geometric Objects
VS 2019 Raspberry Pi への接続で…
VS 2019 の「オプション」-「クロスプラットフォーム」-…-「リモートヘッダー…」の「更新」を選択すると,
エラーが発生しました。Could not connect to the remote system or the connection was lost。詳細については、C:\Users\Iwao\AppData\Local\Temp\vslinux_header_update_log.txt を参照してください。トラブルシューティングについては、https://aka.ms/AA23jat をご覧ください。
SSH コマンドで接続しようとするとやはり接続できない.IP では可能.
Microsoft Windows [Version 10.0.18362.418] (c) 2019 Microsoft Corporation. All rights reserved. C:\Users\Iwao>ssh -l pi raspberrypi ssh: Could not resolve hostname raspberrypi: \202\273\202\314\202\346\202\244\202\310\203z\203X\203g\202\315\225s\226\276\202\305\202\267\201B C:\Users\Iwao>ssh -l pi 192.168.1.36 pi@192.168.1.36's password: Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Nov 12 17:04:32 2019 SSH is enabled and the default password for the 'pi' user has not been changed. This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password. pi@raspberrypi:~ $
UWP アプリ
2016/03 に試してうまく動作しなかった UWP アプリ.
一度起動するがすぐにエラーメッセージ.
—————————
Microsoft Visual Studio
—————————
Windows ストア アプリ ‘5a7750b3-af94-47d7-a064-b9adc49f8813_7r65t4tynye04!App’ をアクティブにできません。アクティベーション要求がエラー ‘操作はサポートされていません。不明なエラー: 0x80040904’ で失敗しました。
この問題のトラブルシューティングについては、ヘルプを参照してください。
—————————
OK ヘルプ
—————————
「そんなもん」と思い触らないでいたが,DirectX があったので今の開発機で試してみた.
するとうまく動作する.
どこかの設定が違うのだろうか?それともライセンスの関係?