在struct'...初始化期间发出警告,使整数指针不带强制转换'

时间:2013-12-15 09:25:12

标签: c pointers casting initialization

我有以下情况:

struct Lamp {
  char *highAddress [9];
  char *lowAddress [9];
  bool OnOff;
  bool active;
  uint8_t power;
  uint8_t brightness;
  uint8_t temperatures;
  uint8_t faultCount;
} ;

struct lamps Lamp [] = {
  { (char *) "0013A200" , (char *) "4094500D" , false, true , 0, 0 , 0, 0 } ,
  { (char *) "0013A200" , (char *) "40B12530" , false, true , 0, 0 , 0, 0 } ,
  { (char *) "11111111" , (char *) "22222222", false , false, 0, 0 , 0, 0 } ,
  { (char *) "33333333" , (char *) "44444444", false , false, 0, 0 , 0, 0 } ,
  { (char *) "55555555" , (char *) "66666666", false , false, 0, 0 , 0, 0 } ,
  { (char *) "77777777" , (char *) "88888888", false , false, 0, 0 , 0, 0 } ,
  { (char *) "99999999" , (char *) "00000000", false , false, 0, 0 , 0, 0 } ,
  { (char *) "AAAAAAAA" , (char *) "BBBBBBBB", false , false, 0, 0 , 0, 0 } ,
  { (char *) "CCCCCCCC" , (char *) "DDDDDDDD", false , false, 0, 0 , 0, 0 } ,
  { (char *) "EEEEEEEE" , (char *) "FFFFFFFF", false , false, 0, 0 , 0, 0 } ,
 };

使用avr-gcc-C99进行编译我收到了显示的消息。

可能是什么?

非常感谢。

多梅尼科

2 个答案:

答案 0 :(得分:3)

成员highAddresslowAddress指针数组。只需使它们成为简单的指针(或数组),它就可以正常工作:

struct Lamp
{
    char *highAddress;
    char *lowAddress;
    ...
};

答案 1 :(得分:0)

Joachim已经给了你一个有效的答案,这里作为补充,很可能只是为了评论。

此外,您的代码还需要考虑几个小问题:

  • 字符串文字是不可变的,因此这两个字段的类型 最好是char const*。否则,如果您的代码必须在以后更改它们,请执行相反的操作 Joachims在某种程度上说,并使用char highAddress[9]来复制 您struct

  • 中的字符串
  • 在大多数情况下,字符串文字"abcde""衰变"到指向其基类型的指针,所以char*。从这个意义上讲,你所做的演员阵容对你没有任何帮助。除非你真的必须并且你真的知道自己在做什么,否则不要使用演员阵容。在这里,特别是它们实际上是反效果的,因为在初始化器中,它们在初始化char数组时可能具有不同的作用。对于变体char highAddress[9],演员阵容将是完全错误的。

  • 在C99中有一个名为指定初始化程序的构造,可以帮助您更好地了解正在发生的事情:


struct lamps Lamp [] = {
  { .highAdress = "0013A200" ,
    .lowAdress = "4094500D" ,
    .OnOff =  false, ...