ページ 11

pairについて。

Posted: 2015年12月27日(日) 13:26
by luc
C++,Win32APIを使用しております。

ランキングの最初の値を入れるとこでエラーが起きてしまいます
m_ranking.first = 999; //ランキングの最初の値
m_ranking.second = "aaaaaa";
ここです。書き方が悪いんでしょうか?

raning_name.h

コード:

class Ranking_Name
{
private:

	typedef std::pair<float, std::string> str_pair;

	const int m_maxRanking;

	std::vector<std::string>data;

	std::vector<str_pair> m_ranking;

	struct m_rankingless {
		bool operator()(const str_pair& x, const str_pair& y) const {
			return x.first < y.first;
		}
	};


public:
	Ranking_Name();
	~Ranking_Name();

	bool Reading();   //ランキング読み込み

	//Rankingを昇順にソート
	void Sort_Asc();
	//ランキング登録
	void AddRanking(HDC);


	int GetScoredata(int i){ return m_ranking[i].first; }
	std::string GetNamedata(int i){ return m_ranking[i].second; }
};

ranking_name.cpp

コード:

bool Ranking_Name::Reading()
{
int num = 0;
	int i;
	std::string str;
	std::ifstream ifs("ranking.txt"); //rankingのテキスト
	


	if (ifs.fail()) {
		for (i = 0; i < 5; i++){
			m_ranking[i].first = 999;		//ランキングの最初の値
			m_ranking[i].second = "aaaaaa";
		}
	}

	while (getline(ifs, str))
	{
		std::string tmp;
		std::istringstream stream(str);
		num += 1;

		while (getline(stream, tmp, ','))
		{
			data.push_back(tmp);	//カンマだったらtmpに一時的にデータを入れる
		}
		m_ranking.resize(num);
		m_ranking[i].second = data[0];
		m_ranking[i].first = atoi(data[1].c_str());
		++i;
		data.clear();
	}
	ifs.close();
	return true;
}


Re: pairについて。

Posted: 2015年12月27日(日) 14:01
by みけCAT
確保していない要素にアクセスしてはいけません。例えば、こうするといいでしょう。

コード:

	if (ifs.fail()) {
		m_ranking.clear();
		for (i = 0; i < 5; i++){
			m_ranking.push_back(std::make_pair<float, std::string>(999, "aaaaaa")); //ランキングの最初の値
		}
	}

Re: pairについて。

Posted: 2015年12月27日(日) 14:08
by みけCAT
後半の処理で使用するiが初期化されていないのも非常によろしくないですね。

Re: pairについて。

Posted: 2015年12月27日(日) 14:31
by luc

コード:


int num = 0;
	int i = 0;
	std::string str;
	std::ifstream ifs("ranking.txt");

	
	if (ifs.fail()) {
		m_ranking.clear();
		for (i = 0; i < 5; i++){
			m_ranking.push_back(std::make_pair(999, "aaaaaa"));
		}
	}

で試しましたが駄目でした

Re: pairについて。

Posted: 2015年12月27日(日) 15:05
by deny

コード:

// ex.1
for (int i = 0; i < 5; ++i) {
    m_ranking.emplace_back(999.f, "aaaaaa");
}

// ex.2
// 予めコンストラクタでstd::vectorの要素数を確保しておく
Ranking_Name::Ranking_Name() : m_ranking(5) { }

for (auto& r : m_raking) {
    //代入処理
}
他にもstd::fill()を使うなど方法は色々あると思いますが、そもそも該当箇所のエラーが具体的にどういうものかは分かりませんか?
やはり「駄目」とでは解決方法も分かりかねるかと。

Re: pairについて。

Posted: 2015年12月27日(日) 15:19
by みけCAT
luc さんが書きました:

コード:


int num = 0;
	int i = 0;
	std::string str;
	std::ifstream ifs("ranking.txt");

	
	if (ifs.fail()) {
		m_ranking.clear();
		for (i = 0; i < 5; i++){
			m_ranking.push_back(std::make_pair(999, "aaaaaa"));
		}
	}

で試しましたが駄目でした
で、どうしたいのですか?
自分が書いた通りのコードは試しましたか?

Re: pairについて。

Posted: 2015年12月27日(日) 15:32
by luc
みけcatさんので試したんですが、std::make_pairのインスタンスが引数リストと一致しないと言われたので、

コード:

m_ranking.push_back(std::make_pair<float, std::string>(999, "aaaaaa"));

コード:

m_ranking.push_back(std::make_pair(999, "aaaaaa"));
と書き直しました。
エラーを直したいのですが駄目なようでしたら新しく組み直します。

エラーですが
ハンドルされない例外が 0x00B581E9 で発生しました。とでます。
vector内のこの部分でエラーがでます。

コード:

bool _Inside(const value_type *_Ptr) const
		{	// test if _Ptr points inside vector
		return (_Ptr < this->_Mylast && this->_Myfirst <= _Ptr);
		}

Re: pairについて。

Posted: 2015年12月27日(日) 17:48
by みけCAT
じゃあ素直にこうですかね…

コード:

	if (ifs.fail()) {
		int n = 5;
		m_ranking.resize(n);
		for (i = 0; i < n; i++){
			m_ranking[i].first = 999;		//ランキングの最初の値
			m_ranking[i].second = "aaaaaa";
		}
	}

Re: pairについて。

Posted: 2015年12月31日(木) 14:45
by luc
VC++を起動しなおしたら何故かできるようになってました。。。

コード:


if (ifs.fail()) {			//ランキングファイルが無かったら
		
		for (i = 0; i < 5; i++){
			m_ranking.push_back(make_pair("あいうえお", 999.0-i));
		}
	}

これで大丈夫でした。