W0520546:初期化されないパスがあります。:種別"シンボル名"(宣言位置 行行番号)

割り込み関数の中でswitch文を書いたら、

switch文の制御式の変数に、以下の警告が出たのですが、どう直せばいいのでしょうか。

W0520546:初期化されないパスがあります。:種別"シンボル名"(宣言位置 行行番号)

開発環境はe2studio v6.30で、使用マイコンはRX231です。

Parents
  • わわいです
    switch文で変数に値を代入しているものと思われますが、その中で代入しない処理があると思われます
    あるあるなのが、defaut:を指定してないために代入されない場合が出てくるということですね。

    ということで、このワーニングを潰すためには、switchのすべての場合に値が代入されるようにする、あるいは、最初にその変数に予め何らかの値を代入しておく、
    ということをすれば、それはでてこなくなります。

    #しかし、ワーニングが出ないからといってバグがない、ということにはならないので注意を。
  • わわい様
    ありがとうございます。
    caseの中では全て代入させました。
    >最初にその変数に予め何らかの値を代入しておく、
    ここができていないから、なのかなと思います。
    制御式の変数は関数の外で宣言しましたが、そこで0を代入しています。
    以下のように記述しています。
    まだ警告は消えていません。代入が漏れてないかもう少しよく見てみます。

    int var = 0;
    static void interrupt (void)
    {
    switch (var)
    {
    case 0:

     var = 1;
    break;
    case 1:

     var = 2
    break;
    case 2:

     var = 0;
    break;
    default:

     var = 0;
    break;
    }
    }
  • わわいです
    警告がまだ出ている、ということは、まだ代入していないパスが残っている、ということなので頑張ってみてみましょう
    代入する前にif文でbreakしているとか、if文で代入してるんだけど、else節では抜けてた、というのがあるあるだったりします
  • わわい様ありがとうございます。
    caseの中でif/elseを書いていました。あるあるの通りでした。
    昨日まではその記述漏れを潰しても、警告が消えなかったのですが、
    再起動させた今日は警告が出なくなりました。
    きっと代入漏れだったのではと思いますが、警告内容を全て読んでいないことが分かりましたので、
    NoMaY様の訂正もしておきました。
  • C言語はたまにしかいじらないから、細かい文法は知りません。
    勘だけど、 int var = 0; が鍵じゃないかな。
    int var ; var = 0 ; と分けた方が良いんじゃないかな。
    勘の理由は、int var = 0; はmain 関数を走らす前に初期値を書き込むために使うからです。
    int var ; var = 0 ; とは意味が違うと思っています。
  • int var;は宣言のみですから、通常(ほとんど、多く)は0で初期化されますよね、
    ローカル関数内でこれを宣言すると、スタックに領域を取りますから、
    不定の値になります
    int var=0;は0で初期化するように明示的に指定していますから初期値は0ですよね、
    void proc(void)
    {
    int var=0;
    .......
    }
    なんていうのは、内部を覗いてみると(アセンブラ?)
    void proc(void)
    {
    var=0;
    .......
    }
    rich formattingでもインデントが付きませんね
    NoMaYさんはどうされて、あんなに綺麗に表示されるのでしょうか
  • C言語の教科書を読むと、学習に重きを置いていているPASCALに対して、もっと実用的であることを印象付けた言語であることが書かれてます。その中の具体例として、「宣言と初期化が同時にできる」とか、「必要な時に変数の定義ができる」があります。

       for(int i=0;・・・・

    などが具体例として紹介されます。ここでは条件文の中で初期化付きの変数定義があることの是非になります。

       switch (i){
         ・・・・
       case 1: int j=0;break;
         ・・・・
       }

    はリスクがありそうですが言語仕様で否定してしまうと、根本的なC言語を否定してしまうことになります。開発ツールでのエラーやワーニングにするか、それぞれのプログラマ側のガイドラインにするかになります。まずは、ユーザーの意見を集めて開発ツールでの扱いをルネサスが決めることになります。いずれにしても開発ツールでの扱いが明確でなく、その時々で変化するのはバグと言って良いと思います。そのような視点でこのスレッドは非常に良い書き込みだと感じます。

  • IKUZOさん
    ほやです。

    以下、本題に関係ない投稿画面の豆知識:

    > rich formattingでもインデントが付きませんね
    > NoMaYさんはどうされて、あんなに綺麗に表示されるのでしょうか

    rich formattingで編集する時、View -> Show blocks でブロック枠を表示しておき、
    ソースコードを書いた箇所のブロックを Formats -> Blocks -> Pre にすると
    そのブロックに <pre>タグが付いてインデントが有効になります。

    int myfunc( void )
    {
        /* TABコードでインデント */
        return 0;
    }

    もっと激しく(?)やりたいなら、Tools -> Source Code でHTMLの記述を好きなように...

Reply
  • IKUZOさん
    ほやです。

    以下、本題に関係ない投稿画面の豆知識:

    > rich formattingでもインデントが付きませんね
    > NoMaYさんはどうされて、あんなに綺麗に表示されるのでしょうか

    rich formattingで編集する時、View -> Show blocks でブロック枠を表示しておき、
    ソースコードを書いた箇所のブロックを Formats -> Blocks -> Pre にすると
    そのブロックに <pre>タグが付いてインデントが有効になります。

    int myfunc( void )
    {
        /* TABコードでインデント */
        return 0;
    }

    もっと激しく(?)やりたいなら、Tools -> Source Code でHTMLの記述を好きなように...

Children
  • toy_smさんすいません、

    「本題に関係ない投稿画面の豆知識:」で

    ほやさんありがとうございます、

     rich formattingで編集する時、

    1.View -> Show blocks でブロック枠を表示
    2.ソースコードを書いた箇所のブロックを Formats -> Blocks -> Pre にする

    ブロックに <pre>タグが付いてインデントが有効になります。

    int var=0;
    void interrupt(void)
    {
    switch(var){
    case 0:
    var=1;
    break;
    case 1:
    var=2;
    break;
    case 2:
    var=0;
    break;
    default:
    var=0;
    break;
    }
    }
    </pre>
    にすれば元に?タブは入力できませんね、勉強すれば自由にできるように
    してあるということなんですね、ヘルプを読まないといけないということですかね。
  • IKUZOさん
    ほやです。

    > にすれば元に?タブは入力できませんね、
    HTMLのタグなのでタグ自体は見えません。
    御自分の投稿を編集モードで Tools->Sourceで改めて表示して見れば意味が解ると思います。

  • ほやさん

    すいません

    NoMaYさんの

    の投稿見てましても、<pre>タグを終了するというのは

    多分できない仕様なんでしょうか?

    ソース行が大抵後の方になってますね

    投稿する前にhtmlのテキスト編集ができたりすると、

    便利になるかもですね

    セキュリテイ的にしない方が良いのでしょうね

    テキスト挿入という機能は申し分ないのですが

    日本語が文字化けますね、

    グローバルですから英語になっているのでしょうね

    これぐらいで、いろいろ、

    余分なことでご迷惑おかけいたしました。

  • IKUZOさん、こんにちは。NoMaYです。

    続きは、新しく立てたスレッドがありますので、そちらでどうでしょうか、、、