なんでpush_backできないのかわかりません・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sql

なんでpush_backできないのかわかりません・・・

#1

投稿記事 by sql » 10年前

C++でstd::vectorで文字列のリスト?を作りたいと思ったのですが
文字列を追加しようと思ったのですがエラーが出ます・・・

コード:

ヘッダー
class C_Main_Game
{
private:
   std::vector<char*> file;
以下略

cppファイル
static const char file2[7][256] = 
{	
	"test01/test01.txt",
	"test02/test02.txt",
	"test03/test02.txt",
	"test04/test02.txt",
	"test05/test02.txt",
	"test06/test02.txt",
	"test07/test02.txt",
};

C_Main_Game::C_Main_Game()
{
}

C_Main_Game::~C_Main_Game()
{
}

void C_Main_Game::initialize()
{
	for(int i = 0 ; i<7;i++)
		file.push_back(file2[i]);
以下略
とやると、エラーが出ます

コード:

MainGame.cpp(28): error C2664: 'void std::vector<_Ty>::push_back(_Ty &&)' : 1 番目の引数を 'const char [256]' から 'char *&&' に変換できません。(新しい機能 ; ヘルプを参照)
1>          with
1>          [
1>              _Ty=char *
1>          ]
1>          理由: 'const char [256]' から 'char *' へは変換できません。
1>          変換で修飾子が失われます。
そして、「static const char file2[7][256]」を「static const char *file2[7]」と変えてやってみると、

コード:

MainGame.cpp(28): error C2664: 'void std::vector<_Ty>::push_back(_Ty &&)' : 1 番目の引数を 'const char *' から 'char *&&' に変換できません。(新しい機能 ; ヘルプを参照)
1>          with
1>          [
1>              _Ty=char *
1>          ]
1>          変換で修飾子が失われます。
とエラーが出ます。

push_backのカッコ内に文字列をそのまま書くとエラーは消えてくれるのですが・・・
どこが悪いのでしょうか?

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

Re: なんでpush_backできないのかわかりません・・・

#2

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

「変換で修飾子が失われる」からですね。
vectorの中身の型をconst char*にし、全角空白を除去するなどの補正を行うとコンパイルできました。

コード:

#include <cstdio>
#include <vector>

class C_Main_Game
{
	private:
		std::vector<const char*> file;
	public:
		C_Main_Game();
		~C_Main_Game();
		void initialize();
		void print() const{
			for(size_t i=0;i<file.size();i++)puts(file[i]);
		}
};

static const char file2[7][256] = 
{
	"test01/test01.txt",
	"test02/test02.txt",
	"test03/test02.txt",
	"test04/test02.txt",
	"test05/test02.txt",
	"test06/test02.txt",
	"test07/test02.txt"
};

C_Main_Game::C_Main_Game()
{
}

C_Main_Game::~C_Main_Game()
{
}

void C_Main_Game::initialize()
{
	for(int i = 0 ; i<7;i++)
		file.push_back(file2[i]);
}


int main(void) {
	C_Main_Game cmg;
	cmg.initialize();
	cmg.print();
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

たいちう
記事: 418
登録日時: 13年前

Re: なんでpush_backできないのかわかりません・・・

#3

投稿記事 by たいちう » 10年前

C++なんだから、stringを使うのがお勧めです。
std::vector<std::string> file;

それと、前の質問は「解決!」にしておいてください。

sql

Re: なんでpush_backできないのかわかりません・・・

#4

投稿記事 by sql » 10年前

みけCATさんたいちうさんありがとうございます。
ここで、もう一つ質問ができましたのでこのトピックにて質問します。

つぎは、txtファイルの読み込みからstd::vector<const char*> fileへのpush_backを試したのですが強制終了します。
エラーは出なかったので解決策もわかりません・・・

コード

コード:

ヘッダー
class C_Main_Game
{
private:
   std::vector<const char*> file;

以下略

void C_Main_Game::first_read()
{	
	int FP;//ファイル
   char temp_str[256] = "";//一時格納用文字列

	 FP = FileRead_open("test001.txt");//ファイルのオープン
 
    if(FP == 0)//or NULL
    {//エラー報告
        printfDx("Load_error:(Class Load_File)全てのファイルのパスが読み込めません");
        return;
    }

	/*for(int i=0 ; i<2 ; i++)//最初の2行読み飛ばす
		while(FileRead_getc(FP) != '\n');*/

	for(int i = 0 ; i < 30 ; i++)//ここの30は気にしないでください
	{
		FileRead_gets(temp_str , sizeof(temp_str) , FP);//読み込む(※1行単位で)

		file.push_back(temp_str);//ベクター配列に追加

		if(FileRead_eof( FP ) != 0)//ファイルの終わりなら
		{
            goto EXFILE;//終了
		}
	}
EXFILE:
	FileRead_close(FP);
}
この「first_read」を自分で作った初期化関数の中に入れているのですが・・・・
いれないで、みけCATさんの返信のようなコードをを書きますとエラーはもなく、普通に動作しますが、如何せん、読み込むファイルの数は増えていく予定でコードを書いていますので・・・・

ファイルの中身は

コード:

 
  test01/test01.txt
    test02/test02.txt
    test03/test02.txt
    test04/test02.txt
    test05/test02.txt
    test06/test02.txt
    test07/test02.txt
となっています。

sql

Re: なんでpush_backできないのかわかりません・・・

#5

投稿記事 by sql » 10年前

単にファイルから1行読み込んでfileにpush_backして、その中の文字列を描画(DrawString(10,10,file[1],・・・・)するという処理にすると文字化けして何が何やらわかりません・・・・

sql

Re: なんでpush_backできないのかわかりません・・・

#6

投稿記事 by sql » 10年前

自己解決しました。
std::vector<char*> strというのはその「文字列へのポインタ」を追加削除するのですね・・・・実態が格納されるわけでなく・・・・
やり方を変えたら、多少メモリを食いますができるようになりました!

閉鎖

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