none
Visual C++ 2008 EEでボタンの判定、結果を配列に格納 RRS feed

  • 質問

  • OSはXPでViaual C++ 2008 Express EditionのWindowsフォームアプリケーションにて一つのフォームで全132問に答えるというものを作成しています。フォームには[戻る]、[次へ進む]、[チェック除外]ボタンと「はい」、「いいえ」、「どちらでもない」のラジオボタン、問題文とタイマーのラベル、テキストボックス(問題番号を入力すると[戻る]ボタンが[移動]ボタンに変わり、入力した問題に進む)があります。最初に変数qに1を入れ、[次へ進む]を押すとqに1がプラスされswitch文で2問以降に進む(ラベルのみ切り替わる)というもので、最後の問題に行くと[次へ進む]ボタンが[終了]ボタンに変わります。ただし、全ての問題に解答していなければ終了できないようにしています。この解答結果をCSVに(はいなら1、いいえなら2、どちらでもないなら3)出力したいと考えているのですが、ラジオボタンにチェックを入れ、[次へ進む]ボタンを押したときのみ「インデックスが配列の境界外です」というエラーが表示されてしまいます。コードは以下の通りですが、どこを直せばよいのか分からないのでご教授願います。

    private: System::Void button1_Click(System:Surprisebject^ sender, System::EventArgs^ e) {
    endflag = 0;
    this->button2->Text = "次へ進む";
    if(flag == 1){
    q = jump;
    flag = 0;
    this->button1->Text = "戻る";
    this->textBox1->Text = "";
    }else{
    q--;
    }
    if(q == 1){
    this->button1->Enabled = false;
    }
    switch(q){
    case 1:
                             ・
                             ・
                             ・
                             case 132
                              endflag = 1;
    break;
    }
                               }:

    private: System::Void button2_Click(System:Surprisebject^ sender, System::EventArgs^ e) {
    String^ s = rtrstrg();
    if(endflag == 1){
    if(s == "") {
    MessageBox:Tongue Tiedhow("全ての質問に答えて下さい。","エラー");
    }

    else if(MessageBox:Tongue Tiedhow("終了しますか?", "確認", MessageBoxButtons:SurpriseKCancel, MessageBoxIcon::Question) == System::Windows::Forms:Big SmileialogResult:SurpriseK) {
    this->Close();
    }
    }
    q++;
    this->button1->Enabled = true;
    switch(q){
    case 2:
                         ・
                         ・
                         ・
                         case 132
                          endflag = 1;
       break;
    }
                         }:

    private: System::Void button3_Click(System:Surprisebject^ sender, System::EventArgs^ e) {
    this->radioButton1->Checked = false;
    this->radioButton2->Checked = false;
    this->radioButton3->Checked = false;

    }

    private: System::Void chg(System:Surprisebject^ sender, System::EventArgs^ e) {
    bool result = int::TryParse(textBox1->Text, jump);
    if(jump > 0 && jump <= 132){
    if(jump != q){
    this->button1->Text = "移動";
    this->button1->Enabled = true;
    flag = 1;
    }
    }
    else{
    textBox1->Text = "";
    this->button1->Text = "戻る";
    flag = 0;
    }
    }

    private: System:Tongue Tiedtring^ rtrstrg() {
    String^ s;
    for(int i=1; i<=QSTNB; i++) {
    s += this->rtrdt(i);
    if(s->EndsWith("×")) {
    return "";
    }
    }
    return s->Remove(s->Length - 1);
    }

    private: System:Tongue Tiedtring^ rtrdt(int qstn) {
    //配列の宣言
    array<RadioButton^>^ arb = gcnew array<RadioButton^>(SZBH);
    for(int i=0; i<SZBH; i++) {
    arbIdea = dynamic_cast<RadioButton^>(this->Controls->Find("radioButton"+(qstn*SZBH-SZBH+1+i), true)[0]);
    }
    return this->chck(arb);
    }
    private: System:Tongue Tiedtring^ chck(array<RadioButton^>^ arb) {
    for(int i=0; i<arb->Length; i++) {
    if(arbIdea->Checked == true) {
    return i + 1 + ",";
    }
    }
    return "×";
    }

    2008年11月19日 2:38

回答

  • コードを全部読むというのは大変です。

    何が悪いか教えてくれと言うのは簡単ですが、それを再現させる時間、コメントする時間を全員が取れるわけではありませんので、ご了承下さい。

     

     tierra31 さんからの引用

    ラジオボタンにチェックを入れ、[次へ進む]ボタンを押したときのみ「インデックスが配列の境界外です」というエラーが表示されてしまいます。

    F5キーか、デバッグ実行ボタンあるいはメニューから実行されているのでしょうか?

    そのエラーが出たタイミングで、実行中の行の色が変わっていませんか?

    その前後に何らかの問題があるはずなので、カーソルを合わせて変数の値を見たりしてみて下さい。

     

    また、この機会にデバッグのやり方を書籍等で勉強して下さい。

    2008年11月19日 14:47
    モデレータ

すべての返信

  • コードを全部読むというのは大変です。

    何が悪いか教えてくれと言うのは簡単ですが、それを再現させる時間、コメントする時間を全員が取れるわけではありませんので、ご了承下さい。

     

     tierra31 さんからの引用

    ラジオボタンにチェックを入れ、[次へ進む]ボタンを押したときのみ「インデックスが配列の境界外です」というエラーが表示されてしまいます。

    F5キーか、デバッグ実行ボタンあるいはメニューから実行されているのでしょうか?

    そのエラーが出たタイミングで、実行中の行の色が変わっていませんか?

    その前後に何らかの問題があるはずなので、カーソルを合わせて変数の値を見たりしてみて下さい。

     

    また、この機会にデバッグのやり方を書籍等で勉強して下さい。

    2008年11月19日 14:47
    モデレータ
  • こんにちは、フォーラムオペレータ大久保です。

     

    tierra31 さん、その後いかがでしょうか?

    サンプルコードのあちこちに顔文字が  表示されてしまって、少々見づらくなってしまっていますね…

    もしまたサンプルコードを投稿いただくことがあれば、こちら 参考にしてみてください。

     

    アドバイスをくださった Azulean さんの投稿に「回答済み」チェックをつけさせていただきましたが、また何かございましたら遠慮なく投稿してください。

    それでは

    2008年12月12日 7:43