OpenEdv-开源电子网

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

结构体变量初始值为0,没有个赋值为1,怎么会变成1呢!

[复制链接]

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
发表于 2015-1-7 09:27:08 | 显示全部楼层 |阅读模式
5金钱


屏蔽使heard.RecordTab = 1的语句,if语句还能进去!有什么可能性!

最佳答案

查看完整内容[请看2#楼]

修改后的函数 [mw_shl_code=c,true]//插入命令 int16_t AddCmd(u8 *Cmdrev,u8 Cmdlen) { int16_t i; int16_t j; if((Cmdrev[0]==0)&&(Cmdrev[1]==0xff)&&(Cmdrev[2]==0)&&(Cmdrev[3]==0xff)) { for(i=0;i<CMD_QUE;i++) { if(CmdQue[0].used == 0) { // printf(" i %2X\n\r",i); break; } else if(i==CMD_QUE-1) { // ClearCmd(0);//清除第一条 fo ...
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-7 09:27:09 | 显示全部楼层
修改后的函数
[mw_shl_code=c,true]//插入命令 int16_t AddCmd(u8 *Cmdrev,u8 Cmdlen) { int16_t i; int16_t j; if((Cmdrev[0]==0)&&(Cmdrev[1]==0xff)&&(Cmdrev[2]==0)&&(Cmdrev[3]==0xff)) { for(i=0;i<CMD_QUE;i++) { if(CmdQue[0].used == 0) { // printf(" i %2X\n\r",i); break; } else if(i==CMD_QUE-1) { // ClearCmd(0);//清除第一条 for(j=0;j<CMD_QUE;j++) { // CopyCmd(j,j+1);//此时i等于CMD_QUE-1 ClearCmd(j); } i = 0; break; // return -1; } } MainAddress = Cmdrev[7]; CmdQue[0].used = 1; CmdQue[0].state = 1; CmdQue[0].pid = Cmdrev[4]; CmdQue[0].Rdatalen = Cmdlen-7; memcpy(CmdQue[0].data,Cmdrev+7,Cmdlen-7);//rev+7是什么意思? return 0; } else { return -1; } } int16_t CopyCmd(int8_t data,int8_t object) { if( object < CMD_QUE) { CmdQue[0][data].used = CmdQue[0][object].used; CmdQue[0][data].SCmdTime = CmdQue[0][object].SCmdTime; CmdQue[0][data].pid = CmdQue[0][object].pid ; CmdQue[0][data].state = CmdQue[0][object].state; CmdQue[0][data].Rdatalen = CmdQue[0][object].Rdatalen; CmdQue[0][data].Tdatalen = CmdQue[0][object].Tdatalen; // CmdQue[0][data].cmd = CmdQue[0][object].cmd; // memcpy(CmdQue[0][xCmdN].sendTCPdata+7,RS485_RX_BUF,RS485_RX_CNT); memcpy(CmdQue[0][data].data,CmdQue[0][object].data,CmdQue[0][object].Rdatalen); memcpy(CmdQue[0][data].sendTCPdata,CmdQue[0][object].sendTCPdata,CmdQue[0][object].Tdatalen+7); return 1; } else { return 0; } }[/mw_shl_code]

纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2015-1-7 09:51:01 | 显示全部楼层
掉‘{’或者‘}’了吧。少大括号后会出现各种各样的怪问题的。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-7 09:54:14 | 显示全部楼层
if(heard.RecordTab == 1)
{
printf("c");
pTCP = tcp_new();
if(pTCP==NULL)
{
pTCP = tcp_new();
}
server_init(pTCP);
tcp_send_empty_ack(pTCP);
heard.RecordTab = 0;
}
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-7 09:54:38 | 显示全部楼层
回复【2楼】fanghuiopenedv:
---------------------------------
if(heard.RecordTab == 1)
{
printf("c");
pTCP = tcp_new();
if(pTCP==NULL)
{
pTCP = tcp_new();
}
server_init(pTCP);
tcp_send_empty_ack(pTCP);
heard.RecordTab = 0;
}
没有额
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2015-1-7 10:17:40 | 显示全部楼层
全局来看啊,不能看局部的括号。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-7 10:23:10 | 显示全部楼层
回复【5楼】fanghuiopenedv:
---------------------------------
好的我找找,但是括号有问题的话,应当会报错啊!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2015-1-7 13:39:12 | 显示全部楼层
先佔位~

好酷的問題~會不會某個指標去指到那個位址了...

最慘就是單步執行到那個變數變成1的時候..@@

如果問題解決了~希望能分享一下為什麼會這樣~
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-7 15:41:12 | 显示全部楼层
回复【7楼】civic7366:
---------------------------------
数据量大,没法仿真,而且这个问题是在外界特殊环境下发生,如果仿真,外界的特殊环境时间几毫秒,根本发生不了,只能一步步分析了!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-7 15:41:41 | 显示全部楼层
回复【7楼】civic7366:
---------------------------------
问题解决后会分享的。
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

头像被屏蔽

63

主题

73

帖子

1

精华

禁止发言

积分
405
金钱
405
注册时间
2012-4-14
在线时间
8 小时
发表于 2015-1-7 22:35:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-8 07:51:15 | 显示全部楼层
回复【10楼】xiaochuan610:
---------------------------------
不是顺序,加操作系统的!
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-8 14:03:02 | 显示全部楼层
问题已经解决,两个数组越界!
[mw_shl_code=c,true]
[mw_shl_code=c,true]原函数 #define CMD_QUE 5 //插入命令 int16_t AddCmd(u8 *rev,u8 len) { int16_t i; int16_t j; if(rev[0]==0&&rev[1]==0xff&&rev[2]==0&&rev[3]==0xff) { for(i=0;i<CMD_QUE;i++) { if(CmdQue[0].used == 0) { // printf(" i %2X\n\r",i); break; } else if(i==CMD_QUE-1) { ClearCmd(0);//清除第一条 for(j=0;j<CMD_QUE;j++) { CopyCmd(j,j+1);//此时i等于CMD_QUE-1 } // return -1; } } MainAddress = rev[7]; CmdQue[0].used = 1; CmdQue[0].state = 1; CmdQue[0].pid = rev[4]; CmdQue[0].Rdatalen = len-7; memcpy(CmdQue[0].data,rev+7,len-7);//rev+7是什么意思? return 0; } else { return -1; } }[/mw_shl_code]


[/mw_shl_code]
系统结构图



上位机向网关发送命令,对数据进行实时监控,但是由于接收到的命令要从机器人控制器交互,所以,需要一个过程
在这个过程里,导致上位机命令冗余,存储在一个数组里,但是上位机长时间收不到命令,会断了连线,这种异常
在工业控制里是坚决不许的,所以,对处理的命令进行,过滤,即设计了一个队列模型,将先存储但未处理的命令删除,把
刚接收到的命令,插入尾部。
所以这个函数的作用是,顺序遍历结构体数组,将没有用到的地址,插入命令,如果存储已满,则按队列模型处理。

纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-8 14:06:11 | 显示全部楼层
[mw_shl_code=c,true]//交换原函数 int16_t CopyCmd(int8_t data,int8_t object) { CmdQue[0][data].used = CmdQue[0][object].used; CmdQue[0][data].SCmdTime = CmdQue[0][object].SCmdTime; CmdQue[0][data].pid = CmdQue[0][object].pid ; CmdQue[0][data].state = CmdQue[0][object].state; CmdQue[0][data].Rdatalen = CmdQue[0][object].Rdatalen; CmdQue[0][data].Tdatalen = CmdQue[0][object].Tdatalen; CmdQue[0][data].cmd = CmdQue[0][object].cmd; // memcpy(CmdQue[0][xCmdN].sendTCPdata+7,RS485_RX_BUF,RS485_RX_CNT); memcpy(CmdQue[0][data].data,CmdQue[0][object].data,CmdQue[0][object].Rdatalen); memcpy(CmdQue[0][data].sendTCPdata,CmdQue[0][object].sendTCPdata,CmdQue[0][object].Tdatalen+7); return 0; }[/mw_shl_code]

纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-8 14:17:19 | 显示全部楼层
加了两句代码
1、int16_t CopyCmd(int8_t data,int8_t object)
函数里if( object < CMD_QUE)
CMD_QUE = 5,当             
 for(j=0;j<CMD_QUE;j++)
             {

             }
j = 4时,为最后一次循环,若执行CopyCmd(j,j+1)命令则是,CopyCmd(4,5)
结构体数组定义
extern struct SCmd CmdQue[CMD_IRQ][CMD_QUE];
CmdQue[0][5].used;显然已经越界>
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-8 14:20:05 | 显示全部楼层
[mw_shl_code=c,true]这是加的第二部分代码。[/mw_shl_code] [mw_shl_code=c,true]
[mw_shl_code=c,true] for(i=0;i<CMD_QUE;i++) { if(CmdQue[0].used == 0) { } else if(i==CMD_QUE-1) { for(j=0;j<CMD_QUE;j++) { } i = 0; break; } }[/mw_shl_code]


[/mw_shl_code]
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-8 14:29:35 | 显示全部楼层
第二个问题解释,当i做最后一次循环时,i = 4,i在函数int16_t AddCmd(u8 *Cmdrev,u8 Cmdlen)里是局部变量,
 for(i=0;i<CMD_QUE;i++)
{
  //i = 4时,则跳出循环
}
//跳出时i =5
所以
执行这些语句时
        MainAddress = Cmdrev[7];
        CmdQue[0].used = 1;
        CmdQue[0].state = 1;
        CmdQue[0].pid = Cmdrev[4];
        CmdQue[0].Rdatalen = Cmdlen-7;
        memcpy(CmdQue[0].data,Cmdrev+7,Cmdlen-7);
        return 0;
就发生了数据越界
所以应把i置0,然后跳出>
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
 楼主| 发表于 2015-1-8 14:30:42 | 显示全部楼层
回复【7楼】civic7366:
---------------------------------
已分享
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2015-1-9 11:00:46 | 显示全部楼层
回复【18楼】象牙塔:
---------------------------------
謝謝分享~

C認為陣列的越界訪問是合法的,不知道想搞誰  ~"~

還沒看過有高手故意用這種特性寫code...
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-1-9 16:04:25 | 显示全部楼层
谢谢分享,学习了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 06:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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