2016/01/11

C++ (13) 数式の出力

久々に C++ に取り組んでいます。昨年 Visual Studio 2015 が出たのでインストールしたのですが、Visual Studio 2015 では C++ のレガシープログラムが作れないことが判明し、Visual Studio 2013 (Community) に戻しました。

今回は2進ベクトル CBVector と2進行列 CBMatrix に数式を出力する to_TeX メソッドを追加し、そのテストプログラムを作りました。元々 Java や JavaScript には作りこんでいた機能ですが、C++ では必要ないと思って省略していました。しかしこのようにインターネット上で結果を発表する上であったほうが便利と考え直して今回復活しました。

テストプログラムとしては、まず、Visual Studio 上で動く単体テスト unittest1.cpp に to_TeX メソッドに対するテスト項目を追加しました。

そして、Win32 コンソールプログラム RegressionTest.cpp を全面的に書き直した RegressionHTML.cpp で HTML を出力するようにしました。結果を RegressionHTML 0.1 として公開しました。

HTML に組み込まれた TEX のテキストは JavaScript で書かれた MathJax によって整形されます。

ドキュメントは CppDoc で作成し、GraphGo 0.6 として公開しました。追加された to_TeX メソッドを確認できます。

ソースは CodePlex に公開しました。今回作成した RegerssionHTML.cpp はシフトJISでエンコードしているのですが、CodePlex 上で文字化けすることが分かりました。今後 UTF-8 に変更するかどうか検討します。

Java と JavaScript のときは AptanaStudio で作業していたものを、C++ では Visual Studio で作業していて、ドキュメントや実行結果の HTML をアップロードしたり、プログラムをコンパイル、デバッグしたり、ソースを Git で管理したり、CodePlex に公開 (Push) したり、かなりのことができるようになってきました。ただ、CppDoc は現在は GUI で実行しているので、これも Visual Studio の中からコマンドラインで実行できるようにしていきたいと思います。

今回、C++ で計算した結果を HTML 上に数式として表せるようになりました。

数式の表示

一方 Small Basic で作成した Goban SVG Genarator というプログラムは碁盤の図を SVG として HTML 上に表示できるようにしました。

碁盤の表示

グラフ理論という数学を使っての囲碁プログラムは結構複雑です。数式が何を表しているのか図を使ってなるべく分かりやすく解説していきたいと思います。


| | コメント (0) | トラックバック (0)

2015/01/28

C++ (12) 2進ベクトルのクロス積の実装

2進ベクトルのクラス CBVector と 2進行列のクラス CBMatrix をそれぞれ書き直しました。書き直したコードは CodePlex に GraphGo 0.5 として公開しました。ドキュメントはこちらに公開しました。

CBVector ではビット列を int の配列から 32 ビット固定の bitset に変更しました。これで CBVector のメモリ解放の問題はなくなりました。囲碁で使うのはせいぜい 19 路なので、19 ビット以上あれば困らないだろうということにしました。

さらに戻り値が CBMatrix になる CBVector::cross メソッドを定義しました。これはベクトル同士のクロス積なので結果が行列になります。2つの DLL が相互に参照するケースは Reference を設定しようとした時点でエラーになってしまいます。これを解消するにはビルドの手順を変更する必要があるようです。Visual Studio のビルドの手順を変更するのが難しそうだったので、結局2つのクラスを binarymath.dll という名前の一つの DLL にまとめることにしました。

CBMatrix ではビット列の配列から CBVector の配列に変更し、vector テンプレートを利用しました。メモリの解放がうまくいっているのかどうかは、ちょっと今のところ理解できていません...。

| | コメント (0) | トラックバック (0)

2015/01/27

C++ (11) C++ の動向

先日紹介した『C++とOOPパラダイム』という本は1994年(英語版が1993年)に発行された本です。あまりにも古いので、『C++プログラミング入門 新版』(2001年発行)を入手しました。こちらはC++の基本的な機能を理解できるように詳しく書かれています。

ただこの本も結構古いです。この本を発行しているオライリー・ジャパンのサイトでC++関連の本を検索したところ、7冊発行されていて、この本が一番古いものでした。最新の本『C++クックブック』でも2006年の発行です。

英語版では『Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14』が昨年11月に発行されています。

C++ は UNIX という OS のベースになったC言語を拡張したオブジェクト指向プログラミング言語で、より機械語に近く処理は速いものの泥臭いイメージがありましたが、2000年代から新しい規格が模索されてきました。C++11 とそのマイナーチェンジである C++14 が策定され、現在 C++17 が策定中です。

この新しい C++ は Modern C++ とも呼ばれ、近年さまざまなデバイスが増えてきたこともあり、今後さらに利用者が増えるかもしれません。小さいデバイスほど C++ は威力を発揮しそうです。

