搜索
bottom↓
回复: 21

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

[复制链接]

出0入10汤圆

发表于 2014-7-21 16:27:16 | 显示全部楼层 |阅读模式
  1. struct i2c_msg {
  2.         volatile u16 addr;                /* slave address                        */
  3.         volatile u8  flags;
  4. #define I2C_M_WR                        0x00        /* write data, from master to slave */
  5. #define I2C_M_RD                        0x01        /* read data, from slave to master */
  6.         volatile u16 len;                /* msg length                                */
  7.         volatile u8 *buf;                /* pointer to msg data                */
  8. };

  9. #define ft5x06_I2C_SLAVE_ADDRESS 0x38

  10. static int ft5x06_i2c_rxdata(char *rxdata, int length)
  11. {
  12.         int ret;
  13.         struct i2c_msg msgs[] = {
  14.                 {
  15.                         .addr        = ft5x06_I2C_SLAVE_ADDRESS,
  16.                         .flags        = I2C_M_WR,
  17.                         .len        = 1,
  18.                         .buf        = rxdata,        //写入开始读的数据地址
  19.                 },
  20.                 {
  21.                         .addr        = ft5x06_I2C_SLAVE_ADDRESS,
  22.                         .flags        = I2C_M_RD,
  23.                         .len        = length,
  24.                         .buf        = rxdata,
  25.                 },
  26.         };
  27.         ret = i2c_transfer(msgs[0]);
  28.         ret += i2c_transfer(msgs[1]);
  29.         if(ret)
  30.                 printf("msg i2c read error: %d\n",ret);
  31.         return ret;
  32. }
复制代码


error : syntax error near '.'

请帮我看一下

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-7-21 16:49:14 | 显示全部楼层
从来没见过还有这样用的,坐等高人

出0入10汤圆

 楼主| 发表于 2014-7-21 16:50:48 | 显示全部楼层
我是参考了一下linux下的i2c,想修改一下整成自己通用的i2c库函数

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

出0入0汤圆

发表于 2014-7-21 17:00:30 | 显示全部楼层
这种风格要编译器支持c99才行,不知道你的支不支持。
可以加--c99选项试试。

出0入10汤圆

 楼主| 发表于 2014-7-21 17:02:38 | 显示全部楼层
本帖最后由 bias 于 2014-7-21 17:04 编辑
lcofjp 发表于 2014-7-21 17:00
这种风格要编译器支持c99才行,不知道你的支不支持。
可以加--c99选项试试。 ...


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



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

出0入0汤圆

发表于 2014-7-21 17:05:36 | 显示全部楼层
bias 发表于 2014-7-21 17:02
我用的keil,哪儿设置-c99选项。

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

出0入0汤圆

发表于 2014-7-21 17:07:14 | 显示全部楼层
这个似乎是编译器的扩展功能
用一般的赋值语句替换试试

出0入10汤圆

 楼主| 发表于 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.

出0入0汤圆

发表于 2014-7-21 17:10:13 | 显示全部楼层
http://www.cnblogs.com/Anker/p/3545146.html

出0入10汤圆

 楼主| 发表于 2014-7-21 17:15:40 | 显示全部楼层


谢谢,看明白了,其实我也没乱序,只是如果按照下面这种方式赋值

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[0]);
        ret += i2c_transfer(msgs[1]);
        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).

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

出0入0汤圆

发表于 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,
                },
        };

出0入0汤圆

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

static int ft5x06_i2c_rxdata(char *r ...

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

出0入4汤圆

发表于 2014-7-22 09:09:36 | 显示全部楼层
keil下好像没有这种用法,请按照标准c方式幅值

出0入0汤圆

发表于 2014-7-22 10:27:28 | 显示全部楼层
不符合标准C吧

出0入0汤圆

发表于 2014-7-22 12:32:38 | 显示全部楼层
keil不支持,无解

出0入0汤圆

发表于 2014-7-23 10:53:10 | 显示全部楼层
还是用标准形式吧,到时移值到其他IDE也可以用呢

出0入4汤圆

发表于 2014-7-23 13:38:24 来自手机 | 显示全部楼层
keil支持的,--gnu

出0入4汤圆

发表于 2014-7-23 13:38:41 来自手机 | 显示全部楼层
keil支持的,--gnu

出0入10汤圆

 楼主| 发表于 2014-7-23 13:40:53 | 显示全部楼层
可惜了,我已经改成非结构体的格式了,没法实验了,呵呵

出0入25汤圆

发表于 2014-7-23 13:42:24 | 显示全部楼层
这是GCC对C语言的扩展支持的语法,,标准C里面不支持额。。。。

出0入0汤圆

发表于 2014-7-26 14:12:59 | 显示全部楼层

c99

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-7-30 09:54:11 | 显示全部楼层
我觉得是数组的问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表