• 締切済み

enumの記述について。

static enum state { Start, Collect, Skip, End } state; この記述の扱いについて教えて頂ければ幸いです。

みんなの回答

回答No.3

C言語の仕様の下書きならここで見られますので、まずは仕様をみてみる事をおすすめします。 http://www.open-std.org/jtc1/sc22/wg14/ とりあえず、最近公開されたC言語の仕様であるC11の最新の下書き (ほとんどリリースと同じだと予想しますが) はこれですね。 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf この6.7.2.2 Enumeration specifiersを読むと良いと思います。 | 2 The expression that defines the value of an enumeration constant shall be an integer | constant expression that has a value representable as an int. まず、enum定数はint型で表現できるものしか表現出来ません。 | 4 Each enumerated type shall be compatible with char, a signed integer type, or an | unsigned integer type. The choice of type is implementation-defined, but shall be | capable of representing the values of all the members of the enumeration. そして、enum型はchar型、符号付きint型、符号なしint型と互換性があります。 どの型になるかはenum定数が全て入る大きさであれば実装依存です。 まあ、よほどメモリーが逼迫している環境で使うバイナリーを吐くコンパイラーでもない限りint型にするのでは? > スタティック変数のstateを初期化するには、Start/Collect/Skip/Endでしかできないのかな?と。 見落としがあるかもしれませんが、ざっと仕様を見る限り、そういう制限は特に見つけられませんでした。 ただ、ビット数が不足してしまい、メンバーではない値を代入した場合に正しく扱える保証はない可能性があるでしょう。 > enumを型宣言として扱い、enum内で定義される数によって、スタティック変数のstateが、char/int/longとして展開されるのかなと。 実装依存ですが、仕様を見る限りではenum定数を表せる最小限の型となるべくchar / int / unsigned intを使い分けることはありえるでしょう。 ただ、long型との互換性は無さそうです。

v-north
質問者

お礼

早々教えていあただいたページチェックしたいと思います。改めて新しくわかた事がありましたら、ご報告させていただきます。御回答ありがとうございました。

noname#208507
noname#208507
回答No.2

C言語の仕様で、static変数は暗黙のうちにゼロに初期化されます。この場合、変数stateの初期値はStartです。 名前空間が違うので問題ないですが、変数名が state で、型名(enumのタグ名)も同じ state というのは、あまり良くない名前の付け方ですね。

v-north
質問者

お礼

変数stateの初期値はStartというのは、なるほどと言う思いです。ありがとうございます。

  • pa_cotta
  • ベストアンサー率43% (25/58)
回答No.1

enum型の定数は特に指定がない限り先頭を基準として0から始まる整数値の定数が割り当てられます(増加値は1)。 なので、Startは0、Collectは1(以下略)のような意味になります。 標準出力に出力してみるとどうなっているかが分かりやすいかと思います。

v-north
質問者

補足

早々の御回答ありがとうございます。 アップしてから自分なり考えていたのですが、使われ方としたら、下記のような宣言したのと同じような扱いなのです。で、思ったのが、スタティック変数のstateを初期化するには、Start/Collect/Skip/Endでしかできないのかな?と。それで#define OTHERS 100;として、state=OTHERとなるか調べてみたのですが、OKのようでした。 enum state { Start, Collect, Skip, End } state; static int state; で、思ったのですが、enumを型宣言として扱い、enum内で定義される数によって、スタティック変数のstateが、char/int/longとして展開されるのかなと。2日ほど前から悩んでいまして、本質問をアップして後、再度熟考してみたら、上のような事が閃いた次第です。

