pairについて。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
luc
記事: 32
登録日時: 10年前

pairについて。

#1

投稿記事 by luc » 9年前

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;
}


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pairについて。

#2

投稿記事 by みけCAT » 9年前

確保していない要素にアクセスしてはいけません。例えば、こうするといいでしょう。

コード:

	if (ifs.fail()) {
		m_ranking.clear();
		for (i = 0; i < 5; i++){
			m_ranking.push_back(std::make_pair<float, std::string>(999, "aaaaaa")); //ランキングの最初の値
		}
	}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pairについて。

#3

投稿記事 by みけCAT » 9年前

後半の処理で使用するiが初期化されていないのも非常によろしくないですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

luc
記事: 32
登録日時: 10年前

Re: pairについて。

#4

投稿記事 by luc » 9年前

コード:


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"));
		}
	}

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

deny

Re: pairについて。

#5

投稿記事 by deny » 9年前

コード:

// 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()を使うなど方法は色々あると思いますが、そもそも該当箇所のエラーが具体的にどういうものかは分かりませんか?
やはり「駄目」とでは解決方法も分かりかねるかと。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pairについて。

#6

投稿記事 by みけCAT » 9年前

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"));
		}
	}

で試しましたが駄目でした
で、どうしたいのですか?
自分が書いた通りのコードは試しましたか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

luc
記事: 32
登録日時: 10年前

Re: pairについて。

#7

投稿記事 by luc » 9年前

みけ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);
		}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: pairについて。

#8

投稿記事 by みけCAT » 9年前

じゃあ素直にこうですかね…

コード:

	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";
		}
	}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

luc
記事: 32
登録日時: 10年前

Re: pairについて。

#9

投稿記事 by luc » 9年前

VC++を起動しなおしたら何故かできるようになってました。。。

コード:


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

これで大丈夫でした。

閉鎖

“C言語何でも質問掲示板” へ戻る