switch文でenum型を判別するには? – プログラミング – Home

switch文でenum型を判別するに...
 
通知
すべてクリア

[解決済] switch文でenum型を判別するには?


なちゅら
 なちゅら
(@なちゅら)
ゲスト
結合: 15年前
投稿: 5
Topic starter  

再びお世話になります。
WinXP VC++6.0 ダイアログベース(MFC)での開発です。

1.メインのダイアログ:モーダルダイアログを表示
2.モーダルダイアログ:ラジオボタンを選択し、それに応じてenumで列挙した値を取得、
  OKボタンでメインダイアログに戻る
3.メインのダイアログ:2.での値によりswitch文で分岐
をさせようとしています。

//Define.h
enum eRadio{AA,BB,CC,DD};

//Sub.cpp-Main.cppからのモーダルダイアログ
//(一部省略 ラジオボタンRadio1~Radio4があります)
void CSub::OnRadio1(){ radio = AA; }
void CSub::OnRadio2(){ radio = BB; }
void CSub::OnRadio3(){ radio = CC; }
void CSub::OnRadio4(){ radio = DD; }
//※radioはCSubクラスのpublicメンバ変数・eRadio型

//Main.cpp-メインのダイアログ
void CMain::On**(){
CSub csub(this);
res = csub.DoModal(); //モーダルダイアログでSub.cppの内容を処理
if(res == IDOK){
eRadio select = csub.radio;
switch(select){   //★
case AA: (処理) break;
case BB: (処理) break;
case CC: (処理) break;
case DD: (処理) break;
default: break;
}
} //☆

★部分にブレークポイントを置き、ステップ実行をしてみたのですが
defaultにすら行かず☆へ飛んでしまいます。
その他の状態としては、
・コンパイルしてもエラーは無し
・switch文ではなくif(select == AA)ではきちんと判別される
・★部分でとまっている時のクイックウォッチの値は
 select→「AA」(Radio1選択時)
 case AA:の「AA」のみ→「0''」
・↑を受け、selectをeRadio型でなくint型に変更。
 (selectをクイックウォッチで見た時の値が「0」になっただけ)

どうすればswitch文で判別させられるでしょうか?
メンバ変数の扱い等不十分かもしれませんが、その辺はひとまず置いておいてください。。
不十分な情報があれば追記します。

長くなりましたが、よろしくお願いします。


引用未解決
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

//Define.h
enum eRadio{AA,BB,CC,DD};

の部分を

typedef enum eRadio{AA,BB,CC,DD} eRadio;

にしてみてください。


返信引用
なちゅら
 なちゅら
(@なちゅら)
ゲスト
結合: 15年前
投稿: 5
Topic starter  

仲澤@失業者さん、ありがとうございます。

typedef enum eRadio{AA,BB,CC,DD} eRadio;
にしてみましたが、変わらずです。

試しに別プロジェクトを作り、1つのcppファイルで
typedef enum eTEST{AAA,BBB,CCC} eTEST;

eTEST test;
void CEnum_testDlg::OnButton1() { test = AAA; }

void CEnum_testDlg::OnButton2()
{
switch(test){
case AAA: TRACE(AAA\n); break;
case BBB: TRACE(BBB\n); break;
case CCC: TRACE(CCC\n); break;
default: TRACE(default\n); break;
}
}
としてみましたが、同じくdefaulにも行かずOnButton2() の最後の「}」へ飛びました。
色々調べてはみましたが、C++でなくCでの解説が多く(大差はなさそうなんですが)、
私自身enumはほとんど使ったことがないので何か使い方を間違えている気がしてます…


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ものすごく簡単な例で試してみました。

ダイアログベースのアプリを作成して
そのアプリのOnInitDialog内で以下のコードを動かしました。

enum eTest {AA, BB, CC, DD};
enum eTest test;

test = AA;

switch(test)
{
case AA:
MessageBox(AA);
break;

case BB:
MessageBox(BB);
break;

case CC:
MessageBox(CC);
break;

case DD:
MessageBox(DD);
break;

default:
MessageBox(default);
break;
}

このプログラムを動かすとAAのメッセージボックスが
表示されるのでswitch文による分岐はうまく動作していると
思います。switch-caseの問題と言うよりも他の問題では?
と言う気がします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> switch(test){
> case AAA: TRACE(AAA\n); break;
> case BBB: TRACE(BBB\n); break;
> case CCC: TRACE(CCC\n); break;
> default: TRACE(default\n); break;
> }
このような記述だから最後の } まで飛ぶのでは?
おそらく、TRACEはちゃんと実行されていると思いますけど。


返信引用
なちゅら
 なちゅら
(@なちゅら)
ゲスト
結合: 15年前
投稿: 5
Topic starter  

PATIOさん、Blueさんのご指摘を受け、
更に色々試したところきちんと動作するようになりました。
原因がはっきりしないのが非常に危ういですが、
ひとまず解決とさせていただきます。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました