複数のクラスで同じインスタンスを使用する
複数のクラスで共通のインスタンスを使用する方法
特にメルセンヌツイスターを使用している時によく使うので、メルセンヌツイスターを例に以下にコードを残す。
メイン関数とクラス(Class1)で共通のインスタンスを使用する例。
main.cpp
#include <iostream> #include "MersenneTwister.h" #include "Class1.h" using namespace std; int main() { CMersenneTwister mt; mt.init_genrand(10); Class1 c; c.SetMT(&mt); c.RandTest(); return 0; }
Class1.h
#pragma once #include "MersenneTwister.h" class Class1 { private: CMersenneTwister *mt; public: void SetMT(CMersenneTwister* _mt) { mt = _mt; }; void RandTest() { double rand = mt->genrand_real1(); cout << "rand = " << rand << endl; } };
今回の環境下では
rand = 0.771321
と表示された。
除算時の丸め込み回避
C++ にて、
int a=30; double y=1/a; cout<<y<<endl;
とすると、0が表示される。
これは以下のようにすることで回避することができる。
int a=30; double y=1/double(a); cout<<y<<endl;
直下のフォルダ内の特定のテキストを全て読み込むスクリプト
【フォルダの構成】
計算条件ごとにフォルダ分けした状態でそれぞれのフォルダにoutput1.txt~output10.txtまでが入っている状態
pathとしてフォルダ名を毎回入力する手間を省く目的で作成
for(j in 1:length(list.files())){ filepath<-list.files()[j] as.character(filepath) for(i in 1:10){ filename<-paste(filepath,"/output",i,".txt",sep="") data<-read.table(filename,skip=0,sep="\t") #これ以降任意のデータ処理# } }
下の階層のディレクトリで該当名のものをすべて削除するバッチファイル
@echo off @setlocal enabledelayedexpansion rem rem 以下の階層にあるTestFolderをすべて削除するバッチファイル rem For /r %%d In (TestFolder) Do Rmdir /s /q "%%d" tree /f pause exit
コマンドプロンプトに直接入力する場合は
For /r %d In (TestFolder) Do Rmdir /s /q "%d"
となるが、
バッチファイルとする場合には
%%d
とする必要があることに注意。
VisualStudio2017でGoogleTestを実行できるようにする
VisualStudio2017でGoogleTestを実行するための環境設定について
かなり手間取ったので結論を覚え書きしておく
- GoogleTestをダウンロードする
- ~/googletest/msvc/2010/gtest.slnを開き、ビルドする(出てきた選択肢にはOK)
- GoogleTestを導入したいプロジェクトを開く
- 追加のプロジェクトとして、~/googletest/msvc/2010/gtest.vcxprojを追加する
- 導入先のプロジェクトに”追加のインクルードディレクトリ”として
~/googletest/include
を指定する
- プロパティページにて
C/C++→コード生成→ランタイムライブラリを選び、マルチスレッドデバッグ(/MDd)を選択する *1
- ソリューションエクスプローラの参照を右クリックしてgtestをにチェックを入れる
すべてのテストを実行する場合以下のように書く
#include "gtest/gtest.h" int main(int argc, char **argv){ ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
*1:2019_04_16修正
mapのキーにvectorを用いた場合のmapの挙動確認
mapのkeyとしてvectorを用いた場合、vectorの0番目の要素の大きさでソートされることを確認した。
確認した際のサンプルコードは以下の通り。
int main() { map<vector<double>, int> test; vector<double> vec1; vec1.push_back(10.0); vec1.push_back(100); vector<double> vec2; vec2.push_back(2.0); vec2.push_back(500); vector<double> vec3; vec3.push_back(3.0); vec3.push_back(5); test.insert(std::make_pair(vec1, 3)); test.insert(std::make_pair(vec2, 100)); test.insert(std::make_pair(vec3, 8)); //mapの中身を全てcoutで確認 for (auto itr = test.begin(); itr != test.end(); ++itr) { std::cout << "key = (" << itr->first[0] << " , " << itr->first[1] << ")"; std::cout<< "\t" << ", value = " << itr->second << endl; } cout << endl; return 0; }
出力は以下の通り。
key = (2 , 500) , value = 100 key = (3 , 5) , value = 8 key = (10 , 100) , value = 3
フォルダ内にあるインプットファイル全てから計算条件を読み込んで実行するバッチファイル
定時デバッグ用に作成したバッチファイルを以下に示す。
以下の記事で示したバッチファイルの亜種となっている。
chicagopile1-75.hatenablog.com
【実行時の状況】
・test.exeは引数を2つとる実行ファイル
・インプットファイル全てはinput*.txtという名称でinput0~9が存在
・インプットファイル内にはtest.exeに与える引数が格納されている
・インプットファイル内はにはタブ又はスペース区切り
・呼び出し先のバッチファイル名はson.bat
・インプットファイル一覧はlist.txtとして保存される
【実行後の状況】
・年月日/input*_output*.txt に結果が出力される
まずは呼び出し元のバッチファイルを以下に示す。
@echo off @setlocal enabledelayedexpansion dir input*.txt/b > list.txt for /f %%a in (list.txt) do ( call son.bat %%a ) pause
ここから下がson.batであり、呼び出し先のバッチファイル。
@echo off @setlocal enabledelayedexpansion rem ***************************************************************** set /a num=0 set F=outputN.txt set InputName=%1 call :Make_Dir for /f "tokens=1,2" %%a in (%1) do ( set para1=%%a set para2=%%b call :DoCalc set /a num =!num! + 1 ) goto :END rem ***************************************************************** :DoCalc cd %FILE_PATH% copy ..\test.exe test.exe echo execute_!num! echo para1:%para1% para2:%para2% echo para1:%para1% para2:%para2% >%InputName:~-0,6%_%F:N=!num!% call test %para1% %para2%>> %InputName:~-0,6%_%F:N=!num!% cd.. :Make_Dir set FILE_PATH=%DATE:~-10,4%%DATE:~-5,2%%DATE:~-2% call :CHECK_FOLDER_EXIST %FILE_PATH% goto :END :CHECK_FOLDER_EXIST if not exist %FILE_PATH% ( mkdir %FILE_PATH% ) goto :END :END