недостающие скобки вокруг инициализатора - PullRequest
0 голосов
/ 05 сентября 2011

Компилятор - это GCC под MPLAB 8, dsPIC33 ver 3.30c

// 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
};

Ответы [ 3 ]

4 голосов
/ 05 сентября 2011

Предполагается, что 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}, заканчивает построением двух членов массива (каждый с a, установленным на данное значение, и b, установленным на ноль). Вы можете увидеть это на своем примере, добавив явную границу массива (что приведет к тому, что компилятор будет жаловаться на избыточные инициализаторы.

Вторая форма из вашего вопроса делает именно то, что вы хотите: когда фигурных скобок нет, а элемент массива является структурой, значения присваиваются последовательным полям. Здесь есть необязательное предупреждение (возможно, включенное с помощью -Wall или что-то в этом роде), потому что форма, приведенная в этом ответе, делает ваши намерения более ясными.

0 голосов
/ 05 сентября 2011

Вероятно, в файле находится незакрытая фигурная скобка ... нам нужно это увидеть в контексте - поместить в файл самостоятельно, ваш второй массив прекрасно компилируется. Я изменил типы, используя поиск и замену, и это не выдает ошибок или предупреждений с

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
};
0 голосов
/ 05 сентября 2011

Похоже, вы пропустили { в начале этой строки:

(uint32) 0x00000000}, {(uint8) 2}   // Filter 15
...