0

コンパイラは、MPLAB 8、dsPIC33 ver 3.30c の GCC です。

// Note: the first block below generates no error's with the compiler, but the data
//  in the structurer is wrong.
//  the 2nd block give warning, but the data is correct... why??
//      NMEA2000.c:289: warning: missing braces around initializer
//      NMEA2000.c:289: warning: (near initialization for 'static_can_filter[0]')

const tSCF static_can_filter[] = {
    {(uint32) 0x01FFFFFF}, {(uint8) 2}, // Filter 0 (Process data)
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 1       
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 2 (receive P2P-Message)
    {(uint32) 0x0000FF00}, {(uint8) 2}, // Filter 3 (receive P2P-Message)
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 4
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 5
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 6
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 7
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 8
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 9
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 10
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 11
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 12
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 13
    {(uint32) 0x00000000}, {(uint8) 2}, // Filter 14
    (uint32) 0x00000000}, {(uint8) 2}   // Filter 15
};


const tSCF static_can_filter[] = {
    (uint32) 0x01FFFFFF, (uint8) 2, // Filter 0 (Process data)
    (uint32) 0x00000000, (uint8) 2, // Filter 1       
    (uint32) 0x00000000, (uint8) 2, // Filter 2 (receive P2P-Message)
    (uint32) 0x0000FF00, (uint8) 2, // Filter 3 (receive P2P-Message)
    (uint32) 0x00000000, (uint8) 2, // Filter 4
    (uint32) 0x00000000, (uint8) 2, // Filter 5
    (uint32) 0x00000000, (uint8) 2, // Filter 6
    (uint32) 0x00000000, (uint8) 2, // Filter 7
    (uint32) 0x00000000, (uint8) 2, // Filter 8
    (uint32) 0x00000000, (uint8) 2, // Filter 9
    (uint32) 0x00000000, (uint8) 2, // Filter 10
    (uint32) 0x00000000, (uint8) 2, // Filter 11
    (uint32) 0x00000000, (uint8) 2, // Filter 12
    (uint32) 0x00000000, (uint8) 2, // Filter 13
    (uint32) 0x00000000, (uint8) 2, // Filter 14
    (uint32) 0x00000000, (uint8) 2  // Filter 15
};
4

3 に答える 3

4

tSCF が次のように定義されていると仮定します。

typedef struct tSCF {
  uint32 a;
  uint8 b;
} tSCF;

必要なものは、おそらく次のようになります。

const tSCF static_can_filter[] = {
    { (uint32) 0x01FFFFFF, (uint8) 2 }, // Filter 0 (Process data)
    { (uint32) 0x00000000, (uint8) 2 }, // Filter 1
    [...]

中括弧を含む各初期化子は、配列の異なる要素を初期化します。あなたの質問の最初のフォーム{(uint32) 0x01FFFFFF}, {(uint8) 2},は、配列の2つのメンバーを構築することになります(それぞれがa指定された値にb設定され、ゼロに設定されます)。明示的な配列バインドを追加することで、例でこれを確認できます(これにより、コンパイラが過剰な初期化子について不平を言います。

質問の 2 番目の形式は、まさにあなたが望んでいることです。中括弧がなく、配列要素が構造体の場合、値は連続するフィールドに割り当てられます。-Wallこの回答で指定されたフォームにより、意図が少し明確になるため、ここにオプションの警告があります(おそらく、またはそのようなものでオンになっています)。

于 2011-09-05T01:50:26.310 に答える
0

おそらく、ファイルの上位にある閉じていない中かっこ...これをコンテキストで確認する必要があります-ファイルを単独で配置すると、2番目の配列は問題なくコンパイルされます。検索と置換を使用して型を変更しましたが、エラーや警告は発生しません

gcc -c -Wall -Wextra

したがって、エラーは別の場所にあるはずです。

#include <stdint.h>
const uint32_t static_can_filter[] = {
    (uint32_t) 0x01FFFFFF, (uint8_t) 2, // Filter 0 (Process data)
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 1       
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 2 (receive P2P-Message)
    (uint32_t) 0x0000FF00, (uint8_t) 2, // Filter 3 (receive P2P-Message)
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 4
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 5
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 6
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 7
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 8
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 9
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 10
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 11
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 12
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 13
    (uint32_t) 0x00000000, (uint8_t) 2, // Filter 14
    (uint32_t) 0x00000000, (uint8_t) 2  // Filter 15
};
于 2011-09-05T01:45:34.410 に答える
0

{この行の先頭にあるa を見逃したようです:

(uint32) 0x00000000}, {(uint8) 2}   // Filter 15
于 2011-09-05T01:21:38.357 に答える