• 締切済み

BCB6 見せかけのステップ実行!?

今このように表記しているものを -----xxx.h---------------------------------------- void print( const State& s , const deque<State>& a) { cout << s << endl; for ( size_t i = 0 ; i < a() ; i ++ ) { cout << " " << a[i]; } cout << endl; -------------------------------------------------- ----main.cpp-------------------------------------- while( ! a.empty() { State s = a.front(); a.erase( a.begin() ); print( s ,a); cout << endl; } -------------------------------------------------- sとaの内容をメモリ(配列?)に書き込んで、その内容をButtonを押すごとに1ステップずつ表示したいのですが、どのように表記をしたら画面への出力ではなく、メモリに出力できるのでしょうか。 アドバイス、ご意見ございましたらお返事願います。

  • acer
  • お礼率100% (1/1)

みんなの回答

  • KoHal
  • ベストアンサー率60% (110/181)
回答No.1

以前よく似たコードを見たような気がするのですが、気のせいでしょうか? >画面への出力ではなく、メモリに出力できるのでしょうか。 この一点だけに答えれば、std::stringstreamを使うのが一番手っ取り早いかと思います。BCBなら「標準C++ライブラリヘルプ」のbasic_stringstreamの項を参照。 ただしソースをかなり書き換える必要がありそうです。 標準出力(cout)をそこら中に散らばらせたソースをWindowsに移植しようと思ったら、根本から書き直す覚悟が必要です。 ぱっと見の思いつきですが、print()を std::ostream& operator<<( std::ostream&, const State& ); std::ostream& operator<<( std::ostream&, const std::deque<State>& ); この2つに分割しちゃうのが簡単そうです。 これだと出力先が標準出力でもstringstreamでもその他でも同じコードで対応できますよ。 とりあえずはご自分の力でやれるところまでやってみて下さい。それでどうしても判らなかったら、そのわからない部分を具体的に質問してください。

acer
質問者

お礼

お返事ありがとうございます。アドバイスのよう、取り組んでみたいと思います。

関連するQ&A

  • C++Builder6 ポインタ 

    -----unit1.cpp------------------------------------ #include<state.h> void __fastcall TForm1::Button1Click(TObject *Sender) {  char *tlptr; State start_state; deque<State> open_list; deque<State> closed_list; open_list.push_back( start_state ); tlptr=""; for(i=0 ; i<=processcnt && ! open_list.empty() ;i++){ State s = open_list.front(); open_list.erase( open_list.begin() ); print_progress(s,tlptr);     print_progress1(open_list,olptr); if ( s.succeeded() ){ break; } if ( s.failed() ){ continue; }         ・         ・   } Memo1->Text=tlptr; Memo1->Text=AnsiReplaceStr(Memo1->Text,"\n","\r\n"); processcnt += 1; } -state.h------------------------------------------ void print_progress( const State& s, char *tlptr) { tlptr = strcat(tlptr,"探索:"); tlptr = strcat(tlptr,s); tlptr = strcat(tlptr,"\n"); } 表示結果として  探索:s(の中身1) 改行  探索:s(の中身1,2) 改行      ・      ・ としたいのですが,strcatはsがState型でchar型ではないため,strcatが使えません。charポインタの構造体を作り,上記のような結果を得るにはどのようにしたらよいのでしょうか。また,そのほかにchar型でなくても文字の連結が出来るものはありますでしょうか? 調べたのですがわからず,質問しました。 今までたくさんの方々にご返事いただき,参考にし,考えて参りました。どうかアドバイスございましたら,お返事お願い致します。

  • BCB6でのエラー…

    BCB6のMEMOコンポーネントに、プログラムの実行結果を表示したく、ButtonClickイベントにプログラムを書き、実行すると 「テンプレート引数に、静的リンゲージまたはローカルリンゲージを入れることはできない」 というエラーが出てしまいます。プログラムを添付致しますのでよろしかったらご覧になって下さい。 struct State { // 状態を表すフラグ // false は、川の左岸、true は、川の右岸を表わす bool wolf; bool goat; bool cabbage; bool man; // この状態になるまでの道のり deque<State> path // -------- 初期化 -------- // 初期状態では、全て川の左岸 State() : wolf( false ), goat( false ), cabbage( false ), man( false ), path() { } // -------- 状態に対するオペレーター ------ // 狼を移動させる State move_wolf() const { State s = *this; s.path.push_back( *this ); if ( s.wolf == s.man ) { s.wolf = !s.wolf; s.man = !s.man; } return( s ); } のように続きます。 deque<State> pathの部分にエラーが表示されます。 初心者で全く分からないので、プログラム等、不明な点があればお答え致しますので、どうか分かる方いましたらお返事をよろしくお願いいたします。

  • プログラムの連続実行(VC++ 2010)

    こんにちは。 現在、「Visual C++ 2010 Express」を使って、コンソールアプリケーションの開発について勉強しています。 どうしてもわからないことが出てきたので、質問させて下さい。 今、Sという名前のソリューションに、P1とP2という、2つのプロジェクトが含まれているとします。 P1をビルドして作成されたP1.exeは、1つのファイルに、適当なデータを出力します。 P2をビルドして作成されたP2.exeは、そのファイルの内容を読み取って、標準出力に出力します。 Visual C++ 2010 Expressでは、[Ctrl]+[F5]で、作成されたexeファイルを実行できるのですが、 どうやら、スタートアッププロジェクトのexeファイルしか実行されないようなんです。 [Ctrl]+[F5]によって、P1.exeが実行された後に、P2.exeが実行されるようにするには、どうすればよいのでしょうか? プロジェクトやソリューションのプロパティをいじってみたのですが、 どうも上手くいかなかったので、質問させて頂きました。 一応、P1とP2のソースファイルの内容を、以下に載せておきます。 ・P1.cpp ----------------------------------------------- int main(int argc, char *argv[]) { char str[1000]; //出力用にファイルをオープンする。 ofstream fw("file.txt"); if(!fw){ cout<<"「file.txt」が開けない!\n"; exit(1); } //ファイルにデータを書き込む。 cout<<"出力ファイルに書き込む文字列を入力せよ。"<<endl; cin>>str; fw<<str<<endl; fw<<100<<endl; fw<<200<<endl; fw.close(); return 0; } ----------------------------------------------- ・P2.cpp ----------------------------------------------- int main(int argc, char *argv[]) { char ch; //読み取り用にファイルをオープンする。 ifstream fr("file.txt"); if(!fr){ cout<<"「file.txt」が開けない!\n"; exit(1); } cout<<"file.txtの内容を読み込み、以下に表示する。\n"; while( fr.get(ch) ){ cout<<ch; } return 0; } ----------------------------------------------- ちなみに、各プロジェクトの「作業ディレクトリ」は、 共通のディレクトリに設定しているので、 「file.txt」は、そこで入出力されるようになっています。 以上、よろしくお願い致します。

  • c++のvector::erase

    vector::eraseについて質問させてください。 vector::eraseでググるとforループ内でのeraseの仕方は 書いていあるのですが、単純に1要素だけeraseする 例が見当たらなかったので教えてください。 1要素を削除する場合、 以下のような書き方でよろしいのでしょうか? いちおう正しく動作しているようです。 ただ、疑問なのは途中の要素[2]を削除しているので、 後半の要素が詰め直されているのか、 そのあたりが自信がなくて不安です。 vector<string> v; v.push_back("0a"); v.push_back("1a"); v.push_back("2a"); v.push_back("3a"); v.push_back("4a"); v.erase( v.begin() + 2 );//v[2]を削除 //結果表示 for(unsigned int i=0; i<v.size(); i++){ cout<<v[i]<<"\n"; } cout<<endl;

  • clangで例外がキャッチできない?

    初質問です.yahooでも質問したのですがこちらでもしておきます. 趣味でプログラミングをしているものです.clang(コンパイラです)はエラーメッセージが分かりやすいので使っていたのですがg++と挙動が違うようです. 以下のソースのようにC++でboost::lexical_castを使おうとしたのですが,変換に失敗した際に,g++では例外をキャッチしてくれるのにclang(コンパイラです)ではキャッチしてくれず,実効停止してしまうようです.コンパイラオプションの問題でしょうか? ~ ソース test3.cpp ~ #include <iostream> #include <boost/lexical_cast.hpp> #include <string> using namespace std; int main() {     cout << "start" << endl; try { throw 10; // これはキャッチしてくれる } catch (int i) { cout << "thrown:" << i << endl; } cout << "and..." << endl; string str = "not a number"; try { int error = boost::lexical_cast<int>(str); } catch(boost::bad_lexical_cast& e) { // 以下,clangだと全部スルー? cout << "bad_lexical_cast!!" << endl; cout << e.what() << endl; } catch(exception& e) { cout << "exception!!" << endl; cout << e.what() << endl; } catch(...) { cout << "exception!?" << endl; cout << "error" << endl; } cout << "end" << endl; } ~ コンパイル&実行 ~ > clang test3.cpp -lstdc++ -I"C:\Program Files (x86)\boost\boost_1_47" > a.out start thrown:10 and... This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. > g++ test3.cpp -I"C:\Program Files (x86)\boost\boost_1_47" > a.exe start thrown:10 and... bad_lexical_cast!! bad lexical cast: source type value could not be interpreted as target end > ~ 環境 ~ OS:Windows 7 clang:version 3.1 g++(mingw):version 4.6.1(あ,でもインストール適当なんで4.7とかとかぶってるかもです) boost:version 1.4.7(1.0っていうんですかね?) 何か激しく勘違いをしている可能性もあるのでお暇な方はどうぞ教えてください. P.S. なんとインデントが消えてしまうのですね!

  • c++11での文字列リテラルの特殊化について

    c++11言語でのテンプレート部分特殊化についての質問です。 コメントアウト部分は出力結果です template<class T> struct VT { static const int type = 1;}; template<class T,int N> struct VT< T[N] > { static const int type = 2;}; template<class T,int N> struct VT< const T[N] > { static const int type = 3;}; template<class T> struct VT< T* > { static const int type = 4;}; template<class T> struct VT< const T*const > { static const int type = 5;}; #include<iostream> #include<typeinfo> int main(){ std::cout<<"A:"<< VT< char >::type << std::endl; // A:1 std::cout<<"B:"<< VT< char[10] >::type << std::endl; // B:2 std::cout<<"C:"<< VT< char* >::type << std::endl; // C:4 std::cout<<"D:"<< VT< char const [1] >::type << std::endl; // D:3 std::cout<<"E:"<< VT< decltype("") >::type << std::endl; // E:1 std::cout<<"G:"<< typeid( char const [1] ).name() << std::endl;// G:char const [1] std::cout<<"H:"<< typeid( "" ).name() << std::endl;// H:char const [1] } 型名を直接記述したD,G、文字列リテラルを記述したE,H。 コンパイラ毎の差はあれど、GとHの型名は同じものが表示されます。 ですが、[D:3] [E:1]と値は違い、別の特殊化テンプレートが使われています。 この部分が分かりません。 また、配列リテラル、文字列リテラルに対し部分特殊化テンプレートを宣言する方法などありましたら、ご教示お願いします。

  • c++ で *の逆三角旗を作りたいです

    普通の三角旗はできましたが逆三角旗が分かりません 例えば3と入力したら * ** *** ** * こんな感じで出力させたいのですが考え方が分かりません 普通の方のコードはこんな感じです int i, j; cin>>num; for (i = 1;i <= num;++i) { for (j=1;j<=i;j++) { cout << "*"; } cout << endl; } for (i = 1;i <= num-1 ;i++) { for (j=1;j<=num-i;j++) { cout << "*"; } cout << endl; } cout << endl;

  • coutへの出力内容をプログラム中で取得

    C言語、C++(WinXP)で以下のようなことはできるのでしょうか。 例えば、 //A.cpp void main() { cout << 1 << endl; } というプログラムをA.exeという名前で作ったとします。そして、別のB.exeというプログラムを //B.cpp void main() { system( "A.exe" ); } として実行すると(A.exeとB.exeは同じフォルダにあるとして)、コマンドプロンプトに"1"と出力されますが、B.exe中でA.exeがcoutに出力した内容を取得してなんらかの計算をする、例えば、 //B.cpp void main() { system( "A.exe" ); int x; //xにcoutの内容"1"を取得する x *= 2; } のようなことはできるのでしょうか。また、A.exeの出力先がcoutではなくcerrの場合はどうでしょうか。 coutの場合はリダイレクトを使えば同様のことができるような気もするのですが、実際にやりたいのは、コマンドプロンプトで使う事を前提にして作ったプログラム(A.exeのような)があり、それをVC++6.0で作るダイアログベースのGUIプログラムから呼び出します。ただ、A.exeはエラーがあった場合等にcoutやcerrにメッセージを出力するので、GUIプログラム側でそれを取得してエディットボックスやメッセージボックスに出力したいのです。 このような事ができるのかどうかもわからないのですが、もし方法をご存知でしたらご教授をお願いします。

  • char型変数のアドレスを coutで表示するには

    #include <iostream> using namespace std; int main() { bool b; int i; short s; long l; float f; double d; char c; //上で宣言した変数のアドレスを表示 cout << "bool &b " << &b << endl; cout << "int &i " << &i << endl; cout << "short &s " << &s << endl; cout << "long &l " << &l << endl; cout << "float &f " << &f << endl; cout << "double &d " << &d << endl; cout << "char &c " << &c << endl; //「char &c 」とのみ表示される cout << '\n'; //char型のみ printf で再表示 printf("char &c %p\n", &c); //「char &c ********」と表示される return 0; } 上のプログラムを実行すると cout << "char &c " << &c << endl; のところだけ、アドレスが表示されません。 printfを使えば、char型の変数のアドレスも表示されるのですが…。 coutを使ってchar型のアドレスを表示させるにはどうすればいいのでしょうか。 よろしくお願いします。

  • 置換をするプログラム

    visual C++で入力された文字列に対し、#があったら%に置換するプログラムを作っています。insertを使おうと思うのですが、よくわかりません ずっと考えているのですが、ここから1週間進んでいません 教えてください #include<iostream> #include<string> #include<cstdlib> using namespace std; int main(void) { string a,s; cout <<"文字列を入力してください"<<endl; getline(cin,s); int i,j=0; while( j!= s.npos) { i=s.find_first_of("#",j); if(i==s.npos){ cout << s.substr(j) << endl; break; } if( i>0) { cout << s.substr(j, i-j); j=i; } i=s.find_first_not_of("#",j); if( i== s.npos) { a=s.substr(j); j=i; } else{ a=s.substr(j,i-j); j=i; } for(i=0; i<s.length(); i++) { if (s[i]== "#"){ s.insert(i,"%"); } cout<<a.s[i]<<endl; } } return 0; }