这样结构体赋值不对吗?为什么报错
struct i2c_msg {volatile u16 addr; /* slave address */
volatile u8flags;
#define I2C_M_WR 0x00 /* write data, from master to slave */
#define I2C_M_RD 0x01 /* read data, from slave to master */
volatile u16 len; /* msg length */
volatile u8 *buf; /* pointer to msg data */
};
#define ft5x06_I2C_SLAVE_ADDRESS 0x38
static int ft5x06_i2c_rxdata(char *rxdata, int length)
{
int ret;
struct i2c_msg msgs[] = {
{
.addr = ft5x06_I2C_SLAVE_ADDRESS,
.flags = I2C_M_WR,
.len = 1,
.buf = rxdata, //写入开始读的数据地址
},
{
.addr = ft5x06_I2C_SLAVE_ADDRESS,
.flags = I2C_M_RD,
.len = length,
.buf = rxdata,
},
};
ret = i2c_transfer(msgs);
ret += i2c_transfer(msgs);
if(ret)
printf("msg i2c read error: %d\n",ret);
return ret;
}
error : syntax error near '.'
请帮我看一下 从来没见过还有这样用的,坐等高人 我是参考了一下linux下的i2c,想修改一下整成自己通用的i2c库函数
莫非是51的编译器不支持,那这种结构体在51中该如何赋值 这种风格要编译器支持c99才行,不知道你的支不支持。
可以加--c99选项试试。 本帖最后由 bias 于 2014-7-21 17:04 编辑
lcofjp 发表于 2014-7-21 17:00
这种风格要编译器支持c99才行,不知道你的支不支持。
可以加--c99选项试试。 ...
我用的keil,哪儿设置-c99选项。
我感觉这想写很容易阅读,如果不支持这种写法,怎么初始化这个结构体最好,前面不写的话,直接赋值系统又报错,不允许把变量赋值给结构体变量 bias 发表于 2014-7-21 17:02
我用的keil,哪儿设置-c99选项。
Option -》 c/c++ - Misc controls
ARM的这样设置,没用过51的。 这个似乎是编译器的扩展功能
用一般的赋值语句替换试试 lcofjp 发表于 2014-7-21 17:05
Option -》 c/c++ - Misc controls
ARM的这样设置,没用过51的。
加上是不会报错了,可惜通不过,不行我把那里改成数组,自己规定第几个字节是什么吧
compiling MyCTP.c...
C51 FATAL-ERROR -
ACTION:PARSING INVOKE-/#PRAGMA-LINE
LINE: C:\Keil\C51\BIN\C51.EXE MyCTP.c BROWSE-
ERROR: NON-NULL ARGUMENT EXPECTED
C51 TERMINATED. http://www.cnblogs.com/Anker/p/3545146.html aheadlead 发表于 2014-7-21 17:10
http://www.cnblogs.com/Anker/p/3545146.html
谢谢,看明白了,其实我也没乱序,只是如果按照下面这种方式赋值
static int ft5x06_i2c_rxdata(char *rxdata, int length)
{
int ret;
struct i2c_msg msgs[] = {
{
ft5x06_I2C_SLAVE_ADDRESS,
I2C_M_WR,
1,
rxdata, //写入开始读的数据地址
},
{
ft5x06_I2C_SLAVE_ADDRESS,
I2C_M_RD,
length,
rxdata,
},
};
ret = i2c_transfer(msgs);
ret += i2c_transfer(msgs);
if(ret)
printf("msg i2c read error: %d\n",ret);
return ret; //=0表示没任何错误
}
会出现新的错误:
compiling MyCTP.c...
MYCTP.C(149): error C247: non-address/-constant initializer
MYCTP.C(152): error C247: non-address/-constant initializer
MYCTP.C(155): error C247: non-address/-constant initializer
MYCTP.C(157): error C247: non-address/-constant initializer
MYCTP.C(158): error C247: non-address/-constant initializer
MyCTP.c - 5 Error(s), 0 Warning(s).
搜了一下说是不能这样赋值,那么想把变量传递给结构体内部怎么做最好?
bias 发表于 2014-7-21 17:15
谢谢,看明白了,其实我也没乱序,只是如果按照下面这种方式赋值
static int ft5x06_i2c_rxdata(char *r ...
初始化要用常量才行。你的结构体值里面包含了变量。
struct i2c_msg msgs[] = {
{
.addr = ft5x06_I2C_SLAVE_ADDRESS,
.flags = I2C_M_WR,
.len = 1,
},
{
.addr = ft5x06_I2C_SLAVE_ADDRESS,
.flags = I2C_M_RD,
.len = length,
},
}; bias 发表于 2014-7-21 17:15
谢谢,看明白了,其实我也没乱序,只是如果按照下面这种方式赋值
static int ft5x06_i2c_rxdata(char *r ...
不嫌麻烦弄个函数也是一种办法
就像make_pair()函数一样 keil下好像没有这种用法,请按照标准c方式幅值 不符合标准C吧 keil不支持,无解 还是用标准形式吧,到时移值到其他IDE也可以用呢{:smile:} keil支持的,--gnu keil支持的,--gnu 可惜了,我已经改成非结构体的格式了,没法实验了,呵呵 这是GCC对C语言的扩展支持的语法,,标准C里面不支持额。。。。
c99 我觉得是数组的问题
页:
[1]