bias 发表于 2014-7-21 16:27:16

这样结构体赋值不对吗?为什么报错

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 '.'

请帮我看一下

hck2llj 发表于 2014-7-21 16:49:14

从来没见过还有这样用的,坐等高人

bias 发表于 2014-7-21 16:50:48

我是参考了一下linux下的i2c,想修改一下整成自己通用的i2c库函数

莫非是51的编译器不支持,那这种结构体在51中该如何赋值

lcofjp 发表于 2014-7-21 17:00:30

这种风格要编译器支持c99才行,不知道你的支不支持。
可以加--c99选项试试。

bias 发表于 2014-7-21 17:02:38

本帖最后由 bias 于 2014-7-21 17:04 编辑

lcofjp 发表于 2014-7-21 17:00
这种风格要编译器支持c99才行,不知道你的支不支持。
可以加--c99选项试试。 ...

我用的keil,哪儿设置-c99选项。



我感觉这想写很容易阅读,如果不支持这种写法,怎么初始化这个结构体最好,前面不写的话,直接赋值系统又报错,不允许把变量赋值给结构体变量

lcofjp 发表于 2014-7-21 17:05:36

bias 发表于 2014-7-21 17:02
我用的keil,哪儿设置-c99选项。




Option -》 c/c++ - Misc controls
ARM的这样设置,没用过51的。

aheadlead 发表于 2014-7-21 17:07:14

这个似乎是编译器的扩展功能
用一般的赋值语句替换试试

bias 发表于 2014-7-21 17:09:54

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.

aheadlead 发表于 2014-7-21 17:10:13

http://www.cnblogs.com/Anker/p/3545146.html

bias 发表于 2014-7-21 17:15:40

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).

搜了一下说是不能这样赋值,那么想把变量传递给结构体内部怎么做最好?

lcofjp 发表于 2014-7-21 17:37:30

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

aheadlead 发表于 2014-7-21 22:19:17

bias 发表于 2014-7-21 17:15
谢谢,看明白了,其实我也没乱序,只是如果按照下面这种方式赋值

static int ft5x06_i2c_rxdata(char *r ...

不嫌麻烦弄个函数也是一种办法
就像make_pair()函数一样

cwei 发表于 2014-7-22 09:09:36

keil下好像没有这种用法,请按照标准c方式幅值

bailangcn 发表于 2014-7-22 10:27:28

不符合标准C吧

zhugean 发表于 2014-7-22 12:32:38

keil不支持,无解

Felix257 发表于 2014-7-23 10:53:10

还是用标准形式吧,到时移值到其他IDE也可以用呢{:smile:}

ronic 发表于 2014-7-23 13:38:24

keil支持的,--gnu

ronic 发表于 2014-7-23 13:38:41

keil支持的,--gnu

bias 发表于 2014-7-23 13:40:53

可惜了,我已经改成非结构体的格式了,没法实验了,呵呵

XIVN1987 发表于 2014-7-23 13:42:24

这是GCC对C语言的扩展支持的语法,,标准C里面不支持额。。。。

Vampireyifeng 发表于 2014-7-26 14:12:59


c99

rockyyangyang 发表于 2014-7-30 09:54:11

我觉得是数组的问题
页: [1]
查看完整版本: 这样结构体赋值不对吗?为什么报错