関連するQ&A

  • enum型

    お世話になります。 Javaのenum型に関してお聞きしたいです。 JavaのAPIドキュメントを見ると、enumのvalueOfメソッドに関して、 以下のように記述がありますが、具体的にどのように使用するので しょうか? public static <T extends Enum<T>> T      valueOf(Class<T> enumType,String name) どうかよろしくお願いします。

  • javaのenumについて

    下記の如くenumを利用しています。 Q1) 機械語コードに於いては、ONE、TWO、THREEの内容はどの様に置き換わりますか? Q2) ONE、TWO、THREEの内容は、整数に置き換えるような記述はありますか? //==================================================== class T_threadC { static int CNT=20000; volatile static int DATAX=-1; public static void main(String args[]) { abc s=abc.TWO; //sにabcで定義したTWOを代入する switch(s){ case ONE: CNT=2000; break; default: CNT=20000; break; } System.out.println("CNT="+CNT); new rcvInterrupt().start(); } } public enum abc { ONE, TWO, TREE }

    • ベストアンサー
    • Java
  • ネストしたenumへのリフレクションによるアクセス

    public class Game {   // ゲームの状態   private enum GameState{    TITLE,    PLAYING,    GAMEOVER,   }   private GameState state; } 上記のクラスに対して、JUnitのテストコードから、 メンバ変数のstateの値とenum定数 GameState.TITLEとの比較がしたいと思っています。 イメージとしては、 if(state == GameState.TITLE){ ..... } のような形です。 GameStateがprivateで宣言されているため、テストコードからはリフレクションを使用すればアクセスできるのではないかと思っているのですが、ネストしたクラスにどのようにアクセスすればよいのかがわかりません。 テストコードにて、 Game game; Class<? extends Game> c = game.getClass(); // GameState取得 Field e = c.getDeclaredField("GameState"); とすると、実行時にGameStateがないと言われてテストに失敗してしまします。 テストコードからGameStateにアクセスするにはどのようにすればよいのでしょうか?

    • ベストアンサー
    • Java
  • boolean型ではなくて

    booleanの2つの値を取る変数ではなく、3つの値を取れる変数ってあるのでしょうか?booleanを2つ使用した場合もやってみたのですがうまく動きませんでした。先に次のようにbooleanを記述して。 boolean state=true; boolean state1=true; boolean state2=true; 後半部分で次のようにやってみたのですが、3値とったことにはならないですかね?(^^; if(state)     {      if(state1){buffer=img2;}      else{buffer=img3;}      if(state2){buffer=img4;} else{buffer=img5;}     } else{} g.drawImage(buffer,0,0,null); state1 = !state1; state2 = !state2;

    • ベストアンサー
    • Java
  • アセンブラの .= について

    下記のようなコードで、. = start + 3/. = _start + 4 の処理について教えて頂ければ幸いです。 .globl _start; _start: jmp skip nop . = _start + 3 . = _start + 4 .byte 0 skip:

  • VB6 ClassにてEnum(列挙型)のうまい使い方

    へっぽこPGです。 今まで私の質問にご回答を頂いた方々、改めてお礼申し上げます。 最近VB6でActiveXDLLにて、DLLを作り始めました。 Classについて勉強を始めたばかりで、 実現できそうな機能と実現できない力量のギャップに苦労しています。 さて、いろいろと便利なDLLを作ってやるぞ!と意気込み、 ExeからDLLを参照してプロパティに値を設定する時に、 インテリセンスが出るようにしたく、ClassにEnum(列挙型)を使うやり方を見つけましたが・・・・。 その先困ってます。 VB6でデバッグをしているわけですが、 Class(Dll)とExeは別プロジェクトで生成しており、 Dllはバイナリ変換、デバッグはExeを実行するように設定済です。 これでActiveXDLLプロジェクトで「開始」をすると、Exeを実行してくれます。 Exeのプロジェクトから、 「開始」・ステップ実行して確認しましたが、 正常に動作しているようです。(記述した文がそれぞれ機能しているという意味で) ActiveXDLLプロジェクトから、 「開始」後、「停止」をして、Dllを上書きしようとすると、 「書込みできません。"~DllのPath~"」とMsgboxのBouttonのでいうvbMsgBoxStyle=vbCriticalの形式で、 Msgboxが表示されてしまいます。 どうやらExeがDLLを離していないのでしょうか? もちろん列挙型を設定していないDLLの場合ですと、上書きは可能です。 (他にも上書きできないパターンを見つけましたが、話が脱線するので割愛します。もしご存知でしたら、併せて教えて頂くと幸いです。) 困っている点としては、 1 デバッグする上で、Dll(書出)⇔Exe(開始)を繰り返したく、都度プロジェクトを閉じて、開いてDLL書出しするのは、非効率。 (DLLを書き出して、インターフェースを変えてしまえば、Exeはリコンパイルが必要なので、あんまり意味ないかも・・・とも) 2 読み取り専用プロパティを作って、Initializeで初期値を設定してしまう方法を考えたが、非常にかっこ悪いし、運用が大変。 3 1を我慢したとしても、作成したDLLはCOM+に登録して、WebサーバでASPから使用するつもりなので、DLLを離してくれないと、無駄なプロセス動き続けてしまう(?)→未テスト です。 いろいろとツッコミどころがあるかもしれませんが、 忌憚なくご意見下さい。 ---Class-(test_Class)---- '列挙宣言 Public Enum Chiiki Hokkaidou = 0 Aomori = 1 Akita = 2 End Enum 'プロパティ値を格納しておく変数 dim aaa as integer 'プロパティでEnum宣言した型を引数に指定します、 Public Property Get Shusshin() As Chiiki Shusshin = aaa End Property Public Property Let WindowState(ByVal NewValue As Chiki) aaa = NewValue End Property ---Class-End-------------------- ---Exe----------------- 'Classは参照設定にて '参照設定にしている理由としては、インテリセンスでロパティ・メソッド等を利用したいから。開発側の怠慢? Sub a 'Class宣言 Dim a_class as test_Class Set a_class = New test_Class 'プロパティ設定 ↓ = と打つと、Classの列挙で設定した値がプルダウン a_class.WindowState = Aomori 'プロパティ値表示(処理自体に意味無し) '「1」 と表示される Msgbox a_class.WindowState 'Class開放 Set a_class = nothing End sub ---Exe-End----

  • インスタンスNameを文字列で表現するには?

    Object State; public static final Object PLAY=new Object(); public static final Object STOP=new Object(); Sateを操作するメソッド(); : : System.out.println(Object.Stateの文字列表現); としたいのですが、ObjectインスタンスであるPLAYやSTOPをprintlnメソッドで文字列として表現させるにはどうすればいいのでしょうか?コンソールにPLAY,STOPと表示させたいのですが、そのままprintln(State)とすると訳の分からない文字(→java.lang.Object@239137)が出てきます。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Verilog-HDLによる設計において

    現在Z8085のCPUを設計しており、テンポラリレジスタにラッチする部分でなかなか上手くいきませんので質問させていただきます。 always文を使用したステートマシンにより制御しようとしているのですが次のようなWarningが出ます。 Warning: Latch IR[0]$latch has unsafe behavior Warning: Latch IR[1]$latch has unsafe behavior            : Warning: Latch IR[7]$latch has unsafe behavior Warning: Latch TMP1[0]$latch has unsafe behavior Warning: Latch TMP1[1]$latch has unsafe behavior            : Warning: Latch TMP1[7]$latch has unsafe behavior Warning: Latch TMP2[0]$latch has unsafe behavior Warning: Latch TMP2[1]$latch has unsafe behavior            : Warning: Latch TMP2[7]$latch has unsafe behavior Warning: Latch NEXT_STATE[0]$latch has unsafe behavior Warning: Latch NEXT_STATE[1]$latch has unsafe behavior <ソース> module CPU_TMP( CLK, nRST, FROM_DCD, IR, TMP1, TMP2, STATE, NEXT_STATE ); input CLK;//クロック input nRST;//リセット input [7:0] FROM_DCD;//入力命令 output [7:0] IR;//命令レジスタ output [7:0] TMP1;//テンポラリレジスタ1 output [7:0] TMP2;//テンポラリレジスタ2 output [1:0] STATE;//現在のステート output [1:0] NEXT_STATE;//次のステート reg [7:0] IR; reg [7:0] TMP1; reg [7:0] TMP2; reg [1:0] STATE; reg [1:0] NEXT_STATE; //状態 parameter S0 = 2'b00; parameter S1 = 2'b01; parameter S2 = 2'b10; parameter SD = 2'b11; //命令 parameter INRA = 8'h11; parameter MVIA = 8'h22; parameter JMP = 8'h33; always @( posedge CLK ) begin     if( nRST == 0 )       STATE <= SD;     else       STATE <= NEXT_STATE; end always @( STATE ) begin    case( STATE )      SD : begin            IR <= 0;            TMP1 <= 0;            TMP2 <= 0;            NEXT_STATE <= S0;          end      S0 : begin            IR <= FROM_DCD;            case( FROM_DCD )              INRA : NEXT_STATE <= S0;              MVIA : NEXT_STATE <= S1;              JMP : NEXT_STATE <= S2;            endcase          end      S1 : begin              TMP1 <= FROM_DCD;              NEXT_STATE <= S0;          end      S2 : begin              TMP2 <= FROM_DCD;              NEXT_STATE <= S0;          end endcase end endmodule どのようにしたらこのWarningを消すことができるでしょうか。

  • DOS バッチファイルコマンド記述について

    DOSのバッチファイルを利用してコマンドを記述したバッチファイルを作り、 ドロップしたファイルのバイト数を見て1000バイト以上あったら指定のフォルダに 移動させたいと考えています。素人ながらに以下のファイルを作ってみたのですが うまく動いてくれません。添削して頂けると助かります。よろしくお願いします。 :start if %1""=="" goto end if "%~z1" gtr 1000 move "%1" C:\bk shift goto start :end

  • 列挙体のメンバーの先頭に記号や数字を使うとエラー

    列挙体のメンバーの先頭に記号や数字を使うとエラー こんにちは。 vbの列挙体のメンバーの頭に、以下のように数字や記号を付けると、 Public Enum extension .wav 3gp End Enum 'ステートメントはenum本体内部には記述できません。' と怒られてしまいます。 何かエスケープする方法があればご教授ねがえないでしょうか? visual studio 2008を使用しています。 宜しくお願いします。