Visual Studio 2013 では C++11 の機能をかなり取り込んでいます。MSDN に機能の一覧が公開されています。さらに、C++14 以降については MSDN blog (英語)に予定が掲載されています。

今作成している CBVector クラスは std::bitset というクラスとかなりの部分が重複していることが分かりました。bitset は C++11 以前からあったようです。現時点の CBVector では int の動的配列にビット情報を入れているため、この動的配列のメモリを解放するタイミングがうまくいかず、releaseMem というメソッドを作りました。

例えば (a∧b)∨c を a.and(b).or(c) と記述した場合、a.and(b) の結果が格納されているメモリは .or(c) の演算の前に解放されては困ります。JavaScript の場合、すべてのメモリは自動的に解放され、何の意識もせずにこのような記述で正常に動作していましたが、C++ ではプログラマが気をつけなければなりません。

オブジェクト指向プログラミングなので、物理的なメモリの存在はなるべく基本的なクラスの中に隠ぺいしたいところです。C++11 の shared_ptr は生のポインターとは違い参照カウンターを持っていて参照カウンターが 0 になるまでメモリが保持されます。CBVector は std::bitset と shared_ptr を組み合わせるともっと簡単になりそうです。

Modern な C++ を駆使して、より平易なプログラミングをしていきたいと思います。

| | コメント (0) | トラックバック (0)

2015/01/24

C++ (10) 2進行列クラス CBMatrix と単体テスト

今回は CBMatrix クラスを追加しました。Native Unit Test Project の使い方が分かったので、unittest1.cpp を追加しました。Visual Studio の [TEST] [Run] [All Tests] からテストを起動できます。結果は Test Explorer に表示されます。23個のテスト項目を作成し、全てパスすることができました。

Unit Test

ソースコードは CodePlex に公開しました。ドキュメントはこちらにアップロードしました。

Visual Studio の Team Explorer から Sync を使って CodePlex にアップロードしたのですが、ローカル Git への Commit がうまくいかなかったらしく、Win32 Console のテストプログラム RegressionTest.cpp はアップロードできませんでした。

CBVector クラスについては、動的配列のメモリを解放するための仕組みとして releaseMem というメソッドを作りました。 前回の版では解放できていない、いわゆるメモリ リークがありました。C++ のメモリ管理は結構めんどうです。boost というライブラリを導入すると解決できそうだったのですが、今回は自力でなんとかしました。


| | コメント (3) | トラックバック (0)

2015/01/21

C++ (9) 2進ベクトル CBVector クラスの実装

今回は CBVector クラスを Win32 Project の DLL (Dynamic Link Library ダイナミック リンク ライブラリ) として作成してみました。

Win32 プログラムの場合、作ったクラスをリンクする方法が3種類あります。一つはオブジェクトファイルを直接実行ファイルにリンクする方法。もう一つは、スタティック ライブラリ (.lib) を作成し実行ファイルにリンクする方法。そして3つ目はダイナミック リンク ライブラリ (.dll) を作成し、実行ファイルから実行時に呼び出す方法です。

JavaScript は実行時に解釈されるので、コンパイル、リンク、実行が全て実行時に行われますが、Java の場合、コンパイルした結果はクラス毎に .class というファイルになり、これが実行時に呼び出されます。

オブジェクト指向でのプログラミングは、オブジェクト単位(クラス単位)に行うのが自然なので、Java に近い DLL 方式を選ぶことにしました。ただ、この方法だとクラスを作るたびに DLL が増えることになるので、将来複数のクラスをまとめて一つの DLL にするかもしれません。

今回のプログラムは CodePlex にアップロードしました。また、CppDoc で作成したドキュメントはこちらにアップロードしました。

今回作ったのは、以前 JavaJavaScript でも作った BVector (binary vector) クラスです。2進ベクトルです。

作った DLL をテストするのに、Visual Studio にある Managed Test Project と Native Unit Test Project にチャレンジしてみましたが、ちょっとうまくいかなかったので、まずは Win32 Console Application から呼び出してテストすることにしました。実行結果は以下の通りです。

RegressionTest 0.1

まだ2進行列クラスを作っていないので、それに関係するメソッドは今回作っていません。

Visual Studio を使う上で、ソリューションとプロジェクトを理解する必要がありそうです。一つのシステムがソリューション、その中に例えば今回のように、BVector.dll とそれをテストする RegressionTest.exe がそれぞれプロジェクトになります。一つのソリューションの中に複数のプロジェクトを追加できます。今後さらにクラスを追加していくので、その度にプロジェクトを追加していく予定です。

今回は RegressionTest.exe を実行すると BVector.dll が呼び出されるので、GraphGo ソリューションのプロパティ (Properties) で Single startup project として RegressionTest を選びました。また RegressionTest のプロパティで [Add New Reference] ボタンを押して、BVector を追加しました。こうすることで、[Local Windows Debugger] の緑の三角を押したときに、RegresstionTest が実行され、BVector が呼び出されます。

