2017-10-17 8 views
2

配列を順番に初期化できません。実際には、私は64の長さのメッセージを構築したいと思います。64の配列インデックスを提供すると、コードは長く見えるようになります。私は冗長を避けるために順番にそれをやりたいコードの冗長性を避けるために、配列を順番に初期化できません。


しかし、私はこのbuf[]のように配列を初期化し、私はどちらか動作しませんでしたこともbuf[6]として試み。

error: expected expression before ‘]’ token 

どのようにすればいいですか? Cでは、宣言ではなく、別の行の配列を初期化することはできませんか?


ARRAY_SIZEは配列インデックスの数を返します。

コード:あなたが使用することはできません

void a_test(char in) { 

    uint8_t buf[256]; 
    int i; 

    char cmd = in; 

    if (cmd == 'a') { 
     // it doesn't work like this 
     buf[] = { 0xfe, 0xb0, 0x01, 0x22, 0x00, 0x00}; 

     /* it works like this 
     buf[0] = 0xfe; 
     buf[1] = 0xb0; 
     buf[2] = 0x01; 
     buf[3] = 0x22; 
     buf[4] = 0x00; 
     buf[5] = 0x00; */ 
    } 


    if (cmd == 'b') { 
     buf[] = { 0x44, 0xb0, 0x01, 0x03, 0x00}; 
    } 


    for (i = 0; i < ARRAY_SIZE(buf); i++) { 
     printf("%02x ", buf[i]); 
    } 
} 

int main() { 
    a_test('a'); 
    return 0; 
} 
+1

配列が代入演算子を持っていないです。 –

答えて

2

:すべて合格する

uint8_t buf[]= { 0xfe, 0xb0, 0x01, 0x22, 0x00, 0x00}; 

別の方法:

buf[] = { 0xfe, 0xb0, 0x01, 0x22, 0x00, 0x00}; 

それが宣言などである場合を除き、 1つのステートメントの値はmemcpyを使用します:

memcpy(buf, (uint8_t[]) { 0xfe, 0xb0, 0x01, 0x22, 0x00, 0x00 }, sizeof (buf)); 
2

配列には代入演算子はありませんが、構造体にはありません。したがって、構造体に配列をラップすることができます。

これは、次のようなことができます。

#include <stdio.h> 
#include <stdint.h> 

void a_test(char in) 
{ 
    struct Array 
    { 
     size_t n; 
     uint8_t buf[256]; 
    } a = { 0 };   

    switch (in) 
    { 
    case 'a': 
     a = (struct Array) { 6, { 0xfe, 0xb0, 0x01, 0x22, 0x00, 0x00 } }; 
     break; 

    case 'b': 
     a = (struct Array) { 5, { 0x44, 0xb0, 0x01, 0x03, 0x00 } }; 
     break; 
    } 

    for (size_t i = 0; i < a.n; i++) 
    { 
     printf("%02x ", a.buf[i]); 
    } 
    putchar('\n'); 
} 

int main(void) 
{ 
    a_test('a'); 
    a_test('b'); 

    return 0; 
} 

プログラムの出力は

fe b0 01 22 00 00 
44 b0 01 03 00 
関連する問題