E05200029:Expected an expression. のエラーと#defineのスコープについて

E05200029:Expected an expression. のエラーについて質問があります。

使用マイコン:RX64M
開発環境:e2studio
コンパイラ:CC-RX V3.00

現在ヘッダファイルに下記のマクロ定義と、

#define NUM_BYTE 0x09
#define NUM1 0x01
#define NUM2 0x02
#define NUM3 0x03
#define NUM4 0x04
#define NUM5 0x05
#define NUM6 0x06
#define NUM7 0x07
#define NUM8 0x08
#define NUM9 0x09
ソースファイルに下記の関数を作りました。
void syori(int data, int *buf1 , int *buf2)
{
        switch (data)
        {
        case 1:
                buf1[NUM_BYTE] = {NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7,NUM8,NUM9};
                buf2[NUM_BYTE] = {NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7,NUM8,NUM9};
               
                break;
       
   /*~その他case文~*/
        default:
                break;
        }

}
 
この中で、配列の要素をマクロ定義した定数で初期化しようとすると、E05200029エラーで「式がありません」となります。
プログラムを書いている最中でも、「Ctrl+spaceキー」で buf1[NUM_BYTE] = {};の波かっこの中で補完機能を使おうとしても、
そこでだけは「デフォルトの候補がありません」と表示されます。
原因は分かりますでしょうか。
#defineはマクロ定義なので、スコープなどないと考えていたのですが、そのあたり自分だけの調査で限界が来たので、教えていただければと思います。
Parents
  • C言語の文法として配列を丸ごと代入することができません。あとbuf1[NUM_BYTE]はbuf1配列のNUM_BYTEで指定された位置の格納位置を意味しています。おそらく呼び出しものがNUM_BYTEの配列だと思います。でも、配列で確保した範囲でアクセスできるのはN要素なら0からN-1です。これは代入に間違いがありますし、範囲外のエリアへのアクセスになります。それからNUM_BYTEというのは気持ちが悪いのでNUM_COUNTSみたいなのの方がいいかと思います。intはバイトじゃないですから。もし配列まるごと値セットしたいなら、下のような記述になります。

    void syori(int data, int *buf1 , int *buf2)
    {
            switch (data)
            {
            case 1:
        {
                      static const int data_table[] = {NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7,NUM8,NUM9};
                      memcpy(buf1, data_table, sizeof(data_table));
                      memcpy(buf2, data_table, sizeof(data_table));
                  }
                    break;
           
       /*~その他case文~*/
            default:
                    break;
            }
    }

Reply
  • C言語の文法として配列を丸ごと代入することができません。あとbuf1[NUM_BYTE]はbuf1配列のNUM_BYTEで指定された位置の格納位置を意味しています。おそらく呼び出しものがNUM_BYTEの配列だと思います。でも、配列で確保した範囲でアクセスできるのはN要素なら0からN-1です。これは代入に間違いがありますし、範囲外のエリアへのアクセスになります。それからNUM_BYTEというのは気持ちが悪いのでNUM_COUNTSみたいなのの方がいいかと思います。intはバイトじゃないですから。もし配列まるごと値セットしたいなら、下のような記述になります。

    void syori(int data, int *buf1 , int *buf2)
    {
            switch (data)
            {
            case 1:
        {
                      static const int data_table[] = {NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7,NUM8,NUM9};
                      memcpy(buf1, data_table, sizeof(data_table));
                      memcpy(buf2, data_table, sizeof(data_table));
                  }
                    break;
           
       /*~その他case文~*/
            default:
                    break;
            }
    }

Children
No Data