| | コメント (0) | トラックバック (0)

2015/01/18

C++ (8) MFC による Hello プログラム

なかなか C++ のソースに巡り合えないので、まずはサンプルプログラムとして Hello C++ を表示する C++ プログラムを作ってみることにしました。

まず悩むのが、C++ のプログラムのタイプがたくさんあることです。Visual Studio (Community) 2013 で [FILE] [New] [Project] を選ぶと、以下のようなテンプレートの選択画面がでます。

プロジェクト テンプレート

Win32 Console Application が一番簡単だと思いますが、一応グラフィックスにしたいので、MFC Application を選ぶことにしました。MFC は Microsoft Foundation Class Library の略で、よく見かける [File] [Edit] などのメニューをもつデスクトップアプリケーションを作成できます。

これを選んでビルドすると、なにも表示しないメニューだけのプログラムが実行できます。MFCHelloCpp という名前のプログラムを作ってみました。

Visual Studio で [EDIT] [Find and Replace] [Find in Files] を選びポップアップの Find what: に "TODO" を入れて [Find All] ボタンを押すと、ソースの中で変更すべき部分が Find Results 1 というウィンドウに表示されます。この各行をクリックするとソースファイルのその行が表示されます。

それとVC++のリファレンスを見たり Google で例えば「MFC DrawText color」などと検索してコードサンプルを参照しながら、主に CMFCHelloCppView::OnDraw() という関数の中に "Hello C++!" と表示するコードを入れました。結果の画面は以下の通りです。

MFCHelloCpp

そして、Java の JavaDoc、JavaScript の JSDoc に当たる、CppDoc というソフトでドキュメントを作成してみました。ドキュメントへのリンクはこちらです。

ドキュメント

C++ のソースだけが対象なので、リソースファイル (.rc) などはドキュメントにはなりません(たぶん)が、例えば、MFCHelloCppView.cpp のソースはこちらのように作成されます。

ソース自体の公開は CodePlex を使う予定です。このプログラムは余りにも簡単なのでアップロードする価値があるかどうか、ちょっと躊躇しています...。

| | コメント (0) | トラックバック (0)

2015/01/17

C++ (7) CgfGoBan のインストール

GNU Go のソースを見ていて気づいたことがあります。C++ ではなく C言語のみのソースでした。そこで、もう一本参照用のプログラムを追加することにしました。CgfGoBan です。

CgfGoGan のホームページ http://www32.ocn.ne.jp/~yss/cgfgoban_j.html に行きます。ダウンロードのため「英語のページ」へ行きます。

CgfGoBan ホームページ

「Download CgfGoBan 1.06 2011/11/16」をクリックしてダウンロードします。

英語のページ

[保存] を選びます。

Select_operation

[フォルダーを開く] を選びます。

Download_complete

Visual Studio (Community) 2013 を起動し、[FILE] [New] [Project] で [Win32 Project] を選び、名前に CgfGoBan を指定し、[OK] を押します。

新規プロジェクト

Win32 Application Wizard のウィンドウが開くので、[Next] を押します。

Win32 Application Wizard

Application type は[Windows application] のまま、Additional options で [Empty project] をクリックし、[Security Development Lifecycle (SDL) checks] のチェックは外し、[Finish] を押します。

Application settings

ここで Solution Explorer に CgfGoBan という空のプロジェクトができていますが、右ボタンで [Remove] を押して消してしまいます。

さきほどダウンロードした cgfgoban106.zip を開きます。

Download_folder

cgfgoban106 フォルダーの中に入ります。全てのファイルを選択し右クリックで [コピー] を選びます。

Copy_2

作成された Visual Studio 2013\Projects\CgfGoBan の中で [ペースト] します。

ここで改めて [FILE] [Add] [Exsisting Project] を選びます。

Add Existing Project

ペーストした cgfgoban というフォルダーの中の cgfgoban という VC++ 6 Project を選びます。

cgfgoban VC++ 6 Project

One-way upgrade のポップアップが表示されるので、[OK] を押します。

One-way upgrade

Security Warning が表示されるので [OK] を押します。

Security Warning

同様に、cgfthink も [FILE] [Add] [Exsisting Project] で追加します。

Solution Explorer の cgfgoban で右クリックし、[Properties] を選びます。

cgfgoban Properties

[Configuration Properties] [General] の [Output Directory] を ".\Debug\" から "..\Debug\" に変更します。

Output directory

同様に、以下の設定もディレクトリを変更します。

 cgfgoban, cgfthink とも [Configuration Properties]:

 [General] [Output Directory]
 [General] [Intermediate Directory]
 [Linker] [Output File]
 [Browse Information] [Output File]

