使用typedef定义数据结构体出现的错误问题

hanyli 2010-01-14 05:41:37
请问有识人士:
我使用typedef定义如下数据结构体,并编写以下程式,在IAR的编译环境中进行编译后出现了:Error: expression must have struct or union type 的提示。请有识人士指点其错误的原故……为盼!

// 定义数据结构体:

typedef struct

{
unsigned char SRCADDRH;
unsigned char SRCADDRL;
unsigned char DESTADDRH;
unsigned char DESTADDRL;
unsigned char VLEN : 3;
}DMA_DESC;

// 初始化I2S的发送配置:

void i2sStartTxDmaChan(DMA_DESC *i2sDmaTxDescr,unsigned short *i2sTxBuf,unsigned short i2sTxBufSize)

{
i2sDmaTxDescr.SRCADDRH = i2sTxBuf >>8; //Error: expression must have struct or union type
i2sDmaTxDescr.SRCADDRL = i2sTxBuf; ;//Error: expression must have struct or union type
i2sDmaTxDescr.LENH =(i2sTxBufSize >>8)&0xFF; //Error: expression must have struct or union type
i2sDmaTxDescr.LENL = i2sTxBufSize &0xFF; //Error: expression must have struct or union type
i2sDmaTxDescr.VLEN = 0x00; //Error: expression must have struct or union type
}
...全文
3569 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
traceless 2010-01-15
  • 打赏
  • 举报
回复
LZ太客气了 难得
hanyli 2010-01-15
  • 打赏
  • 举报
回复
谢谢有识人士的指教!
lnklo 2010-01-14
  • 打赏
  • 举报
回复
LZ so serious~
cir2633 2010-01-14
  • 打赏
  • 举报
回复
i2sDmaTxDescr->SRCADDRH
或者(*i2sDmaTxDescr).SRCADDRH
macrojj 2010-01-14
  • 打赏
  • 举报
回复
好有礼貌的叔叔哦
hanyli 2010-01-14
  • 打赏
  • 举报
回复
#6楼的有识人士你好:
我按你的指教,在程序的相应运算符中作了变更,并在"IAR"的编译环境中进行了编译,且通过了!请允许我向你崇高的谢意!

typedef struct

{
unsigned char SRCADDRH;
unsigned char SRCADDRL;
unsigned char DESTADDRH;
unsigned char DESTADDRL;
unsigned char VLEN : 3;
}DMA_DESC;

void i2sStartTxDmaChan(DMA_DESC *i2sDmaTxDescr,unsigned short *i2sTxBuf,unsigned short i2sTxBufSize)
{
i2sDmaTxDescr->SRCADDRH =(*i2sTxBuf)>> 8;
i2sDmaTxDescr->SRCADDRL =(*i2sTxBuf);
i2sDmaTxDescr->LENH =(i2sTxBufSize >> 8)&0xFF;
i2sDmaTxDescr->LENL = i2sTxBufSize &0xFF;
i2sDmaTxDescr->VLEN = 0x00;
}
chencheng8095 2010-01-14
  • 打赏
  • 举报
回复
要用指针符号去访问内部成员!!!如i2sDmaTxDescr->SRCADDRH = (*i2sTxBuf) >>8;
logiciel 2010-01-14
  • 打赏
  • 举报
回复
i2sDmaTxDescr和i2sTxBuf是指针,要这样引用:

i2sDmaTxDescr->SRCADDRH = (*i2sTxBuf) >>8;
gcc_gun 2010-01-14
  • 打赏
  • 举报
回复
指针用->
hanyli 2010-01-14
  • 打赏
  • 举报
回复
请问有识人士:
我在使用指针访问数据结构体成员时出现的错误问题请给予指教……为盼!

// 定义数据结构体:

typedef struct

{
unsigned char SRCADDRH;
unsigned char SRCADDRL;
unsigned char DESTADDRH;
unsigned char DESTADDRL;
unsigned char VLEN : 3;
}DMA_DESC;

// 初始化I2S的发送配置:

void i2sStartTxDmaChan(DMA_DESC *i2sDmaTxDescr,unsigned short *i2sTxBuf,unsigned short i2sTxBufSize)

{
i2sDmaTxDescr.SRCADDRH = i2sTxBuf >>8; //Error: expression must have struct or union type
i2sDmaTxDescr.SRCADDRL = i2sTxBuf; ;//Error: expression must have struct or union type
i2sDmaTxDescr.LENH =(i2sTxBufSize >>8)&0xFF; //Error: expression must have struct or union type
i2sDmaTxDescr.LENL = i2sTxBufSize &0xFF; //Error: expression must have struct or union type
i2sDmaTxDescr.VLEN = 0x00; //Error: expression must have struct or union type
}
hanyli 2010-01-14
  • 打赏
  • 举报
回复
#1楼你好:
我按你的(*i2sDmaTxDescr).SRCADDRH 指针访问成员应该这样的,进行了以下,还是在IAR的编译环境中进行编译后出现了//Error: expression must have struct or union type :

(*i2sDmaTxDescr).SRCADDRH = i2sTxBuf >>8;

请问何解?
lnklo 2010-01-14
  • 打赏
  • 举报
回复
(*i2sDmaTxDescr).SRCADDRH
指针访问成员应该这样的
hanyli 2010-01-14
  • 打赏
  • 举报
回复
#1楼你好:
我利用DMA_DESC来定义i2sDmaTxDescr作为指针,且后使用typedef定义数据结构体的成员SRCADDRH向i2sDmaTxDescr指针进行:i2sDmaTxDescr.SRCADDRH= i2sTxBuf >>8;时,为何出错?请给予指教?
lnklo 2010-01-14
  • 打赏
  • 举报
回复
typedef定义数据结构体没有出现问题
i2sDmaTxDescr.SRCADDRH//这是指针
  • 打赏
  • 举报
回复
呵呵。。。补基本吧。。。 接分啦
SH19871122 2010-01-14
  • 打赏
  • 举报
回复
再次学习C的东西了
ForestDB 2010-01-14
  • 打赏
  • 举报
回复
建议补习下基本的C语法。
小小攻城师 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hanyli 的回复:]
#6楼的有识人士你好:
    我按你的指教,在程序的相应运算符中作了变更,并在"IAR"的编译环境中进行了编译,且通过了!请允许我向你崇高的谢意!

typedef struct

{
    unsigned char SRCADDRH;   
    unsigned char SRCADDRL;   
    unsigned char DESTADDRH;   
    unsigned char DESTADDRL;   
    unsigned char VLEN  : 3;
}DMA_DESC;

void i2sStartTxDmaChan(DMA_DESC *i2sDmaTxDescr,unsigned short *i2sTxBuf,unsigned short i2sTxBufSize)
{                                         
    i2sDmaTxDescr->SRCADDRH =(*i2sTxBuf)>> 8;     
    i2sDmaTxDescr->SRCADDRL =(*i2sTxBuf);         
    i2sDmaTxDescr->LENH =(i2sTxBufSize >> 8)&0xFF;
    i2sDmaTxDescr->LENL = i2sTxBufSize &0xFF;   
    i2sDmaTxDescr->VLEN = 0x00;                 
}

[/Quote]
楼主要知道->相当于两步操作,一个是*,一个是.操作,
意思是->就是取指针指向的对象的成员。先对他解引用,然后访问成员

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