OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3887|回复: 6

问一个C语言的问题

[复制链接]

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
发表于 2016-7-19 11:38:40 | 显示全部楼层 |阅读模式
本帖最后由 zhoujianwen 于 2016-7-19 11:45 编辑

第一:
udp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,struct ip_addr *addr, u16_t port)
{        u8_t *buffer;
        struct ip_addr destAddr = *addr;
        struct pbuf *temp;
        u16_t i;
        temp=arg;

        buffer=p->payload;
        if(p != NULL)
        {
                for(i=0;i<p->len;i++)
                {
                        while((USART2->SR&0X40)==0);   
           USART_SendData(USART2,buffer);
        }
                udp_sendto(pcb,p,&destAddr,port);           
                pbuf_free(p);                                         
        }  
}

第二:
udp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,struct ip_addr *addr, u16_t port)
{        u8_t *buffer;
        struct ip_addr destAddr = *addr;
        struct pbuf *temp;
        u16_t i;
        temp=arg;

        
        if(p != NULL)
        {
                for(i=0;i<p->len;i++)
                {
                        while((USART2->SR&0X40)==0);
         USART_SendData(USART2,(p->payload));或者是USART_SendData(USART2,p->payload);
        }
                udp_sendto(pcb,p,&destAddr,port);  
                pbuf_free(p);                                         
        }  
}
为什么第一个可以编译通过,第二个就出现 error:  #852: expression must be a pointer to a complete object type。
可以帮我解释一下吗,如果我不想经历指针赋值这个操作,直接使用payload这个指针,我该怎么做呢?




下面是结构体的内容:
struct pbuf {
struct pbuf *next;
  void *payload;
  u16_t tot_len;
  u16_t len;
  u8_t flags;
  u16_t ref;
};




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-7-19 11:46:00 | 显示全部楼层
USART_SendData(USART2,(p->payload)[i]);或者是USART_SendData(USART2,p->payload[i]);

USART_SendData(USART2buffer[i]);

上面那个编辑老出现错误,在这里更正一下
回复 支持 反对

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-7-19 12:15:34 | 显示全部楼层
本帖最后由 lvehe 于 2016-7-19 12:27 编辑

error:  #852: expression must be a pointer to a complete object type
表达式必须是指向“完整对象类型”的指针。
你的指针类型不全,不能为void*,必须进行强制类型转换。可以这么用:buffer=(u8*)p->payload;
回复 支持 反对

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-7-19 14:28:15 | 显示全部楼层
lvehe 发表于 2016-7-19 12:15
error:  #852: expression must be a pointer to a complete object type
表达式必须是指向“完整对象类型 ...

谢谢解析啊。感谢
回复 支持 反对

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-7-21 15:02:00 | 显示全部楼层
lvehe 发表于 2016-7-19 12:15
error:  #852: expression must be a pointer to a complete object type
表达式必须是指向“完整对象类型 ...

我要用的是直接使用p->payload来调用缓存区元素,而不是使用buffer【i】这样的形式去调用元素。我的意思是怎么使用p->payload【i】这样的形式去调用元素。因为我这样写程序出现error
回复 支持 反对

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-7-21 15:32:26 | 显示全部楼层
zhoujianwen 发表于 2016-7-21 15:02
我要用的是直接使用p->payload来调用缓存区元素,而不是使用buffer【i】这样的形式去调用元素。我的意思 ...

((uint8_t*)(p->payload))[0]
回复 支持 反对

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2016-7-21 16:28:03 | 显示全部楼层
lvehe 发表于 2016-7-21 15:32
((uint8_t*)(p->payload))[0]

good的,我自己也搞出来了,为什么void类型的不行啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 21:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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