switch文でenum型を判別するには?

[戻る]
なちゅら 2010/01/05(火) 16:56:05
再びお世話になります。
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文で判別させられるでしょうか?
メンバ変数の扱い等不十分かもしれませんが、その辺はひとまず置いておいてください。。
不十分な情報があれば追記します。

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

仲澤@失業者 2010/01/05(火) 20:02:07
//Define.h
enum eRadio{AA,BB,CC,DD};

の部分を

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

にしてみてください。

なちゅら 2010/01/06(水) 09:37:41
仲澤@失業者さん、ありがとうございます。

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 2010/01/06(水) 10:16:34
ものすごく簡単な例で試してみました。

ダイアログベースのアプリを作成して
そのアプリの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 2010/01/06(水) 10:31:08
>  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はちゃんと実行されていると思いますけど。

なちゅら 2010/01/06(水) 11:27:46
[[解決]]
PATIOさん、Blueさんのご指摘を受け、
更に色々試したところきちんと動作するようになりました。
原因がはっきりしないのが非常に危ういですが、
ひとまず解決とさせていただきます。

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

古いスレッドには追加発言できません。