• ベストアンサー

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の部分にエラーが表示されます。 初心者で全く分からないので、プログラム等、不明な点があればお答え致しますので、どうか分かる方いましたらお返事をよろしくお願いいたします。

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

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

クラス設計の巧拙はひとまずおき、純粋に可否で言えば、質問のコードそのものにコンパイル不能になるような問題はありません。 >ButtonClickイベントにプログラムを書き、 struct Stateの定義をイベントハンドラ内で行っているのでしょうか? それでは無理です。 State型をテンプレート引数にしたいならStateをグローバルにする必要があります。 エラーメッセージは恐らくそのことを言っています。

makefile
質問者

補足

お返事ありがとうございます。おっしゃるとおりです。 こんな感じです↓ void __fastcall TForm3::Button1Click(TObject *Sender) { using namespace std; struct State { // // 状態を表すフラグ // false は、川の左岸、true は、川の右岸を表わす // bool wolf; bool goat; bool cabbage; bool man;       ・        ・       ・   グローバルにする?参考書等で調べてみたのですが、理解に難しいです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

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

あなたが何をしようとしているのか漸く判りました。根本的に無茶なことをしようとしていますね(苦笑。 コンソールアプリのソースをそのままGUIアプリの、しかもイベントハンドラ内に貼り付けても動作する訳ないですよ。 No.5の補足に関しては、 「operator<<()の定義をイベントハンドラから出せ」 が回答ですが、しかしそれだけではあなたのそのプログラムは動作しないはずです。 あなたに必要なのは、「C++の入門書」と「BCBの入門書」の2つのようです。 BCBは非常に敷居の低い開発環境ですが、さすがにプログラミングの基本が判らない状態では使えません。 掲示板でのアドバイスも、「自分なりに勉強してある程度までは理解したが、ここが判らない」という人には有効ですが、何も判らない人にはアドバイスのしようがありません。 急がば回れと言うことわざがありますね。 プログラミングを身に付けたかったら、まずきちんとした入門書(薄いのは役に立ちません)を読むことから始めてください。

makefile
質問者

補足

そうなんです。ostreamに関してはBCBにもヘルプであったので、使えるのかと思っていたのですが… ありがとうございました。勉強し直します。

全文を見る
すると、全ての回答が全文表示されます。
  • KoHal
  • ベストアンサー率60% (110/181)
回答No.5

ただ単にStateの定義を関数内から出せばよいのです。 using namespace std; struct State {  //略 }; void __fastcall TForm3::Button1Click(TObject *Sender) {  State s;  //などなど } 実際的にはソースファイルを分割してしまう方が良いかと思いますが。

makefile
質問者

補足

おっしゃったとおりに, using namespace std; struct State {    //メンバ変数の定義    //メンバ関数の定義 }; void __fastcall TForm3::Button1Click(TObject *Sender) { としたところ, void __fastcall TForm3::Button1Click(TObject *Sender) { // 状態を表示する static ostream & operator << ( ostream & ostr , const State & s ) { ostr << (s.wolf ? "" : "w") << (s.goat ? "" : "g") << (s.cabbage ? "" : "c") << (s.man ? "" : "m") << "-" << (s.wolf ? "w" : "") << (s.goat ? "g" : "") << (s.cabbage ? "c" : "") << (s.man ? "m" : ""); return( ostr ); } 上記の文に対し、 「宣言の型が多すぎる」 「ここでは型’State’は定義できない」 「'_fastcall TForm3::Button1Click(TObject *)'はTForm3のオブジェクトではない」 「ここには記憶クラスstaticは使用できない」 「宣言構文のエラー」と表示されました…。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

> どうしたらよいのでしょう… クラスの設計からやり直すのがbetterではないかと。 StateがStateの履歴(deque<State>)を持つのが妥当な設計とは思えません。 # staticメンバとして持つなら理解できますが。

makefile
質問者

お礼

お返事ありがとうございました。 理解に乏しいので、ヒントのようなものを頂けないでしょうか。

makefile
質問者

補足

DOSではコンパイルできるんですけどね… ありがとうございました…

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

> s.path.push_back( *this ); > に対して > E2285 'deque<State *allocator<State*>>::push_back(const State)'に一致するものが見つからないと表示されてしまいます。。(涙 当然です。ポインタを要素とするように変更したのですから。

makefile
質問者

補足

初心者で理解に苦しいです…。 ありがとうございます。どうしたらよいのでしょう…

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

dequeだと自分自身をメンバに含んでしまい、無限再帰に落ち込むのでしょう。 deque<State*> もしくは list<State> ではいかがでしょうか?

makefile
質問者

お礼

お返事ありがとうございます。 deque<State> pathをdeque<State*> pathに   という意味合いで受け取りました。 すると、状態に対するオペレータの s.path.push_back( *this ); に対して E2285 'deque<State *allocator<State*>>::push_back(const State)'に一致するものが見つからないと表示されてしまいます。。(涙

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • javaのプログラムについての質問です。

    javaのプログラムについての質問です。 javaについて、あまり詳しくないので質問させていただきます。 ボタンを押して円などの色を変えるプログラムで、2色を変える(黄→赤)if文は public void actionPerformed(ActionEvent e) { if (bool) { setBackground(Color.yellow); this.bool = false; } else { setBackground(Color.red); this.bool = true; の様にfalseとtrueを使えばできるのですが、もし3、4色の場合はif文の中をどうしたら良いですか? できれば、ボタンを押すたびに黄→赤→黒→黄…など3~4色のループするようにしたいです。 いろいろ考えたのですが、うまくいきません。どなたか教えて下さい。

    • ベストアンサー
    • Java
  • 既定のコンストラクタがありません。というエラーについて

    こんにちは。私は現在C++を学習中の者です。 現在、 「実例で学ぶゲームAIプログラミング」(オライリージャパン) という本で学習をしているのですが、試しに組んでみた非常に簡単なプログラムでエラーが出て、原因が分からず困っています。 初歩の部分で恐縮なのですが、クラス自身に状態遷移の機能を持たせようとしているようです。 以下のコードは実際にエラーが出たコードです。 #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; class Troll; class State{ public: virtual void Execute(Troll* troll) = 0; }; class Troll{ State* m_pCurrentState; public: void Update(){ m_pCurrentState->Execute(this); } void ChangeState(State* pNewState){ delete m_pCurrentState; m_pCurrentState = pNewState; } bool isSafe(); bool isThreatened(); void Snore(){ cout << " I am sleeping zzz... " << endl;} void MoveAwayFromEnemy(){ cout << " Run Away!!" << endl;} }; bool Troll::isSafe(){ int safe = (int)((rand() / ((double)RAND_MAX+1.0f)) * 10); if(safe >= 5) return true; else return false; } bool Troll::isThreatened(){ int threat = (int)((rand()/((double)RAND_MAX+1.0f))*10); if(threat >= 3) return true; else return false; } class State_Sleep; class State_Runaway: public State{ void Execute(Troll* troll){ if(troll->isSafe()){troll->ChangeState(new State_Sleep());}      ←エラー else{troll->MoveAwayFromEnemy();} } }; class State_Sleep : public State{ public: void Execute(Troll* troll){ if(troll->isThreatened()){ troll->ChangeState(new State_Runaway());} else{ troll->Snore();} } }; main以下は書いていません。 この中で、State,State_Runaway,State_Sleep,は本の丸写しです。 また、Trollの中のpublic以下の、スペースで区切っている部分より上も、丸写しです。スペース以下は動かす為に必要と思い適当につくってみました。 (本では、「このようなのを使えば上手くできるよ」というかんじで、上記の様に部分的に載っていて、一つの完成したコードはありませんでした。) 上記コードの、エラー、と書いた部分で、「クラス、構造体、共用体に既定のコンストラクタがありません。」のエラーが出ます。 自分なりに意味も調べてみて、コンストラクタを定義してるのに、デフォルトコンストラクタを呼び出そうとしてる時に起こるエラーと理解したのですが、上記のコードにどう関わってくるのか良くわかりませんでした。 あとその部分で、new State_Runaway()としていますが、これも意味がわかりませんでした。 new State_Runaway、ではないのでしょうか。 そうしても同じエラーが出ましたが…。 継承クラス等を使うのが初めてなので、かなり初歩的なところでつまずいてる気がするのですが、どういうことかわかる方がいらっしゃいましたらお教え頂ければ幸いです。

  • booleanのエラーコードーの意味が分かりません

    三角形を作るコードを書きました、JAVAの超初心者です宜しくお願いします。 下記のエラーコードが出ています。 1.「型Mathのメソッドabs(int)は引数(boolean)に適用できません。」 ここでどうしてもbooleanで答えを表示させたい場合には、どこをどのように書き直せばよいのでしょうか。 このような書き方がエラーであれば全てのbooleanコードーがエラーになってしまうような気がするのですが。 2.これをEclipseで実行させた場合には、args[1]~args[2]のデーター入力はどのようにしてやるのでしょうか。 実行させたときにキーから入力してやるのですか。 3. コンスタラクタ「this.L1 = a ;」でわざわざ「L1=a;」を定義してやる意味が良く分かりません。 他のメッソド「boolean isTriangle()」、「double getArea()」は「L1・・」で定義されている関数なのにわざわざ「L1=a;」を定義してやる意味が理解できません。 このケースではたまたまコンストラクタは必要ないし、省略も可かもしれませんが。 メッソドの後ろの「()」は、必要の場合はメッソドの引数を入れると本には書いていますが、クラス内で、メンバー変数として(この場合は「int L1, L2, L3 ;」)定義してやれば、メッソドからは、アクセスできるのでそのような処理がなぜ必要かがわかりません。 以上宜しくお願い致します。 ________________________________ class Sample { int L1, L2, L3 ; Sample (int a, int b, int c) { this.L1 = a ; this.L2 = b ; this.L3 = c ; } boolean isTriangle() { if(( L1 + L2 ) > L3 && Math.abs(( L1 - L2 ) < L3 )) { boolean S_bool = true ;     } else{ boolean S_bool = false ; } return S_bool ; } double getArea() { double S = (double)((L1+L2+L3)/2.0) ; double area = Math.sqrt(S*(S-L1)*(S-L2)*(S-L3)); return area ; } } class Sample_Test { public static void main(String args[]) { int s1 = Integer.parseInt( args[ 0 ] ) ; int s2 = Integer.parseInt( args[ 1 ] ) ; int s3 = Integer.parseInt( args[ 2 ] ) ; Sanmple t1 = new Sample ( s1 , s2 , s3 ) ; boolean sankaku = t1.isTriangle() ; double menseki = t1.getArea() ; System.out.println( sankaku ) ; System.out.println( menseki ) ; } }

    • ベストアンサー
    • Java
  • シンボルが見つかりませんというエラーが理解できません。

    以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.io.File; public class janken extends Applet implements Runnable, ActionListener { private static final int EXTERNAL_BUFFER_SIZE = 128000; Image image[] = new Image[3]; Thread t; int index1 = 0; int index2 = 0; String msg = ""; String msg1 = ""; boolean state = false; Button b1 = new Button("ぐー"); Button b2 = new Button("ちょき"); Button b3 = new Button("ぱー"); public void init(){ for(int i = 0; i<=2; i++){ img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG"); } add(b1); add(b2); add(b3); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); msg1 = "結果は・・"; } public void paint(Graphics g){ g.drawImage(img[index1],350,30,this); g.drawImage(img[index2],695,30,this); g.drawString("コンピューター",420,300); g.drawString("あなた",800,300); g.drawString(msg,630,320); g.drawString(msg1,550,320); } public void start(){ state = true; t = new Thread(this); t.start(); } public void run(){ while(state){ index1++; if(index1 == 3){ index1 = 0; } index2++; if(index2 == 3){ index2 = 0; } repaint(); try { Thread.sleep(60); }catch(InterruptedException e) { } } } public void actionPerformed(ActionEvent e){ if(state == false) { start(); return; } state = false; if(e.getSource() == b1) { msg = "ぐー"; index2 = 0; } else if(e.getSource() == b2){ msg = "ちょき"; index2 = 1; } else if(e.getSource() == b3){ msg = "ぱー"; index2 = 2; } check(); repaint(); } public void check() { if(index1 == index2) msg ="あいこ"; else if (index1 == 0) { if(index2 == 2) msg="あなたの勝ち"; else msg ="あなたの負け"; } else if(index1 == 1) { if(index2 == 0) msg="あなたの勝ち"; else msg="あなたの負け"; } else if(index1 == 2) { if(index2 == 1) msg="あなたの勝ち"; else msg="あなたの負け"; } } }

    • ベストアンサー
    • Java
  • basic_ostreamクラスについて

    http://msdn.microsoft.com/ja-jp/library/k262esc6.aspx をみると、VC++2010のbasic_ostream::sentryには  operator bool( ) const; がある事になっていますが、実際は無いようです。 VC++2010 Express Edition のostream(C:\Program Files\Microsoft Visual Studio 10.0\VC\include\ostream)を見ると、sentryにoperator bool() constがありませんでした。 代わりに __CLR_OR_THIS_CALL _OPERATOR_BOOL() const { // test if stream state okay return (_Ok ? _CONVERTIBLE_TO_TRUE : 0); } というのがありますが、 #define _STD ::std:: #define _OPERATOR_BOOL operator _STD _Bool_type と定義されており、operator bool( ) constとは別物でした。 このため、basic_ostream::sentry::operator bool( )を使用しているソースをVC++2010(Express Edition)でビルドしようとするとエラーになります。 ちなみに、このソースをVC++2008 Express Editionでビルドすると通ります。 質問なのですが、 1)basic_ostream::sentry::operator bool( )を使うソースをVC++2010 Express Editionでビルドするにはどうすれば良いでしょうか? 2)なぜVC++2010 Express Editionからbasic_ostream::sentry::operator bool( )がなくなってしまったのでしょうか? ご存知の方、ご教授ください。 よろしくお願いします。

  • string型文字列を数値に変更したい

    サーバーのポート番号を書かれたファイルをmicro SDカードにいれて、ESP-WROOM-32で読み出して、そのファイルからそのポート番号をint Portという変数に格納したいと思っています。 そのために次のようなプログラムを作成しました。 const int port = 0; bool getAwsServerPort(fs::FS &fs, String path) { //File file = SD_MMC.open(path, "r"); File file = fs.open(path, "r"); if (!file) { Serial.printf("Can't Open File %s \n", path); return false; } while (file.available()) { String line = file.readStringUntil('\n'); line = line.substring(0, line.indexOf('#')); //Serial.printf("DeviceID: %s \n", line.c_str()); //String deviceCheck = line.substring(0, line.indexOf("device name")); if (line.indexOf("aws server port") != -1) { String deviceID = line.substring(line.indexOf(':')+1); deviceID.trim(); Serial.printf("aws server port: %s \n", deviceID.c_str()); port = stoi(deviceID.c_str()); return true; } } return false; } この関数を getAwsServer(SD, "/config"); このコードで呼び出した際に、次のようなエラーが発生します。 (エラー内容) /Users/myname/Google Drive/wifiAutoConnection/wifiAutoConnection.ino: In function 'bool getAwsServerPort(fs::FS&, String)': wifiAutoConnection:364:35: error: 'stoi' was not declared in this scope port = stoi(deviceID.c_str()); 文字列から数値への変換で検索してみたところstoiというのがあると聞いて、やってみたのですが、このようなエラーが出てくるのですが、解決方法などご教示頂きますよう、よろしくお願い致します。

  • fread時の0xc0000005エラーについて

    現在、win32APIのGetOpenFileName()を利用して、音声ファイル(wav形式)を選択し、その選択した音声ファイルの情報を取り出すことを考えています。 プログラム自体が長いのですべて載せることが出来ないのですが、関連する部分だけピックアップすると、 main.c内で static OPENFILENAME ofn = { 0 }; static TCHAR strFile[MAX_PATH]; //ダイアログボックスが生成されたら case WM_INITDIALOG: ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = TEXT("WAVファイル(*.wav)\0*.wav\0"); ofn.lpstrFile = strFile; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST; // ファイル選択ボタンが押されたら case IDC_FILE_SELECT: //ファイルを開くダイアログを表示しwavファイルを選択 GetOpenFileName(&ofn); //選択されたファイル名(フルパス)を引数として関数に渡す if(road_wav(strFile) == FALSE) //エラー処理 ------------------ 上記の関数road_wav()は別ファイル(road_wav_file.c)で記述し、 BOOL road_wav(const char *filename){ FILE* wfp; char reafword[4]; if(fopen_s(&wfp, filename, "rb") != 0){ //エラー処理 return FALSE; } else{ //fopen_s成功 } //ここでエラー(0xc0000005) fread(reafword, 4, 1, &wfp); return TRUE; } ------------------ というように、freadの部分で0xc0000005エラーが出てしまいます。 wfpのポインタがエラーの原因かと考え、関数の引数(=選択した音声ファイル名)が間違っている、もしくは、fopen_sで正しく音声ファイルが開けていないかと思い調べてみたのですが、 strFileには選択したファイル名がフルパスで正しく格納されており、f_opensもelse側に行っている(成功している)ようなので、wfpが原因では無いようです。 しかし、他に思い当たる原因が特に無く、どの部分を直せばよいかが分からず困っております。 もし何か分かりましたら教えていただけると助かります。 説明が非常に分かりにくくなってしまい申し訳ありませんが、よろしくお願いいたします。 作業環境 Windows7 64bit Visual Studio 2013 professional

  • juaryについて質問

    $("#s1").click(function(){ $(":checkbox").attr("checked"); return false; }); これチェックボックスにすべてチェックを入れるプログラムです。 逆に取り消すプログラムを実践したいのですが 上手くいきません。 $("#s2").click(function(){ $(":checkbox").attr(""); return false; }); とか色々やっていますが上手く生きません。 じつはformをやっていない状態だと 消えるのですが、formタグ上だと 送信ボタンになってしまいます。 何かいい手はありませんでしょうか?

  • SDから読み込んだ文字列だとAWS通信でエラー

    現在、ESP-WROOM-32でAWSサーバーへアクセスするプログラムをやってます。ESP-WROOM-32に接続したSDカードリーダーから"config"というテキストファイルを読み込んで、そのファイルに書かれたAWSサーバー名やポート番号に応じて接続処理を行いたいと思っています。(*いちいちスケッチで書き込んでコンパイルするのがめんどくさいため) もともとのスケッチにて、次の様なサーバーの変数名の宣言などがされていて、接続できていました。 (例) const char* server = "am5y9zzdy09g0-ats.iot.us-wwww-2.amazonaws.com"; const int port = 8883; これの"const char* server"部分のサーバー名の文字列をSDカードの”config”ファイルから持って来ようと思い次の様なコードを作ったのですが、シリアルモニタで Serial.printf("aws server: %s \n", server); これで文字列を確認しても"am5y9zzdy09g0-ats.iot.us-wwww-2.amazonaws.com" と出てきているのに、AWSサーバとの通信で必ずエラーを起こします。 (今回のプログラム内容の関数部分) const char* server; bool getAwsServer(fs::FS &fs, String path) { //File file = SD_MMC.open(path, "r"); File file = fs.open(path, "r"); if (!file) { Serial.printf("Can't Open File %s \n", path); return false; } while (file.available()) { String line = file.readStringUntil('\n'); line = line.substring(0, line.indexOf('#')); //Serial.printf("DeviceID: %s \n", line.c_str()); //String deviceCheck = line.substring(0, line.indexOf("device name")); if (line.indexOf("aws server") != -1) { String deviceID = line.substring(line.indexOf(':')+1); deviceID.trim(); //Serial.printf("aws server: %s \n", deviceID.c_str()); server = (const char*)deviceID.c_str(); Serial.printf("aws server: %s \n", server); return true; } } Serial.printf("aws server is no data \n"); return false; } このプログラムの問題箇所や解決策など、ご教示の程よろしくお願い致します。

  • 決まった文字を探すloop

    こんにちは、いつもお世話になっています。 入力した文章の中にEが入っていなければEを無視した文章である。 同じ文章でSが入っていなければSを無視した文章である。 と表示するプログラムなのですが、このプログラムを実行するとエラーになります これはループがおかしいのでしょうか。。それともIF文がおかしいのでしょうか。 こんな初歩的な質問ですいません。 boolean lipogramE = true; boolean lipogramS = true; Scanner sc2 =new Scanner(System.in); System.out.println("Enter a sentence "); String input2 = sc2.nextLine(); for(int i =0; i<input2.length();i++){ char e =input.charAt(i); if (e == 'e' || e=='E'){ lipogramE = false; } else if(e =='s'|| e== 'S'){ lipogramS =false; } } if (lipogramE == false){ System.out.println("This input is not a lipogram avoiding E"); }else{ System.out.println("This input is a lipogram avoiding E"); } if(lipogramS == false){ System.out.println("This input is not a lipogram avoiding S"); }else{ System.out.println("This input is a lipogram avoiding S"); }