奇怪,太奇怪了!

sb2603 2012-02-23 04:28:12
void SpidermanSendCmdFeedback()
{
NWK_PACKET_V3 feedback_sp;
int i=0;
int crc;
feedback_sp.addrInfo_v3 = 0x00;//保留
feedback_sp.frameHead_f_v3 = 0x55;
feedback_sp.frameHead_s_v3 = 0xaa;
feedback_sp.frameType_v3 = 0x0a;// cmd feedback_sp type
feedback_sp.DeviceType_v3 = 0x07;
feedback_sp.PVersion_v3 = 0x03;
//feedback_sp.length = 0x07;
feedback_sp.hop_v3 = 0x00;
feedback_sp.payload_v3[i++] = 0xff;
feedback_sp.payload_v3[i++] = 0xff;//feedback_sp addr
//feedback_sp.payload[i++] =
switch(usart.pBuffer[0])
{
case 17:
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 4];
break;
case 25:
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 10];
break;
default:
feedback_sp.payload_v3[i++] = 0xff;
break;
}
feedback_sp.payload_v3[i++] = 0x04;
switch(usart.pBuffer[0])
{
case 17:
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 5];//包序列号
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 1];//crc1
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0]]; //crc2
break;
case 25:
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 11];//包序列号
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 1];//crc1
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0]]; //crc2
break;
default:
feedback_sp.payload_v3[i++] = 0xff;
feedback_sp.payload_v3[i++] = 0xff;
feedback_sp.payload_v3[i++] = 0xff;
break;
}
feedback_sp.payload_v3[i++] = 0x02;//指令送达蜘蛛侠成功
feedback_sp.length_v3 = i+ 1+ 2;
crc = addCrc(&feedback_sp);
feedback_sp.payload_v3[i++] = crc;
feedback_sp.payload_v3[i++] = crc >> 8;

printRawTy( (char*)&feedback_sp.frameHead_f_v3,feedback_sp.length_v3 + PACKET_HEADER_SIZE - 1 );
}


访问此函数时如果机构体变量feedback_sp定义为局部变量的话,函数执行完毕后,结构体变量的值均没发生变化,时局部变量的默认值;但是将此变量定义为全局变量的话,函数执行完毕后,结构体变量的值是期望的值,我用的是IAR for AVR编译器。请问则是为什么呀?是不是编译器设置不对还是另有原因?
...全文
81 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
InsaneCode 2012-02-27
  • 打赏
  • 举报
回复
应该怎么做,看看三楼就知道了。
InsaneCode 2012-02-24
  • 打赏
  • 举报
回复
这根本就不是个问题。和编译器没有关系。你这样写,就会出现这个结果。。。。。。。。
  • 打赏
  • 举报
回复
我想应该不是语言的问题,还上看看你的编译器
InsaneCode 2012-02-24
  • 打赏
  • 举报
回复
(1)定义为全局变量的时候,这个结构体存储在内存的全局变量区,一直到整个程序执行结束,内存都不会被释放。
(2)定义在函数中的时候,这个结构体存在栈区,函数执行结束会被释放。

所以定义在函数内的时候就出现了你说的现象。

(3)使用malloc进行分配其实是将这个结构体保存在堆区。不去free的话,自己不会释放,使用更灵活。如果你将指向这块地址的指针定义在函数中,并且函数结束没有释放,也没有将这个地址传递出去。那么这块申请的内存将不会被释放一直到程序结束。所以要注意释放。
一介布衣萧萧 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sb2603 的回复:]

feedback_sp不是指针呀,你的意思是吧feedback_sp定义为指针吗?还是?要不你给我写写吧,谢谢了
[/Quote]
你可以定义为指针试试。我记得局部变量使用大的空间如果不用malloc进行内存分配的话,就会出现你这种类似的情况。而定义为全局就不会出现这样的情况,估计你就是碰上了这么个情况。
sb2603 2012-02-24
  • 打赏
  • 举报
