• ベストアンサー

非MFCにおいて,_PRTマクロを利用し,vectorにしたstringの値を表示すること

vc.net2003にて,非MFC環境にてプログラミングしています.非MFCなのでTRACEが使えず,代わりに_PRTを使用してデバックウィンドウに変数の値を表示させているのですが,vectorにしたstringの値が表示されず困っています. #include <vector> vector<string> string1; string1.push_back("Hellow"); _RPT1(_CRT_WARN, "string1: %s \n", string1); というようなコードを書き,プログラムを実行するとアクセス違反が出て,うまくいきません.何が間違っているのでしょうか.教えていただけませんか.

質問者が選んだベストアンサー

  • ベストアンサー
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

_PRT1マクロが、 「CDのディスクを入れると、CDを再生してくれる装置」 だったとします。 _PRT1の装置に、「ケースに入ったCDを30枚入れたラック」を入れようとすると、当然入らない(コンパイルエラー)か、動作不良を起こす(アクセス違反)か、壊れ(ブルーバック、OSが落ちる)ます。 ラックから再生したいケースを取り出し、ケースからCDを取り出して装置に入れる必要があります。 -- string1の型→vector<string> _PRT1の要求する型→const char* (?) と、扱う型が違うのが原因です。

hiyahiya12345
質問者

お礼

ありがとうございます.うまくいきました.

その他の回答 (2)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

_RPT1(_CRT_WARN, "string1: %s \n", string1[0].c_str() ); でどうですか?

hiyahiya12345
質問者

お礼

うまくいきました.二日ほど試行錯誤して自力解決できませんでした.c_str()は思いつきませんでした.ありがとうございました.

回答No.2

vectorはコンテナですので、そのまま文字列としては扱えません。 コンテナのデータを一旦、文字列として出力する必要があります。 --- #include <vector> string vec_to_str(vector<string>& vec) { string str; for ( vector<string>::iterator i=vec.begin() ; vec.end()!=i ; ++i ) str += *i + " "; return str; } vector<string> string1; string1.push_back("Hellow"); _RPT1(_CRT_WARN,"string1:%s\n",vec_to_str(string1).c_str()); --- ちょっと手抜きですが、こんな感じで表示されるようになりませんか?

hiyahiya12345
質問者

お礼

ご丁寧にありがとうございます.ばっちりうまくいきました.たすかりました.

