ハムスターに飼われる院生のブログ

自分用メモが中心のブログです。

複数のクラスで同じインスタンスを使用する

複数のクラスで共通のインスタンスを使用する方法
特にメルセンヌツイスターを使用している時によく使うので、メルセンヌツイスターを例に以下にコードを残す。
メイン関数とクラス(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
と表示された。

直下のフォルダ内の特定のテキストを全て読み込むスクリプト

【フォルダの構成】
計算条件ごとにフォルダ分けした状態でそれぞれのフォルダに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