トップ回答者
Visual C++ 2008 EEでボタンの判定、結果を配列に格納

質問
-
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:bject^ 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:bject^ sender, System::EventArgs^ e) {
String^ s = rtrstrg();
if(endflag == 1){
if(s == "") {
MessageBox:how("全ての質問に答えて下さい。","エラー");
}
else if(MessageBox:how("終了しますか?", "確認", MessageBoxButtons:
KCancel, MessageBoxIcon::Question) == System::Windows::Forms:
ialogResult:
K) {
this->Close();
}
}
q++;
this->button1->Enabled = true;
switch(q){
case 2:
・
・
・
case 132
endflag = 1;
break;
}
}:
private: System::Void button3_Click(System:bject^ sender, System::EventArgs^ e) {
this->radioButton1->Checked = false;
this->radioButton2->Checked = false;
this->radioButton3->Checked = false;
}
private: System::Void chg(System:bject^ 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:tring^ 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:tring^ rtrdt(int qstn) {
//配列の宣言
array<RadioButton^>^ arb = gcnew array<RadioButton^>(SZBH);
for(int i=0; i<SZBH; i++) {
arb= dynamic_cast<RadioButton^>(this->Controls->Find("radioButton"+(qstn*SZBH-SZBH+1+i), true)[0]);
}
return this->chck(arb);
}
private: System:tring^ chck(array<RadioButton^>^ arb) {
for(int i=0; i<arb->Length; i++) {
if(arb->Checked == true) {
return i + 1 + ",";
}
}
return "×";
}
回答
-
コードを全部読むというのは大変です。
何が悪いか教えてくれと言うのは簡単ですが、それを再現させる時間、コメントする時間を全員が取れるわけではありませんので、ご了承下さい。
tierra31 さんからの引用 ラジオボタンにチェックを入れ、[次へ進む]ボタンを押したときのみ「インデックスが配列の境界外です」というエラーが表示されてしまいます。
F5キーか、デバッグ実行ボタンあるいはメニューから実行されているのでしょうか?
そのエラーが出たタイミングで、実行中の行の色が変わっていませんか?
その前後に何らかの問題があるはずなので、カーソルを合わせて変数の値を見たりしてみて下さい。
また、この機会にデバッグのやり方を書籍等で勉強して下さい。
すべての返信
-
コードを全部読むというのは大変です。
何が悪いか教えてくれと言うのは簡単ですが、それを再現させる時間、コメントする時間を全員が取れるわけではありませんので、ご了承下さい。
tierra31 さんからの引用 ラジオボタンにチェックを入れ、[次へ進む]ボタンを押したときのみ「インデックスが配列の境界外です」というエラーが表示されてしまいます。
F5キーか、デバッグ実行ボタンあるいはメニューから実行されているのでしょうか?
そのエラーが出たタイミングで、実行中の行の色が変わっていませんか?
その前後に何らかの問題があるはずなので、カーソルを合わせて変数の値を見たりしてみて下さい。
また、この機会にデバッグのやり方を書籍等で勉強して下さい。