関連するQ&A

  • vector間における効率的な値の比較

    2つのベクターに入ったdoubleの網羅的な比較を行う関数をC++で書こうとしています。 (VC++ 2008) doubleのベクター vctr_1 , vctr_2 があるとします。 vctr_1 には (100.0, 200.5 , 300.1 , 400.0 ) vctr_2 には(50.0 , 70.2, 100.1, 220.0 , 300.0 ) というdouble の値が入っていて vctr_1の値のうち、vctr_2に近い値(誤差0.2以内)が見つかるものを.新しいベクターとして返すという処理を考えています。 この場合 100 : 100.1 と300.1: 300.0 が 誤差 0.2 未満で近い値といえ、100 と300.1が格納されたベクターを返す、という処理です。 私の考えた方法はベクターaの各要素に対してベクターbの各要素をループで比較する、というものでした。 以下コード ---------------------------- //比較を行う関数。ベクター1、2 要素の比較をし誤差内の数値をベクター1からとりだし、別のベクターとして返す。 vector<double> compare_doubles_with_tol(vector<double> v1,vector<double> v2 , double tol ){ //似た値を格納するベクター vector<double> v_match; //ベクター1に関してループ vector<double>::iterator it1 = v1.begin(); while( it1 != v1.end() ){ //ベクター2に関してループ vector<double>::iterator it2 = v2.begin(); while( it2 != v2.end() ){ //誤差内の値を見つける if( fabs(*it1 - *it2) < tol ){ v_match.push_back(*it1); } ++it2; } ++it1; } return v_match; } int main() { //ベクター1 std::vector<double> vctr_1; vctr_1.push_back(100.0); vctr_1.push_back(200.5); vctr_1.push_back(300.1); vctr_1.push_back(400.0); //ベクター2 std::vector<double> vctr_2; vctr_2.push_back(50.0); vctr_2.push_back(70.2); vctr_2.push_back(100.1); vctr_2.push_back(220.0); vctr_2.push_back(300.0); //誤差0.2内で似た値があるものを新たなベクターとして得る。 vector<double> matched = compare_doubles_with_tol(vctr_1,vctr_2,0.2); for (int i = 0 ; i < matched.size() ; ++i){ cout << matched[i]<<endl; } return 0; } ------------------------- このコードで望んだ結果は得られますがループの繰り返しを行っていて処理が遅くなってしまいます。実際の仕事ではベクターの要素数が100前後のものを非常に数多く処理しなければならず、このままでは処理時間が膨大なものになってしまいそうです。 このような場合どのような処理、コードを作成すれば処理速度の向上が望めるでしょうか。

  • boost::formatの値をstring型にコピーしたい

    boost::formatの値をstring型にコピーしたいのですが、うまくいきません。boost自体初めてで以下のサイトからダウンロードし、展開後VS2005のVCのインクルードフォルダーにboostフォルダーをまるまるコピーしただけですが・・・ http://sourceforge.net/project/showfiles.php?group_id=7586 boost 1.34.1 #include <iostream> #include <boost/format.hpp> using namespace std; using boost::format; void main(){ double x = 1.234; string str("abc"); //cout << format("%10.3f, [%16s]") % x % str << endl; // サンプルはこうでした。 // いったんstring型に入れて表示させたい。 string y; y = boost::format("%10.3f, [%16s]") % x % str; // エラー箇所 std::cout << y << std::endl; }

  • fgetsで読み込んだ値のvector処理

    Visual C++ 2008でc++プログラミングの勉強をしています。 ファイルから文字列をfgetsで読み込み、vectorにいれる処理をプログラミングしようとしているのですが、うまくいきません。 input.txt------------------ sumday monday tuesday ------------------------- このような入力ファイルをfgetsで読み込み、各行を文字列としてvectorにpush_backし、 読み込みが終わった後にvectorの全要素をループで出力するというシンプルなものなのですが、以下のようにコーディングしました。 #include <stdio.h> #include <stdlib.h> #include <vector> int main(void){ using namespace std; FILE *fp; fp = fopen("input.txt","r"); std::vector<char *> my_vector; char buff[16]; while(fgets(buff, 256, fp) != NULL) { char copy_of_buff[16]; std::strcpy(copy_of_buff, buff); my_vector.push_back(copy_of_buff); printf("output from fgets..... %s \n", copy_of_buff); } vector<char *>::iterator it = my_vector.begin(); // while( it != my_vector.end() ) // { printf("output from vector.... %s \n", *it); ++it; // } fclose(fp); return 0; } 以下のような出力がなされるものと思っていたのですが、 outputs from fgets .... sunday outputs from fgets .... monday outputs from fgets .... tuesday output from vector .... sunday output from vector .... monday output from vector .... tuesday 実際は以下のように、vectorからの出力分がすべて最後にpush_backした"tuesday"となりました。 outputs from fgets .... sunday outputs from fgets .... monday outputs from fgets .... tuesday output from vector .... tuesday output from vector .... tuesday output from vector .... tuesday fgetsしたあとの処理が問題だと思うのですが、原因がよく分かりません。非常に基本的なことだと思うのですがwebで調べてもいまいちわかりません。 原因が分かる方、よろしくお願いします。

  • vectorを使っていたいのですが上手くいきません

    文字列(A)から特定の文字列(B)を抽出しながらvectorにどんどん入れていくプログラムを作成しています。(文字列(B)の位置や長さはわかっているとします。) そこで、文字列(A)から、文字列(B)に相当するアドレスをvectorにどんどん入れているのですが、先pushした値が後からpushした値と全て同じ値になってしまいます。 これは、アドレス渡しが原因と分かってはいるのですが、どう書けば上手くいくかわかりません。 そこでご教授頂きたいと思っています。 自分が書いたプログラムは以下になります。 #include <string.h> #include <stdio.h> #include <stdlib.h> #include <vector> using namespace std; void main(){ char* stringA; vector<char*> result; char temp[16];//文字列Bの大きさ for(int i=0;i<file.size();i++){ strncpy(temp,&buffer[i],16); result.push_back(*temp); //次の文字列Bの位置までインデックスを移動//// while(buffer[i]!=0x0A){ i++; } i++; } }

  • 文字列と変数の値をエディットボッスクに表示させたい

    VC++6.0,MFC,ダイアログベースでプログラミングしています。 エディットボックスに文字列と変数の値を表示させたいのですが、その方法が分かりません・・。 コンソールベースの場合の、 int a=1; printf("a = %d",a); で、「a = 1」と出力されるようにしたいです。 今は、 m_Display = "a = %d"; UpdateData(FALSE); UpdateWindow(); というように作っているので、上記と同様にできませんでした。 このような場合どうしたらよいのでしょうか? よろしくお願いします。

  • VectorなどSTL?テンプレートの使い方

    戻り値がポインタの場合、関数から抜け出すと値の保証が無いので、それを使用する場合は、変数にコピーして使うと値は残る(アクセス可能)と理解しています。 char tmp[128]; strcpy(tmp, test()); それで、次のような vector??を使った場合、表示の場合は問題ないかもしれませんが、その後、値を使い続ける場合、ポインタのままでよいのか疑問に思っています。 以下のソースは勝手気ままに記述したものですが、 VC++6でエラーなく動作(とりあえず動く)しているのですが、今後発生する問題など知りたいです。 #include "stdafx.h" #include <string> #include <iostream> #include <vector> #include <sstream> using namespace std; class A { string str; vector<A *> v_cls; public: A(){ } // デフォルトコンストラクタが必要? A(string s){ str = s; } void PrintData(void){ // 表示 cout << str << endl; } // 1から9までの[0]-[9]の文字列を作成 vector<A *> ArraySet(void){ stringstream ss; for (int i=0; i < 10; i++){ ss.str(""); ss << "function [" << i << "]\n"; v_cls.push_back( new A( ss.str() ) ); } return v_cls; } }; void main(void){ // 1から9までの[0]-[9]の文字列を作成 // これは問題ないと思う vector<A *> v; stringstream ss; for (int i=0; i < 10; i++){ ss.str(""); ss << "[" << i << "]\n"; v.push_back( new A( ss.str() ) ); } v[1]->PrintData(); v[3]->PrintData(); ////cout << v.size(); // クラス自身にvector配列?を返す処理 // とりあえず動いているだけ??? A x; vector<A *> ret = x.ArraySet(); // このような代入でも問題ないのでしょうか? ret[5]->PrintData(); // 表示だけなので、問題なし? ret[0]->PrintData(); // vやret, xの解放仕方とタイミングはどうすればよいのでしょうか? }

  • クラスや構造体のarrayを作りたい。

    クラスや構造体のarrayを作りたい。 クラスや構造体のarrayを作りたいのですが、 以下の方法で正しいのでしょうか? ==================================== #include <string> #include <vector> class Test{ public:   std::string sono1;   int sono2;   bool sono3;   //コンストラクタ   Test(std::string tmp_sono1,int tmp_sono2,bool tmp_sono3){     sono1=tmp_sono1;     sono2=tmp_sono2;     sono3=tmp_sono3;   } }; void main(){   std::vector<Test> testObjArray;   testObjArray.push_back(*(new Test("てすと1",1,true)));   testObjArray.push_back(*(new Test("てすと2",2,false))); } ==================================== 質問1: コンストラクタ時、クラス内の変数へ引数の値を渡す時、 上記のようにtmpを作成する以外の方法はありますか? 質問2: push_back時、クラスをインスタンスしてvectorに渡すにはこのような記述であってるのでしょうか? 「testObjArray.push_back(*(new Test("てすと1",1,true)));」 一応問題なく動いているようなのですが心配です。 よろしくお願いします。

  • DataGridViewに配列の値を表示したい

    VB2008でプログラミングをしています。(超初心者です) タイトルどおり、DataGridViewに一次元配列の値を表示したいと思っています。 最初は、以下のとおりにプログラムを書いてみたのですが、 表示されるのは各要素の長さでした。 dim array() as string = {"data1","data2","data3"} DataGridView1.DataSource = array どのようにすれば、要素の値が表示されるのでしょうか? 出来れば{"data1","data2","data3"}のように、 各要素を書き出さない方法が知りたいです。 (要素数が不確定のため) よろしくお願いいたします。

  • VC++2010 エディットボックスに値を表示

    現在、VC++2010 MFCでアプリケーションを作成しています。 そこで質問なんですが、 エディットボックスに値(今回はADボードからサンプリングした電圧値)をSetWindowTextや、UpdateData(FALSE);をつかってエディット表示などをしたんですが、これを毎秒表示しようとすると(SetTimer()で毎秒、ADボードで電圧値をサンプリングしエディットボックスに表示)7分後くらいにパソコンがフリーズしてしまいます。どのようにしたらフリーズされないか よろしくお願いします。

  • boostスマートポインタ(shared_ptr)を使用した、簡単なフ

    boostスマートポインタ(shared_ptr)を使用した、簡単なファイルの読み込みとループ処理で困っています。 以下に示すような、テキストファイルから情報を読み取って構造体のvectorをつくる処理をshared_ptrを使って行おうとしています。 input.txt-- >Taro /boy /8 years old >Hanako /girl /6 years old /likes candy ----- このファイルの'>'で始まる行は'名前'として、それ以外の '/ 'で始まる行はvectorに入れて、このふたつを個人ごとにまとめて構造体として管理するという形をとりたいと考えています。 つまり構造体の要素は <名前の行> <それ以外の行が入ったベクター> となります。 ファイル読み込みの過程で '>' を認識したらこれらのメモリ領域を確保し、shared_ptrで管理したいと考えています。 出来た構造体をベクターに入れ、ファイル読み込みのあとに出力する、という形でプログラムを以下のように書きました。  #include <string> #include <fstream> #include <iostream> #include <boost/shared_ptr.hpp> using namespace std; //構造体定義  struct my_struct{ std::string name;    std::vector<std::string> vector_of_string;  } ; int main(void){ std::ifstream ifs("input.txt"); //構造体を入れるベクター std::vector<my_struct> vector_of_my_struct; std::string buf; boost::shared_ptr<my_struct> SMARTptr_my_struct(new my_struct); boost::shared_ptr<vector<string>> SMARTptr_vector_of_string(new vector<string>); while(ifs && std::getline(ifs, buf)) { if(buf[0] == '>'){   //構造体の領域を作成 boost::shared_ptr<my_struct> SMARTptr_my_struct(new my_struct); //'/'で始まる行を格納しておくベクター領域の作成 boost::shared_ptr<vector<string>> SMARTptr_vector_of_string(new vector<string>); //構造体に作成されたベクターを入れる (*SMARTptr_my_struct).vector_of_string = *SMARTptr_vector_of_string; //構造体にこの行ををnameとして入れる (*SMARTptr_my_struct).name = buf; //ここで新たに作られた構造体をベクターに入れる vector_of_my_struct.push_back(*SMARTptr_my_struct); } if(buf[0] == '/'){ //この行をstring格納用のベクター(if(buf[0]=='>') ですでに作られている)に入れる (*SMARTptr_vector_of_string).push_back(buf); } この後、構造体のベクターのループから情報を出力しますが字数制限のため省略させていただきます。 input.txtと同じ内容が出力されることを期待したのですが、実際は'>'で始まる名前の行しか出力されません。 どうやらベクターへのpush_backができていないか、そもそもshared_ptrの扱いに根本的な間違いがあるのでは?と思っているのですが、原因がわかりません。環境はVC++2008 express edition, boost 1.38です。 解決方法、原因、アドバイスなど分かりましたらよろしくお願いします。