回复
feedback_sp不是指针呀,你的意思是吧feedback_sp定义为指针吗?还是?要不你给我写写吧,谢谢了
pirates_fish 2012-02-24
  • 打赏
  • 举报
回复
一介布衣萧萧 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sb2603 的回复:]

代码的第一行就是呀,把结构体变量feedback_sp定义为局部变量

void SpidermanSendCmdFeedback()
{
NWK_PACKET_V3 feedback_sp; int i=0;
int crc;
feedback_sp.addrInfo_v3 = 0x00;//保留
feedback_sp.frameHead_f_v3 = 0x5……
[/Quote]
定义完这个NWK_PACKET_V3 feedback_sp;
你用malloc分配一下空间试试。记得用完要free
sb2603 2012-02-24
  • 打赏
  • 举报
回复
该怎么做呀?请指教
InsaneCode 2012-02-24
  • 打赏
  • 举报
回复
不是编译器的问题。你只是修改了栈区的大小。当函数运行结束,栈区中存放这个结构的那块区域释放的慢了一些,所以你还能看见他改变了。其实这样做是严重错误的。程序运行一段时间后,这个值迟早是要被冲掉的。
sb2603 2012-02-24
  • 打赏
  • 举报
回复
解决了,原来是编译器设置有问题,将Cstack和Rstack改大一些就好了,还是要谢谢各位
sb2603 2012-02-24
  • 打赏
  • 举报
回复
解决了,原来是编译器设置有问题,将Cstack和Rstack改大一些就好了,还是要谢谢各位
sb2603 2012-02-23
  • 打赏
  • 举报
回复
代码的第一行就是呀,把结构体变量feedback_sp定义为局部变量

void SpidermanSendCmdFeedback()
{
NWK_PACKET_V3 feedback_sp; int i=0;
int crc;
feedback_sp.addrInfo_v3 = 0x00;//保留
feedback_sp.frameHead_f_v3 = 0x55;
feedback_sp.frameHead_s_v3 = 0xaa;
feedback_sp.frameType_v3 = 0x0a;// cmd feedback_sp type
feedback_sp.DeviceType_v3 = 0x07;
feedback_sp.PVersion_v3 = 0x03;
//feedback_sp.length = 0x07;
feedback_sp.hop_v3 = 0x00;
feedback_sp.payload_v3[i++] = 0xff;
feedback_sp.payload_v3[i++] = 0xff;//feedback_sp addr
//feedback_sp.payload[i++] =
switch(usart.pBuffer[0])
{
case 17:
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 4];
break;
case 25:
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 10];
break;
default:
feedback_sp.payload_v3[i++] = 0xff;
break;
}
feedback_sp.payload_v3[i++] = 0x04;
switch(usart.pBuffer[0])
{
case 17:
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 5];//包序列号
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 1];//crc1
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0]]; //crc2
break;
case 25:
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 11];//包序列号
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0] - 1];//crc1
feedback_sp.payload_v3[i++] = usart.pBuffer[usart.pBuffer[0]]; //crc2
break;
default:
feedback_sp.payload_v3[i++] = 0xff;
feedback_sp.payload_v3[i++] = 0xff;
feedback_sp.payload_v3[i++] = 0xff;
break;
}
feedback_sp.payload_v3[i++] = 0x02;//指令送达蜘蛛侠成功
feedback_sp.length_v3 = i+ 1+ 2;
crc = addCrc(&feedback_sp);
feedback_sp.payload_v3[i++] = crc;
feedback_sp.payload_v3[i++] = crc >> 8;

printRawTy( (char*)&feedback_sp.frameHead_f_v3,feedback_sp.length_v3 + PACKET_HEADER_SIZE - 1 );
}

一介布衣萧萧 2012-02-23
  • 打赏
  • 举报
回复
值域问题。
LZ说的局部定义结构体,怎么个定义法?你把代码贴出来瞧瞧

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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