質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.64%

PICマイコン ワーニング

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 854

raspypy

score 95

分からなこと

PICマイコンであるプログラムを作成していますが、
そのプログラムをビルドした際にでる「ワーニング」の原因と解決策が分からず、困っています。

ワーニング

・変数i, x, dtについて、
ワーニング: (346) declaration of "x" hides outer declaration
・XBee_MakePacket10()関数内の計算式において、
ワーニング: (373) implicit signed to unsigned conversion

プログラムコード

int  i , x ;
char dt[36] ;
char adrs[] = {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF} ;  // 相手XBeeのアドレス

void main(void) {
    OSCCON=0x72;    //PLL Disable/8MHz
    ANSELA=0x04;    //RA2 Analog Setting
    ANSELC=0x00;    //PORTC Digital Setting
    TRISA=0x04;     //RA2 Input
    TRISC=0x28;     //RC5, RC3 Input
    LATC=0x00;

    RXDTSEL = 0;
    TXCKSEL = 0;
    TXSTA   = 0x24;         //非同期/8ビット/パリティなし
    RCSTA   = 0x90;         //シリアルポート使用/連続受信あり
    BAUDCON = 0x00;         // 8bit mode
    SPBRGH = 0x00;          //上位8bit
    SPBRGL = 0x33;          //下位8bit

    while(1){       
        i = XBee_MakePacket10(dt,adrs,"test",4) ;
        x = XBee_SendPacket10(dt,i,0) ;
        __delay_ms(5000);
    }
}


void UART_Send(const char *dt,int num)
{
     int a ;
     for (a = 0 ; a < num ; a++) {
          while(TXIF == 0) ;   // 送信可能になるまで待つ
          TXREG = *dt++ ;    // 送信する
     }
}


char XBee_CheckSum_Make(char *packet_dt,int len)
{
     int i , c , x ;

     c = len - 4 ;
     x = 0 ;
     packet_dt = packet_dt + 3 ;   // 4バイト目から開始
     for (i = 0 ; i < c ; i++) {
          x = x + *packet_dt ;
          packet_dt++ ;
     }
     x = 0xff - (x & 0xff) ;
     return (unsigned int) x ;                    // 計算したチェックサム値を返す
}


int XBee_MakePacket10(char *packet_dt, const char *adrs, const char *data, int num)
{
    int x , i ;

     packet_dt[0] = 0x7E ;                             // 開始コード
     x = num + 14 ;
     packet_dt[1] = (unsigned int)(x / 256) ;                          // フレームデータの長さ
     packet_dt[2] = (unsigned int)(x % 256) ;
     packet_dt[3] = 0x10 ;                             // フレームタイプ
     packet_dt[4] = 0x00 ;                             // フレームID
     for (i = 5 ; i < 13 ; i++) {
          packet_dt[i] = *adrs ;                       // 送信先の64ビットアドレス
          adrs++ ;
     }
     packet_dt[13] = 0xFF ;                            // 送信先の16ビットアドレス
     packet_dt[14] = 0xFE ;
     packet_dt[15] = 0x00 ;                            // 最大ホップ数
     packet_dt[16] = 0x00 ;                            // 送信オプション
     for (i = 0 ; i < num ; i++) {
          packet_dt[17+i] = *data ;                    // 送信するデータ
          data++ ;
     }
     i = 17 + num ;
     x = i + 1 ;
     packet_dt[i] =XBee_CheckSum_Make(packet_dt,x) ;   // チェックサム

     return x ;                                        // 作成したパケットの長さを返す
}


int XBee_SendPacket10(char *packet_dt,int len,int sw)
{
     if (sw == 0) {
          UART_Send(packet_dt,len) ;
     }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

2つ目のワーニングは、整数演算において、符号付きと符号なしの変換が起きたときに生成されます

ワーニングは、エラーではないけどバグの可能性が疑われる記述だ、ということで生成されるんで、たいていの場合は大きなお世話でしかないですが、これのおかげでちょっとした記述ミスを見つけられたりするので、あんまし見逃すのももったいない話ですね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/28 12:15

    昨日、ご指摘していただいたあと、私も
    TMR1L = (63036ul & 0x00ff); 
    この記述ならワーニングが消えるはず…と思って試しましたが、ダメでした。

    使用しているコンパイラは、XC8ですが、
    int 16ビット、long 32ビットの変数となるはずです。

    キャンセル

  • 2019/08/28 12:18

    うーん、、納得いかんなー(再
    このコンパイラはこういうもん、とおもっとくしかないでしょうね。

    キャンセル

  • 2019/08/28 12:33

    >このコンパイラはこういうもん、とおもっとくしかないでしょうね。
    挙動が納得できておりませんが、私もそう思うようにしました。

    色々とコメントありがとうございました。

    キャンセル

0

一つ目のワーニング 

「ワーニング: (346) declaration of "x" hides outer declaration」

は、プログラムの1行目で、xをグローバル変数として宣言しているのに、int XBee_MakePacket10(char *packet_dt, const char *adrs, const char *data, int num) のプログラムの中(1行目の" int x , i ;")でxをローカル変数として宣言しているしているから、
『XBee_MakePacket10 の中でxを宣言しているので、外側で宣言されている(グローバルの)xが隠されてしまいますよ(この関数の中でxというとローカルのxの事で、グローバルのxにはアクセスできないですよ』という注意が為されているのです。

==
二つ目のワーニングは、プログラムのどこで発生するのですか??

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/27 12:02

    回答ありがとうございます。
    iとxについてのワーニングについて理解できました。
    この場合、無視しても良いのでしょうか。
    ワーニングを解決する方法がありましたら、教えていただけると助かります。

    2つ目のワーニングについては、XBee_MakePacket10()関数内の次の計算式の部分で発生しています。
    packet_dt[1] = x / 256 ; // フレームデータの長さ
    packet_dt[2] = x % 256 ;

    キャンセル

  • 2019/08/27 14:52

    グローバル変数として定義されているxは、main関数の中で代入されるだけで、その値が使われていません。main関数でxに値を代入しているのは何故なのでしょうか? XBee_SendPacket10関数の中で、ans変数は0が代入されるだけですから、return ans; で常に0が返されますが、意味がありますか? このような視点に立って、プログラムを見直してみることをお勧めします。 ワーニングは有益な助言で有る場合が多いですから、無視すべきではありません。ワーニングの無視は、バグ(プログラムのミス)を取り損ねる原因になりますからね。

    キャンセル

  • 2019/08/27 14:56

    2つ目のワーニングは、(unsigned int)を付け加えることで、解決できました。

    キャンセル

  • 2019/08/27 16:39 編集

    1つ目のワーニングは、グローバル変数の方を名前を変更したら解決できました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る