これで Local Windows Debugger の緑の三角をクリックし、cgfgoban.exe と cgfthink.dll をビルドします。

CgfGoBan のウィンドウと

CgfGoBan

CgfgobanDLL Information Window というウィンドウが表示されます。

CgfgobanDLL Information Window

リリース版をビルドするときも、同様にディレクトリを変更してから行います。

で、ソースファイルの拡張子は .cpp なのですが、中身はC言語でした...。

| | コメント (2) | トラックバック (0)

2015/01/15

C++ (5) リリース版のインストール

GNU Go のリリース版を作るにはソリューション構成で Release を選び、ローカル Windows デバッガーの緑の三角をクリックします。

Release

さらにソリューション エクスプローラーで INSTALL を選んでマウス右ボタンを押し、ビルドを選択すると、リリース版が C:\Program Files (x86)\GNUGo\bin にコピーされるはずですが、以下のエラーが出ます。

error MSB3073: The command "setlocal
"C:\Program Files (x86)\CMake\bin\cmake.exe" -DBUILD_TYPE=Release -P cmake_install.cmake
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
:VCEnd" exited with code 1.

これは C:\Program Files (x86)\GNUGo\bin に書き込む権限がないためです。タスクバーの Windows アイコンで右クリックし、[コマンド プロンプト (管理者)] を選び、gnugo-3.8 のフォルダで以下のコマンドを実行するとリリース版がコピーされます。

"C:\Program Files (x86)\CMake\bin\cmake.exe" -DBUILD_TYPE=Release -P cmake_install.cmake

リリース版を実行するには、エクスプローラーでコピー先の gnugo.exe をクリックするか、コマンド プロンプトで

"C:\Program Files (x86)\GNUGo\bin\gnugo.exe"

と入力します。

gnugo

コンピューターが白番で人間が黒番です。"d16" などの交点を指定して Enter を押します。 "exit" で強制終了できます。テキスト画面だと結構面倒くさいですね。

| | コメント (0) | トラックバック (0)

2015/01/05

C++ (4) GNU Go のビルドと実行

ソリューションファイル GNUGo.sln をダブルクリックすると Visual Studio Community 2013 が起動します。緑の三角のある [Local Windows Debugger] をクリックしてビルド(コンパイル)を開始します。

Visual_studio

ビルドされていないプロジェクト(ソースファイル)の一覧が出るので [Yes] ボタンを押してビルドを続行します。

Out_of_date

なぜか以下のエラーが表示されます。気にしないでよさそうです。

Release_all_build_not_found

Solution Explorer (ソリューション エクスプローラー)の gnugo を選びマウスの右ボタンをクリックします。メニューの中から [Debug] [Start new instance] を選びます。

Debug_start_new_instance

GNU Go が起動します。

Started_gnugo

[Break All] ボタンを押すと実行中のソースプログラムが表示され、プログラムの動きを追跡できます。

Break_all


| | コメント (0) | トラックバック (0)

C++ (3) CMake の実行

GNU Go のサイトのドキュメントを見ると、Visual Studio でコンパイルする前に CMake を実行するように書いてあります。

Documents

CMake はKitware 社が提供するクロスプラットフォームでの開発環境を生成するフリーソフトウェアです。GNU Go は元々は Unix 系のプログラムですが、Windows の Visual Studio 向けにソリューションファイルを生成してくれます。
http://www.cmake.org に行ってみましょう。

Homepage_2

トップ画面の下方にある [Download CMake Version 3.1.0] をクリックします。

Download_2

プラットフォームとして Windows (Win32 Inataller) を選び、cmake-3.1.0-win32-x86.exe をクリックし [実行] します。

Run

セットアップウィザードが起動するので [次へ] ボタンを押します。

Setup_wizard

ライセンス契約書を確認し [同意する] ボタンを押します。

License

[次へ] ボタンを押します。

Install_options

[次へ] ボタンを押します。

Target_folder

[インストール] ボタンを押します。

Start_menu_folder

[完了] ボタンを押します。

Done

CMake がインストールされているので、実行しましょう。

App

CMake が起動します。[Browse Source] ボタンを押してソースのフォルダーを指定します。

Cmakegui

GNU Go を展開したフォルダー Visual Studio 2013\Projects\gnugo-3.8 を指定し [OK] を押します。

Browse_source

同様に [Browse Build] でも同じフォルダーを設定します。

Path_to_build

[Generate] ボタンを押すと以下の画面が出るので、[Visual Studio 12 2013] を選んで [Finish] ボタンを押します。

Generate

ワーニングが出ますがファイルの生成が完了します。

Genarating_done

エクスプローラーでソリューションファイルができていることを確認します。

Solution_generated

(つづく)

| | コメント (0) | トラックバック (0)