ホーム » gcc (ページ 2)
「gcc」カテゴリーアーカイブ
TS-253D 再セットアップ – 3
Entware のインストール.前回 と同様だが少し画像と説明を追加.
「App Center」を開き,右上の「設定(歯車マーク)」をクリック.「アプリリポジトリ」タブを選択.
「追加」を押して「OPKG Store」の URL「 https://www.qnapclub.eu/en/repo.xml 」を入力.
ログイン情報は不要.
https://www.qnapclub.eu/en/howto/1
左のアイコンに「OPKG Store」が増える.選択して「すべてのアプリ」.検索ボックスに「Entware」と入力.
「Entware-std」をインストール.
これで opkg コマンドが使える様になる.
ASUSTOR NAS で作成した .out は,この段階で動作する様になるみたい.
gcc と python3 などのインストール
admin で入ったコンソール で,
opkg install gcc
opkg install python3
他に tree , mc なども.
https://jml.mish.work/various/nas/qnap-nas.html
https://jml.mish.work/various/nas.html
2023/01/11
//qnapclub.eu/ にうまく接続できないので…
https://www.qnapclub.eu/en/repo.xml
https://www.qnapclub.eu/en/howto/1
TS-253D セットアップ – 6
以前調べた時は,Synology NAS と同様に面倒だと思ったが…
検索すると
QNAPにEntware-stdをインストールする
Microsoft Windows [Version 10.0.18362.1016] (c) 2019 Microsoft Corporation. All rights reserved. C:\Users\Iwao>\\WDCloud\Public\Document\bat\ssh_ts253d.bat C:\Users\Iwao>cd C:\Users\Iwao\AppData\Local\Temp C:\Users\Iwao\AppData\Local\Temp>ssh -l Iwao -p 22 ts253d Iwao@ts253d's password: [Iwao@TS253D ~]$ gcc -sh: gcc: command not found [Iwao@TS253D ~]$ opkg -sh: opkg: command not found [Iwao@TS253D ~]$ /opt/bin/opkg opkg must have one sub-command argument usage: opkg [options...] sub-command [arguments...] where sub-command is one of: Package Manipulation: update Update list of available packages upgrade <pkgs> Upgrade packages install <pkgs> Install package(s) configure <pkgs> Configure unpacked package(s) remove <pkgs|regexp> Remove package(s) flag <flag> <pkgs> Flag package(s) <flag>=hold|noprune|user|ok|installed|unpacked (one per invocation) ... regexp could be something like 'pkgname*' '*file*' or similar e.g. opkg info 'libstd*' or opkg search '*libop*' or opkg remove 'libncur*' [Iwao@TS253D ~]$ [Iwao@TS253D ~]$ /opt/bin/opkg install gcc Installing gcc (7.4.0-5) to root... Downloading http://bin.entware.net/x64-k3.2/gcc_7.4.0-5_x64-3.2.ipk Installing zlib (1.2.11-3) to root... Downloading http://bin.entware.net/x64-k3.2/zlib_1.2.11-3_x64-3.2.ipk Collected errors: * wfopen: //opt/lib/opkg/info/zlib.control: Permission denied. * extract_archive: Cannot create symlink from ./opt/lib/libz.so to 'libz.so.1': Permission denied. * extract_archive: Cannot create symlink from ./opt/lib/libz.so.1 to 'libz.so.1.2.11': Permission denied. * wfopen: /opt/lib/libz.so.1.2.11: Permission denied. * pkg_write_filelist: Failed to open //opt/lib/opkg/info/zlib.list: Permission denied. * opkg_install_pkg: Failed to extract data files for zlib. Package debris may remain! * opkg_install_cmd: Cannot install package gcc. * opkg_conf_write_status_files: Can't open status file //opt/lib/opkg/status: Permission denied. * opkg_conf_write_status_files: Can't open status file /opt/tmp//opt/lib/opkg/status: Permission denied. [Iwao@TS253D ~]$
sudo -i としても入れない.方法がわからなかったので admin で入ることに.
C:\Users\Iwao>ssh -l Iwao ts253d Iwao@ts253d's password: [Iwao@TS253D ~]$ sudo -i Password: Iwao is not in the sudoers file. This incident will be reported. [Iwao@TS253D ~]$ [Iwao@TS253D ~]$ [Iwao@TS253D ~]$ exit logout Connection to ts253d closed. C:\Users\Iwao>ssh -l admin ts253d admin@ts253d's password: [~] # [~] # [~] #
[/opt/bin] # opkg install gcc
Installing gcc (7.4.0-5) to root...
Downloading http://bin.entware.net/x64-k3.2/gcc_7.4.0-5_x64-3.2.ipk
Installing zlib (1.2.11-3) to root...
Downloading http://bin.entware.net/x64-k3.2/zlib_1.2.11-3_x64-3.2.ipk
Installing libiconv-full (1.11.1-4) to root...
Downloading http://bin.entware.net/x64-k3.2/libiconv-full_1.11.1-4_x64-3.2.ipk
Installing libintl-full (0.19.8.1-2) to root...
Downloading http://bin.entware.net/x64-k3.2/libintl-full_0.19.8.1-2_x64-3.2.ipk
Installing libbfd (2.27-1) to root...
Downloading http://bin.entware.net/x64-k3.2/libbfd_2.27-1_x64-3.2.ipk
Installing libopcodes (2.27-1) to root...
Downloading http://bin.entware.net/x64-k3.2/libopcodes_2.27-1_x64-3.2.ipk
Installing objdump (2.27-1) to root...
Downloading http://bin.entware.net/x64-k3.2/objdump_2.27-1_x64-3.2.ipk
Installing ar (2.27-1) to root...
Downloading http://bin.entware.net/x64-k3.2/ar_2.27-1_x64-3.2.ipk
Installing binutils (2.27-1) to root...
Downloading http://bin.entware.net/x64-k3.2/binutils_2.27-1_x64-3.2.ipk
Configuring zlib.
Configuring libiconv-full.
Configuring libintl-full.
Configuring libbfd.
Configuring libopcodes.
Configuring objdump.
Configuring ar.
Configuring binutils.
Configuring gcc.
There are no *-dev packages in Entware(with few exceptions)!
Please install headers as described in the wiki:
https://github.com/Entware/Entware/wiki
[/opt/bin] #
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 $
Python から C の呼出し – 2
先日 Python から C を呼び出す関係を調べていて Synology NAS に Python.h がなかった.
検索 をかけると DSM「パッケージ センター」-「Python3」では python-dev が入ってないらしい.
次の様な手順で python-dev をインストール.
# sudo -i
# cd /var/services/homes/Iwao/
# source ./set_ds_inc.sh
# opkg install python-dev
# opkg install python3-dev
コンパイルで必要なファイルは次の所に入った.
/volume1/@entware-ng/opt/include/python3.6/Python.h
/volume1/@entware-ng/opt/include/python2.7/Python.h
Iwao@DS116:~/pyt_test/call_c/call_cpp/g3d_to$ g++ g3d_to.cpp -Wall -fPIC -o g3d_to.so -shared g3d_to.cpp:9:20: fatal error: Python.h: No such file or directory ^ compilation terminated. Iwao@DS116:~/pyt_test/call_c/call_cpp/g3d_to$ g++ g3d_to.cpp -Wall -fPIC -o g3d_to.so -shared -I /volume1/@entware-ng/opt/include/python3.6/ Iwao@DS116:~/pyt_test/call_c/call_cpp/g3d_to$ ll total 9568 drwxrwxrwx+ 3 Iwao users 4096 Aug 5 10:29 . drwxrwxrwx+ 3 Iwao users 4096 Aug 5 09:50 .. -rwxrwxrwx+ 1 Iwao users 3941375 May 7 18:03 3887.imo -rwxrwxrwx+ 1 Iwao users 1241865 Jul 7 15:13 7801.imo drwxrwxrwx+ 2 Iwao users 4096 Aug 5 10:29 bak -rwxrwxrwx+ 1 Iwao users 1688 Aug 4 15:04 g3d_to.cpp -rwxrwxrwx 1 Iwao users 2654136 Aug 5 10:29 g3d_to.so -rwxrwxrwx+ 1 Iwao users 1644 Aug 7 2019 gons_to.cpp -rwxrwxrwx 1 Iwao users 1931244 Aug 5 10:17 gons_to.out Iwao@DS116:~/pyt_test/call_c/call_cpp/g3d_to$ python3 Python 3.6.2 (default, Jan 11 2018, 10:32:53) [GCC 6.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import g3d_to >>> dir(g3d_to) ['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'gons_to', 'load', 'save'] >>> g3d_to.load("./7801.imo") >>> g3d_to.save("./7801.stl") >>> g3d_to.save("./7801.ac") >>> Iwao@DS116:~/pyt_test/call_c/call_cpp/g3d_to$ ll total 10252 drwxrwxrwx+ 3 Iwao users 4096 Aug 5 10:31 . drwxrwxrwx+ 3 Iwao users 4096 Aug 5 09:50 .. -rwxrwxrwx+ 1 Iwao users 3941375 May 7 18:03 3887.imo -rwxrwxrwx+ 1 Iwao users 438369 Aug 5 10:31 7801.ac -rwxrwxrwx+ 1 Iwao users 1241865 Jul 7 15:13 7801.imo -rwxrwxrwx+ 1 Iwao users 254784 Aug 5 10:31 7801.stl drwxrwxrwx+ 2 Iwao users 4096 Aug 5 10:29 bak -rwxrwxrwx+ 1 Iwao users 1688 Aug 4 15:04 g3d_to.cpp -rwxrwxrwx 1 Iwao users 2654136 Aug 5 10:29 g3d_to.so -rwxrwxrwx+ 1 Iwao users 1644 Aug 7 2019 gons_to.cpp -rwxrwxrwx 1 Iwao users 1931244 Aug 5 10:17 gons_to.out Iwao@DS116:~/pyt_test/call_c/call_cpp/g3d_to$
Python から CPP の呼出し – 2
予めデータ(vv_PLF)を作成して,必要に応じてファイルに出力するコード.
vv_PLF* get_vv_PLF (void) { static vv_PLF G_PLF ; return &G_PLF ; } static PyObject* check_rd (PyObject* self, PyObject* args) { vv_PLF* gvv_plf = get_vv_PLF() ; vv_PLF vv_plf_ = ::Check_Revise_deg() ; *gvv_plf = vv_plf_ ; return Py_None ; } static PyObject* dump_svg (PyObject* self, PyObject* args) { vv_PLF* gvv_plf = get_vv_PLF() ; ::Dump_SVG(*gvv_plf) ; return Py_None ; } static PyObject* dump_ipl (PyObject* self, PyObject* args) { vv_PLF* gvv_plf = get_vv_PLF() ; ::Dump_ipl(*gvv_plf) ; return Py_None ; }
Python 側では
* check_rd でデータを作成.
* dump_svg などでデータを出力.
3D データを読み込んで,指定されたファイル名(拡張子により形式を判断)で出力.
static PyObject* load (PyObject* self, PyObject* args) { const char* str_file = NULL ; if (!PyArg_ParseTuple(args,"s",&str_file)) { return NULL ; } tstring g3_file = str_file ; GonsA gnsa = ::To_GonsA(g3_file.c_str()) ; set_GonsA(gnsa) ; return Py_None; } static PyObject* save (PyObject* self, PyObject* args) { const char* str_file = NULL ; if (!PyArg_ParseTuple(args,"s",&str_file)) { return NULL ; } tstring g3_file = str_file ; GonsA* gnsa = ::get_GonsA() ; ::GonsA_To(*gnsa,g3_file.c_str()) ; return Py_None; } static PyObject* gons_to (PyObject* self, PyObject* args) { const char* str_file = NULL ; if (!PyArg_ParseTuple(args,"s",&str_file)) { return NULL ; } tstring g3_file = str_file ; gons_to(g3_file.c_str()) ; return Py_None; }
Python から CPP の呼出し
雰囲気はつかめてきたので,以前作成した cpp を呼んでみることに…
実際の処理部分は C++ のコードだが,呼び出しは C の関数.
また引数もない状態なので,C 関数の system(“a.out”) と呼んでいるのと同様.
#include "i_rd_dbg.hxx" int _tmain(int argc, TCHAR* argv[]) { ::Test_Revise_deg() ; return 0 ; }
#include <Python.h> #include "i_rd_dbg.hxx" #include "messbar.cxx" static PyObject* call_cpp(PyObject* self, PyObject* args) { ::Test_Revise_deg() ; return Py_None ; } static PyMethodDef myMethods[] = { { "_call_cpp_", call_cpp, METH_NOARGS, "call cpp" }, { NULL }, } ; static struct PyModuleDef call_mod = { PyModuleDef_HEAD_INIT, "call_mod", "call_cpp module", -1, myMethods } ; PyMODINIT_FUNC PyInit_call_mod(void) { return PyModule_Create(&call_mod) ; }
コンパイルして import まではできたが,メソッドをうまく呼び出せない.
>>> call_mod.call_cpp()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module ‘call_mod’ has no attribute ‘call_cpp’
>>>
それで,メソッドを表示できないかと思い検索すると,
python でメソッドの一覧を取得する方法
他に dir(call_mod) もあった.
Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/call_cpp/T_Rvs_sc $ g++ rvs_sc_w.cpp -o call_mod.so -fPIC -Wall -shared -I /volume1/.@plugins/AppCentral/python3/include/python3.7m/ Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/call_cpp/T_Rvs_sc $ Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/call_cpp/T_Rvs_sc $ 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 call_mod >>> call_mod.call_cpp Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'call_mod' has no attribute 'call_cpp' >>> call_mod.call_cpp() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: module 'call_mod' has no attribute 'call_cpp' >>> obj = call_mod >>> import inspect >>> for m in inspect.getmembers(obj): ... print(m) ... ('__doc__', 'call_cpp module') ('__file__', '/volume1/home/Iwao/test/test_py/call_c/call_cpp/T_Rvs_sc/call_mod.so') ('__loader__', <_frozen_importlib_external.ExtensionFileLoader object at 0x7f5a1a35ec50>) ('__name__', 'call_mod') ('__package__', '') ('__spec__', ModuleSpec(name='call_mod', loader=<_frozen_importlib_external.ExtensionFileLoader object at 0x7f5a1a35ec50>, origin='/volume1/home/Iwao/test/test_py/call_c/call_cpp/T_Rvs_sc/call_mod.so')) ('_call_cpp_', <built-in function _call_cpp_>) >>> call_mod._call_cpp_() >>>
Python から C の呼出し
C のコードを Python から呼出せないかと…
Python のドキュメントとしては次の所にある
C や C++ による Python の拡張
Win10 C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\include\Python.h debian10 /usr/include/python3.7/Python.h AS5202T /volume1/.@plugins/AppCentral/python3/include/python3.7m/Python.h Iwao@AS5202T:/volume1/.@plugins/AppCentral/python3/include/python3.7m $ find / -name Python.h /volume1/.@plugins/AppCentral/linux-center/containers/debian10/rootfs/usr/include/python2.7/Python.h /volume1/.@plugins/AppCentral/linux-center/containers/debian10/rootfs/usr/include/python3.7m/Python.h /volume1/.@plugins/AppCentral/python/include/python2.7/Python.h /volume1/.@plugins/AppCentral/python3/include/python3.7m/Python.h
検索 して見つけたもの.
https://www.fsi-embedded.jp/kumico/columns/?cat=python
https://qiita.com/donkonishi/items/b7825b34d0711e336c61
https://www.quark.kj.yamagata-u.ac.jp/~hiroki/python/?id=19
http://owa.as.wakwak.ne.jp/zope/docs/Python/BindingC/
https://cpp-learning.com/?s=”Python+C+API”
Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello/bak $ cat hellWrap.c #include <Python.h> extern int add(int, int); extern void out(const char*, const char*); PyObject* hello_add(PyObject* self, PyObject* args) { int x, y, g; if (!PyArg_ParseTuple(args, "ii", &x, &y)) return NULL; g = add(x, y); return Py_BuildValue("i", g); } PyObject* hello_out(PyObject* self, PyObject* args, PyObject* kw) { const char* adrs = NULL; const char* name = NULL; static char* argnames[] = {"adrs", "name", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kw, "|ss", argnames, &adrs, &name)) return NULL; out(adrs, name); return Py_BuildValue(""); } static PyMethodDef hellomethods[] = { {"add", hello_add, METH_VARARGS}, {"out", hello_out, METH_VARARGS | METH_KEYWORDS}, {NULL} }; void initchello(){ Py_InitModule("hello", hellomethods); } Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello/bak $ gcc -fPIC -Wall -c -o hellWrap.o hellWrap.c -I /volume1/.@plugins/AppCentral/python/include/python2.7/ hellWrap.c:30:13: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types] {"out", hello_out, METH_VARARGS | METH_KEYWORDS}, ^~~~~~~~~ hellWrap.c:30:13: note: (near initialization for 'hellomethods[1].ml_meth') Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello/bak $ gcc -fPIC -Wall -c -o hellWrap.o hellWrap.c -I /volume1/.@plugins/AppCentral/python/include/python2.7/ Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello/bak $
PyMethodDef の所でエラーとなっていていろいろと探すと,型を指定しているものがあり,それを指定.
https://bty.sakura.ne.jp/wp/archives/83
static PyMethodDef hellomethods[] = { {"add", (PyCFunction)hello_add, METH_VARARGS}, {"out", (PyCFunction)hello_out, METH_VARARGS | METH_KEYWORDS}, {NULL} };
コンパイルは通る様になった.
Python から試そうとすると …
Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello $ gcc -fPIC -Wall -c -o helloWrap.o helloWrap.c -I /volume1/.@plugins/AppCentral/python/include/python2.7/ Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello $ gcc -fPIC -Wall -shared -o hellomodule.so hello.o helloWrap.o Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello $ ll total 44 drwxrwxrwx 3 Iwao users 4.0K Jul 29 18:16 ./ drwxrwxrwx 5 Iwao users 4.0K Jul 29 15:31 ../ drwxrwxrwx 2 Iwao users 4.0K Jul 29 18:05 bak/ -rwxrwxrwx 1 Iwao users 188 Jul 29 16:29 hello.c* -rw-r--r-- 1 Iwao users 1.6K Jul 29 16:33 hello.o -rwxrwxrwx 1 Iwao users 910 Jul 29 16:32 helloWrap.BAK* -rwxrwxrwx 1 Iwao users 936 Jul 29 16:37 helloWrap.c* -rw-r--r-- 1 Iwao users 3.1K Jul 29 18:16 helloWrap.o -rwxr-xr-x 1 Iwao users 8.3K Jul 29 18:16 hellomodule.so* Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello $ 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 hello Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'hello' >>> exit() Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello $ python Python 2.7.10 (default, Aug 19 2015, 09:18:54) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import hello Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: dynamic module does not define init function (inithello) >>> exit() Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/hello $
まだ何か違うみたい.
メッセージは inithello がないとなっているので helloWrap.c を見直すと…
void initchello() { … } となっている.
関数名を inithello に変更してビルドすると通った.
2020/07/30
今日は次の所を参考にさせてもらって…
https://cpp-learning.com/python_c_api_step1/
Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/py_hello $ gcc ph_hello.c -o mymodule.so -fPIC -Wall -shared -I /volume1/.@plugins/AppCentral/python3/include/python3.7m/ Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/py_hello $ 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 mymodule Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: dynamic module does not define module export function (PyInit_mymodule) >>> import myModule Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'myModule' >>> Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/py_hello $ cp mymodule.so myModule.so Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/py_hello $ ll total 44 drwxrwxrwx 3 Iwao users 4.0K Jul 30 16:49 ./ drwxrwxrwx 6 Iwao users 4.0K Jul 30 14:59 ../ drwxrwxrwx 2 Iwao users 4.0K Jul 30 16:48 bak/ -rwxr-xr-x 1 Iwao users 8.1K Jul 30 16:49 myModule.so* -rwxr-xr-x 1 Iwao users 8.1K Jul 30 16:47 mymodule.so* -rwxrwxrwx 1 Iwao users 188 Jul 29 16:29 ph_hello.BAK* -rwxrwxrwx 1 Iwao users 1.3K Jul 30 16:27 ph_hello.c* Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/py_hello $ 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 myModule >>> myModule.helloworld <built-in function helloworld> >>> myModule.helloworld() Hello World >>> >>> >>> >>> Iwao@AS5202T:/volume1/home/Iwao/test/test_py/call_c/py_hello $
コンパイル時の出力ファイル名 mymodule.so が間違っていた.正しくは myModule.so .
そこ には詳しく書かれているが,自分用にメモ.
PyMethodDef の “メソッド名” は Python 側での (モジュール名).(メソッド名) .
同様に PyModuleDef の “モジュール名” は import 時の名称..so の出力ファイル名も対応している必要がある?
文字列なので,異なっていてもコンパイル時のエラーにはならない.
実行時に見つからないなどのエラーとなる.
2020/07/31
続きの内容をやっていて…
https://cpp-learning.com/python_c_api_step2/
Fatal Python error: GC object already tracked
c_list は Python 側で確保しているため Py_DECREF はうまくないのではないか?
GLUT でのメニュー
GLUT を使用してのテストコードで,起動後データを切替える方法がないかと…
メニューの利用で何とかできるか?
glutCreateMenu などで検索したがわかりやすい情報が少なかった.
https://seesaawiki.jp/w/mikk_ni3_92/d/%b4%f0%cb%dc%ca%d418
https://www.jstage.jst.go.jp/article/itej/67/5/67_417/_pdf
http://opengl.jp/glut/section06.html
以前作成した雛型に対して追加.メニュー部分はほぼリンク先のコードのまま.
https://jml.mish.work/index.php/cpp/cb-glut.html
#include "glut_cb.hxx" #include <iostream> void cb_menu (int val) { std::cout << "menu val=" << val << std::endl ; } int main(int argc, char* argv[]) { ::glutInitWindowPosition(200,100) ; ::glutInitWindowSize (600,400) ; ::glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) ; ::glutInit (&argc,argv) ; ::glutCreateWindow (argv[0]) ; ::glutReshapeFunc (cb_resize) ; ::glutDisplayFunc (cb_display) ; ::glutKeyboardFunc (cb_keyboard) ; ::glutMouseFunc (cs_mouse) ; { ::glutCreateMenu(cb_menu) ; ::glutAddMenuEntry("name 1",1) ; ::glutAddMenuEntry("name 2",2) ; ::glutAddMenuEntry("name 3",3) ; ::glutAttachMenu(GLUT_RIGHT_BUTTON) ; } ::cb_init () ; ::glutMainLoop () ; return 0 ; }
結局はこの方法ではなく,予めリスト化して キー入力 により切り替える方法に.
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 を再起動したり,プロジェクトを読み直したりしていたら通る様になった.
弦と矢と半径 – 2
今度は PHP からの呼び出し.
<?php echo ("call c++\n") ; system ("./a.out") ; echo ("call python\n") ; system ("python r_cs.py") ; ?>
実際の動作を試すには,gcc と python が必要です.
cpp のコンパイルは
g++ -Wall r_cs.cpp
これで ./a.out が作成されます.
python の呼び出しは
python r_cs.py
次の所で,同じ様な結果を表示します.
https://mish.myds.me/…/r_cs/2/
弦と矢と半径
次の様な計算を何かに使えないかと…
/* https://ja.wikipedia.org/wiki/矢_(幾何学) https://en.wikipedia.org/wiki/Circle#Sagitta 弦 c と 矢 s から 半径 r を求める r = (c*c) / (8*s) + s/2 半径 r と 弦 c から 矢 s を求める s = r - sqrt( r*r - (c/2)*(c/2) ) 半径 r と 矢 s から 弦 c を求める c = sqrt( r*r - (r-s)*(r-s) ) * 2 i_func.hxx https://drive.google.com/file/d/1kHadFbhUi9QfGRovMXKYr2xHgcFJAqdZ/view */ double r_cs (const double c , const double s) { return ( ( c*c ) / ( 8*s ) + s/2 ) ; } double s_rc (const double r , const double c) { return ( r-sqrt(r*r - (c/2)*(c/2) ) ) ; } double c_rs (const double r , const double s) { return ( sqrt(r*r - (r-s)*(r-s) )*2 ) ; }
動作を確認するために 3,4,5 や 5,12,13 は知っていたが次のキーワードで検索.
三平方の定理 整数 組み合わせ
https://ja.wikipedia.org/wiki/ピタゴラスの定理
先ず C++ で書いたもの.
#include <cmath> double r_cs (const double c , const double s) { return ( ( c*c ) / ( 8*s ) + s/2 ) ; } double s_rc (const double r , const double c) { return ( r-sqrt(r*r - (c/2)*(c/2) ) ) ; } double c_rs (const double r , const double s) { return ( sqrt(r*r - (r-s)*(r-s) )*2 ) ; } #include <iostream> int main(void){ std::cout << "6 1 5" << std::endl ; std::cout << r_cs(6,1) << std::endl ; std::cout << s_rc(5,6) << std::endl ; std::cout << c_rs(5,1) << std::endl ; std::cout << std::endl ; std::cout << "8 2 5" << std::endl ; std::cout << r_cs(8,2) << std::endl ; std::cout << s_rc(5,8) << std::endl ; std::cout << c_rs(5,2) << std::endl ; std::cout << std::endl ; return 0 ; }
次の所に貼り付けて動作確認できます.
https://paiza.io/ja/
https://wandbox.org/
https://ideone.com/
次は JavaScript .
function r_cs (c , s) { return ( ( c*c ) / ( 8*s ) + s/2 ) ; } function s_rc (r , c) { return ( r-Math.sqrt(r*r - (c/2)*(c/2) ) ) ; } function c_rs (r , s) { return ( Math.sqrt(r*r - (r-s)*(r-s) )*2 ) ; } console.log ("6 1 5") ; console.log (r_cs(6,1)) ; console.log (s_rc(5,6)) ; console.log (c_rs(5,1)) ; console.log ("") ; console.log ("8 2 5") ; console.log (r_cs(8,2)) ; console.log (s_rc(5,8)) ; console.log (c_rs(5,2)) ; console.log ("") ;
Python .
import math def r_cs (c , s) : return ( ( c*c ) / ( 8.*s ) + s/2. ) def s_rc (r , c) : return ( r-math.sqrt(r*r - (c/2)*(c/2) ) ) def c_rs (r , s) : return ( math.sqrt(r*r - (r-s)*(r-s) )*2 ) print ("6 1 5") print (r_cs(6,1)) print (s_rc(5,6)) print (c_rs(5,1)) print ("") print ("8 2 5") print (r_cs(8,2)) print (s_rc(5,8)) print (c_rs(5,2)) print ("")
2020/05/30
r_cs.py の r_cs で「浮動小数点数」として扱われていなかったので修正.
def r_cs (c , s) : return ( ( c*c ) / ( 8.*s ) + s/2. )
PHP から iconv コマンド呼び出し
シフトJIS のデータファイルをアップロードして WebGL で表示のテスト.
PHP から作成した .out を呼び出しているが,その中で文字コードの変換がうまく機能していない.
.out の中では iconv ライブラリを呼び出す.うまく機能しない時は iconv または uconv コマンド.
.out をコンソールから実行した時はうまく機能している.
いろいろと動作を調べていると,次の様なコマンドが PHP から呼出された時うまく機能していない様子.
iconv -f CP932 shiftjis.txt > out_file.txt
コンソールでは OK .
ここまで絞り込むのに 1 日かかった
今回の修正前 Synology NAS では次の様にしていた.
uconv -f sjis -t utf8 shiftjis.txt -o out_file.txt
先日テストしていた時 ASUSTOR NAS ではエラーになったので,単純に -t オプションを取ってしまった.
Iwao@AS5202T:/volume1/Web/Test/mics/tc_xconv $ iconv -f CP932 -t utf8 shiftjis.txt iconv: conversion to utf8 unsupported iconv: try 'iconv -l' to get the list of supported encodings Iwao@AS5202T:/volume1/Web/Test/mics/tc_xconv $
iconv -l を幾つかの環境で調べていると “utf8” の指定がうまくない.
いろいろな環境でうまく機能しそうなのは “UTF-8” .
-t オプションを指定しないとうまくないみたいで,次の様に変更.
iconv -f CP932 -t UTF-8 shiftjis.txt > out_file.txt
これで意図した動作になった.
2020/09/08 変換できない文字が存在した時に止まらない様な指定を追加.
https://mish.myds.me/wordpress/dev/2020/09/07/upload-mbcs-name/
exec_ic.hxx
text_gnc.hxx
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
NAS 日本語ソースのコンパイル
Synology NAS と違い iconv が存在するので,コンパイルの指定で試してみた.
が,うまく動作しない.
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/MsgStr/cc_ml_1 $ which iconv /usr/bin/iconv Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/MsgStr/cc_ml_1 $ g++ -Wall cc_ml_1.cpp -finput-charset=SJIS-WIN cc1plus: error: conversion from SJIS-WIN to UTF-8 not supported by iconv Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/MsgStr/cc_ml_1 $ g++ -Wall cc_ml_1.cpp -finput-charset=SJIS cc1plus: error: conversion from SJIS to UTF-8 not supported by iconv Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/MsgStr/cc_ml_1 $ iconv -f SJIS cc_ml_1.cpp > u8_ml_1.cpp Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/MsgStr/cc_ml_1 $ g++ -Wall u8_ml_1.cpp Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/MsgStr/cc_ml_1 $ ./a.out 名称 3 Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/t_linux/MsgStr/cc_ml_1 $
結局 Synology NAS と同様で,予め UTF-8 に変換しておく必要がある.
iconv -f SJIS-WIN SJ_file.txt ができなかった.
iconv -f CP932 SJ_file.txt ならば通る.
他にも iconv -f SJIS なら通るが,Fedora ではダメだったので CP932 を使用することに.
Windows 上で管理しているソースは,私が作成した次のツールで変換しています.
https://i–tools.blogspot.com/2020/02/copycc202001.html
AS5202T 再セットアップ – 6
gcc などを入れて a.out はできる様になっていたが,今度は Web サーバの PHP からの呼び出し.
Synology NAS や Windows 環境と同じようにやってみたがうまく動作しない.
設定の問題なのか,環境が異なることによる変更が必要なのかは不明.
3 年位前にやった所からもう一度調べていくしかなさそう.
https://dev.mish.work/wordpress/2017/05/23/synology-web-exe/
この時と同じ php が存在するフォルダに存在する ./a.out の呼び出しはうまく動作した.
http://itl.mydns.jp/…/exec.php
htm と php で画像のアップロード.
https://itl.mydns.jp/…/up.htm
http でアクセスした時のユーザ名は admin .
Synology NAS では http .IIS だと IUSER ?
あまり関係ないが PHP 7 をインストール.
Iwao@AS5202T:/volume1/home/Iwao $ which 7z /usr/builtin/bin/7z Iwao@AS5202T:/volume1/home/Iwao $ which zip /usr/builtin/bin/zip Iwao@AS5202T:/volume1/home/Iwao $ which unzip /usr/bin/unzip Iwao@AS5202T:/volume1/home/Iwao $ which convert /usr/builtin/bin/convert Iwao@AS5202T:/volume1/home/Iwao $
フルパスで drawnow を指定すると drawnow.htm は生成される.
https://itl.mydns.jp/i_Tools/tiny/DrawNow/
普通に起動したユーザの場合 %TEMP% が /opt/tmp に設定される.
Web サーバや Synoloty NAS では設定されないので,コードで指定した /tmp になる.
実行ファイルの位置を求める方法がうまくなかった.
$exe = (change_exe ($_SERVER["DOCUMENT_ROOT"] . "/.../" . $exeTitle) ) ; $exe_name = $exeTitle ; $exe_name = change_exe($exe_name) ; $exe = ($_SERVER["DOCUMENT_ROOT"] . "/.../" . $exe_name ) ;
2020/04/21
一部動作しない部分があった(::Linux_zip_create).
原因は bash や pushd がないため.
bash の所は sh に.
「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
NAS g++ で a.out が作成されない?
warning はあるが,エラーの表示はない状態まで修正して g++ .
Iwao@DS116:~/gcc_test/Test/t_linux/t_calc$ g++ t_calc.cpp -Wall In file included from /volume1/public/C_Sync/GoogleD/Develop/_.SRC/_gcc/V2_FuncA.hxx:1:0, from Calc_16.cpp:46, from t_calc.cpp:29: /volume1/public/C_Sync/GoogleD/Develop/_.SRC/__CPR_/v2_funca.hxx: In constructor 'vd2_arc::vd2_arc()': /volume1/public/C_Sync/GoogleD/Develop/_.SRC/__CPR_/v2_funca.hxx:28:9: warning: 'vd2_arc::tc' will be initialized after [-Wreorder] double tc ; ^~ /volume1/public/C_Sync/GoogleD/Develop/_.SRC/__CPR_/v2_funca.hxx:27:9: warning: 'double vd2_arc::ts' [-Wreorder] double ts ; ^~ /volume1/public/C_Sync/GoogleD/Develop/_.SRC/__CPR_/v2_funca.hxx:23:2: warning: when initialized here [-Wreorder] vd2_arc () : lr(0) , tc(0) , ts(0) {} ^~~~~~~ /volume1/public/C_Sync/GoogleD/Develop/_.SRC/__CPR_/v2_funca.hxx: In function 'Vd2 get_point_pie(const Vd2&, const Vd2&, double, double)': /volume1/public/C_Sync/GoogleD/Develop/_.SRC/__CPR_/v2_funca.hxx:263:6: warning: variable 'lm' set but not used [-Wunused-but-set-variable] Vd2 lm = (le-ls) / 2 ; ^~ In file included from t_calc.cpp:29:0: Calc_16.cpp: In member function 'virtual int VarCnv::SetError(LPCTSTR, ...)': Calc_16.cpp:1319:7: warning: variable 'cnt' set but not used [-Wunused-but-set-variable] int cnt ; ^~~ Iwao@DS116:~/gcc_test/Test/t_linux/t_calc$ ls Calc_16.BAK Calc_16.cpp Calc_16.hpp t_calc.BAK t_calc.cpp t_calc.dsp Iwao@DS116:~/gcc_test/Test/t_linux/t_calc$ g++ t_calc.cpp Iwao@DS116:~/gcc_test/Test/t_linux/t_calc$ ls Calc_16.BAK Calc_16.cpp Calc_16.hpp t_calc.BAK t_calc.cpp t_calc.dsp Iwao@DS116:~/gcc_test/Test/t_linux/t_calc$ ll total 248 drwxrwxrwx+ 2 Iwao users 4096 Feb 6 11:46 . drwxrwxrwx+ 16 Iwao users 4096 Feb 6 10:18 .. -rwxrwxrwx+ 1 Iwao users 103036 Feb 6 11:45 Calc_16.BAK -rwxrwxrwx+ 1 Iwao users 103032 Feb 6 11:46 Calc_16.cpp -rwxrwxrwx+ 1 Iwao users 11608 Feb 5 18:53 Calc_16.hpp -rwxrwxrwx+ 1 Iwao users 2756 Feb 6 11:18 t_calc.BAK -rwxrwxrwx+ 1 Iwao users 2420 Feb 6 11:43 t_calc.cpp -rwxrwxrwx+ 1 Iwao users 4420 Feb 5 16:39 t_calc.dsp Iwao@DS116:~/gcc_test/Test/t_linux/t_calc$
なのに a.out が作成されない.
Raspberry Pi で同様に動かすと
pi@raspberrypi:~/projects/t_calc $ g++ t_calc.cpp In file included from t_calc.cpp:29: Calc_16.cpp: In function ‘int ExpDel_Bracket1(TCHAR*, size_t, int, int, char)’: Calc_16.cpp:2152:6: error: ‘_tcspbrk’ was not declared in this scope if (_tcspbrk(val,bracket)==NULL){ return FALSE ; } // ���ʂ����݂��Ȃ����͉������Ȃ� ^~~~~~~~ Calc_16.cpp:2152:6: note: suggested alternative: ‘wcspbrk’ if (_tcspbrk(val,bracket)==NULL){ return FALSE ; } // ���ʂ����݂��Ȃ����͉������Ȃ� ^~~~~~~~ wcspbrk Calc_16.cpp:2161:21: error: ‘_tcsrchr’ was not declared in this scope LPTSTR equStartB = _tcsrchr(tmpLeft,startB) ; // �ŏ��� ')' �ɑΉ����� '(' �̈ʒu�����߂� ^~~~~~~~ Calc_16.cpp:2161:21: note: suggested alternative: ‘_tcschr’ LPTSTR equStartB = _tcsrchr(tmpLeft,startB) ; // �ŏ��� ')' �ɑΉ����� '(' �̈ʒu�����߂� ^~~~~~~~ _tcschr pi@raspberrypi:~/projects/t_calc $
どうも ShiftJIS のコメントが邪魔してかエラーが表示されてないだけみたい.
未定義となっているので正しく宣言して対応.
次は warning .
.../v2_funca.hxx:28:9: warning: 'vd2_arc::tc' will be initialized after [-Wreorder] double tc ; .../v2_funca.hxx:27:9: warning: 'double vd2_arc::ts' [-Wreorder] double ts ; .../v2_funca.hxx:23:2: warning: when initialized here [-Wreorder] vd2_arc () : lr(0) , tc(0) , ts(0) {}
これは,クラス内の変数の宣言と初期化の順番が異なる場合のものらしい.
もう一つの [-Wunused-but-set-variable] は戻り値を使用していないもの.
warning: variable 'lm' set but not used [-Wunused-but-set-variable]
変数を削除して対応.
前後するが 先日のツール で ShiftJIS のソースを UTF-8 に.
Iwao@DS116:~/gcc_test/Test/t_linux/t_calc$ cd test_sj/ Iwao@DS116:~/gcc_test/Test/t_linux/t_calc/test_sj$ ls Calc_16.cpp Calc_16.hpp t_calc.BAK t_calc.cpp Iwao@DS116:~/gcc_test/Test/t_linux/t_calc/test_sj$ g++ t_calc.cpp -Wall Iwao@DS116:~/gcc_test/Test/t_linux/t_calc/test_sj$ ll total 132 drwxrwxrwx+ 2 Iwao users 4096 Feb 6 16:39 . drwxrwxrwx+ 3 Iwao users 4096 Feb 6 16:38 .. -rwxrwxrwx+ 1 Iwao users 103036 Feb 6 14:41 Calc_16.cpp -rwxrwxrwx+ 1 Iwao users 11608 Feb 5 18:53 Calc_16.hpp -rwxrwxrwx+ 1 Iwao users 1821 Feb 6 16:04 t_calc.BAK -rwxrwxrwx+ 1 Iwao users 1841 Feb 6 16:39 t_calc.cpp Iwao@DS116:~/gcc_test/Test/t_linux/t_calc/test_sj$ g++ t_calc.cpp -Wall -finput-charset=SJIS cc1plus: error: conversion from SJIS to UTF-8 not supported by iconv Iwao@DS116:~/gcc_test/Test/t_linux/t_calc/test_sj$ g++ t_calc.cpp -Wall In file included from t_calc.cpp:27:0: Calc_16.cpp: In function 'int ExpDel_Bracket1(TCHAR*, size_t, int, int, char)': Calc_16.cpp:2152:26: error: '_tcspbrk' was not declared in this scope if (_tcspbrk(val,bracket)==NULL){ return FALSE ; } // 括弧が存在しない時は何もしない ^ Iwao@DS116:~/gcc_test/Test/t_linux/t_calc/test_sj$ ll total 136 drwxrwxrwx+ 3 Iwao users 4096 Feb 6 16:46 . drwxrwxrwx+ 3 Iwao users 4096 Feb 6 16:38 .. -rwxrwxrwx+ 1 Iwao users 108716 Feb 6 14:41 Calc_16.cpp -rwxrwxrwx+ 1 Iwao users 12170 Feb 5 18:53 Calc_16.hpp drwxrwxrwx+ 2 Iwao users 4096 Feb 6 16:45 org -rwxrwxrwx+ 1 Iwao users 1841 Feb 6 16:39 t_calc.cpp Iwao@DS116:~/gcc_test/Test/t_linux/t_calc/test_sj$
エラーが表示される.
Linux でのメモリの空き容量の取得
C++ のコードで Linux 環境でのメモリの使用状況 を知りたくなった.
コマンドでは free などがあるが,それと同等のものを取得する関数.
Iwao@DS116:~/gcc_test/Test/t_linux/T_mem/t_mem$ free -h
total used free shared buff/cache available
Mem: 1.0G 695M 29M 49M 281M 162M
Swap: 2.0G 1.0G 1.0G
Iwao@DS116:~/gcc_test/Test/t_linux/T_mem/t_mem$ cat /proc/meminfo
MemTotal: 1030632 kB
MemFree: 16720 kB
Buffers: 9392 kB
Cached: 203592 kB
SwapCached: 227532 kB
Active: 393336 kB
Inactive: 489268 kB
Active(anon): 322836 kB
Inactive(anon): 397436 kB
Active(file): 70500 kB
Inactive(file): 91832 kB
Unevictable: 1408 kB
Mlocked: 1408 kB
SwapTotal: 2097148 kB
SwapFree: 1060108 kB
Dirty: 200 kB
Writeback: 0 kB
AnonPages: 538800 kB
Mapped: 71992 kB
Shmem: 50524 kB
Slab: 89312 kB
SReclaimable: 17608 kB
SUnreclaim: 71704 kB
KernelStack: 4368 kB
PageTables: 14768 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2612464 kB
Committed_AS: 4943664 kB
VmallocTotal: 1039360 kB
VmallocUsed: 6916 kB
VmallocChunk: 961204 kB
Iwao@DS116:~/gcc_test/Test/t_linux/T_mem/t_mem$ ./a.out
16474112
1055367168
Iwao@DS116:~/gcc_test/Test/t_linux/T_mem/t_mem$ cat main.cpp
#include <iostream>
#include <sys/sysinfo.h>
int main ()
{
{
struct sysinfo meminfo ;
::sysinfo(&meminfo);
std::cout << meminfo.freeram << std::endl;
std::cout << meminfo.totalram << std::endl;
}
return 0;
}
Iwao@DS116:~/gcc_test/Test/t_linux/T_mem/t_mem$
最初 getrusage を見つけたが,マニュアルにある様にこの目的では使えない.値は 0 で返ってくる.
次に見つけたのが sysinfo .
Fedora や Raspberry Pi ,Synology NAS で動作することを確認.
- meminfo {...} sysinfo uptime 17198 __kernel_long_t - loads __kernel_ulong_t [3] [0] 35520 __kernel_ulong_t [1] 30240 __kernel_ulong_t [2] 26880 __kernel_ulong_t totalram 2078154752 __kernel_ulong_t freeram 107687936 __kernel_ulong_t sharedram 19849216 __kernel_ulong_t bufferram 145534976 __kernel_ulong_t totalswap 2227171328 __kernel_ulong_t freeswap 2206625792 __kernel_ulong_t procs 468 __u16 pad 0 __u16 totalhigh 0 __kernel_ulong_t freehigh 0 __kernel_ulong_t mem_unit 1 __u32 _f char [0]
漢字を含むソースのテスト – 2
前回のコードで,文字列の部分を #define で指定.
Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_2$ uconv -f SJIS cc_ml_2.cpp #include <clocale> #include <iostream> #include "i_define.hxx" #include "_tdefine.hxx" #include "ccc_mlg.hxx" #define Name_1_ _T("Name_1") #define Name_2_ _T("Name_2") #define Name_3_ _T("Name_3") #define Name_4_ _T("Name_4") #define Name_5_ _T("Name_5") #define Name_1J _T("名称 1") #define Name_2J _T("名称 2") #define Name_3J _T("名称 3") #define Name_4J _T("名称 4") #define Name_5J _T("名称 5") bool test (void) { { ccc_mlg* cm = ::get_ccc_mlg() ; { ccc_mlg_1 cm_1 ; cm_1.Name = Name_1_ ; cm_1.JPN = Name_1J ; ccc_mlg_1 cm_2 ; cm_2.Name = Name_2_ ; cm_2.JPN = Name_2J ; ccc_mlg_1 cm_3 ; cm_3.Name = Name_3_ ; cm_3.JPN = Name_3J ; ccc_mlg_1 cm_4 ; cm_4.Name = Name_4_ ; cm_4.JPN = Name_4J ; ccc_mlg_1 cm_5 ; cm_5.Name = Name_5_ ; cm_5.JPN = Name_5J ; 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_2") << std::endl ; } return true ; } int _tmain(int argc, TCHAR* argv[]) { _tsetlocale(LC_ALL,_T("")) ; test() ; return 0 ; } Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_2$ uconv -f SJIS cc_ml_2.cpp > dd.cpp Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_2$ g++ dd.cpp -Wall Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_2$ ./a.out 名称 2 Iwao@DS116:~/gcc_test/Test/t_linux/cc_ml_2$
#define の部分を別のファイルとして保存.test_ccc.hpp
“㎥” を次の様に指定してみたが,Windows コンソール AP ではうまくいかない.
#define Unit_M_ "Unit_M^3" #ifdef _MSC_VER #ifdef _UNICODE #define Unit_MJ L"\x7acb " L" \x33a5 " L" \x7c73" #else #define Unit_MJ "立米" #endif #else #define Unit_MJ "\xE3\x8E\xA5" #endif
Synology NAS では OK .
文字コードを検索できるサイト
https://www.fileformat.info/info/unicode/char/search.htm
2020/01/20
Windows AP の場合のコードを少し変更.
std::tout << ccc(Name_3_) << std::endl ; std::tout << ccc(Unit_M_) << std::endl ; tstring ccc_str ; ccc_str += ccc(Name_3_) + _T("\r\n") ; ccc_str += ccc(Unit_M_) + _T("\r\n") ; ::MessageBox(NULL,ccc_str.c_str(),_T("Test"),MB_OK) ;
漢字を含むソースのテスト
’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$