2011-09-05 113 views
0

编译器是在MPLAB 8 GCC,dsPIC33系列版本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 
}; 
+1

是否定义了“tSCF”? –

回答

0

看起来你在这行的开头错过了{

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

他承认在代码中(请参阅顶部的注释) –

0

大概一个未关闭在文件中撑起更高的位置......我们需要在上下文中看到它 - 将文件放在它自己的文件中,第二个数组编译得很好。我改变了使用查找和替换的类型,这不会产生错误或警告与

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 
}; 
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},的第一个表格最终会生成阵列的两个成员(每个成员的a设置为给定值,并且b设置为零)。您可以通过添加约束的明确阵列(这将导致编译器抱怨过多的初始化从你的问题看这个你的榜样

第二种形式没有你它到底要什么:当没有任何括号并且数组元素是一个结构体,这些值被赋值给连续的字段。这里有一个可选的警告(可能是-Wall或类似的东西),因为这个答案给出的表单使你的意图更清晰一些。