OpenEdv-开源电子网

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

关于结构体类型全局变量问题求助!!!

[复制链接]

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
发表于 2016-1-7 12:36:55 | 显示全部楼层 |阅读模式
1金钱
用的keil


结构体里一个数据
typedef struct
{
...
    u8 onTimer;
...
}JJJJ;

在程序中声明全局JJJJ jjjj;
jjjj.onTimer++;
这个加加为什么没有增加?jlink断点过去,发现这个值一直为0.这是什么原因????用的keil编译器。

最佳答案

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

我曾经出现过结构体赋值但是一直为0的情况,原因是我在程序中使用了类似memcpy等内存复制的函数而没有令结构体里面的字节对齐,导致每次赋值都送到了结构体中的其他字节上,对齐其实很简单,有专门的指令__align(),但是完全可以不用,先用手动对齐试试,我也懒得打那么多字告诉你怎么对齐,你参考下下面这个坛友的帖子吧,估计看完你会懂的http://www.openedv.com/forum.php ... 4%BD%E1%B9%B9%CC%E5
你艹我,我艹你,都一样。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2016-1-7 12:36:56 | 显示全部楼层
本帖最后由 229382777@qq.com 于 2016-1-7 20:17 编辑
zhoucl123 发表于 2016-1-7 15:27
现在比如在机构体里面,我加了onTime,其他成员变量,却加了,而onTime却没加。这现象感觉就是字节没有对 ...

我曾经出现过结构体赋值但是一直为0的情况,原因是我在程序中使用了类似memcpy等内存复制的函数而没有令结构体里面的字节对齐,导致每次赋值都送到了结构体中的其他字节上,对齐其实很简单,有专门的指令__align(),但是完全可以不用,先用手动对齐试试,我也懒得打那么多字告诉你怎么对齐,你参考下下面这个坛友的帖子吧,估计看完你会懂的http://www.openedv.com/forum.php ... 4%BD%E1%B9%B9%CC%E5
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-1-7 12:45:06 | 显示全部楼层
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 12:55:00 | 显示全部楼层
八度空间 发表于 2016-1-7 12:45
http://www.openedv.com/thread-36299-1-1.html
看帖子最后解释

你好,恕我愚钝,帖子我看完了,是讲的emWin5.22的移植,和我的问题有啥联系么?
你艹我,我艹你,都一样。
回复

使用道具 举报

43

主题

326

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2240
金钱
2240
注册时间
2014-10-20
在线时间
376 小时
发表于 2016-1-7 13:07:55 | 显示全部楼层
问题提得太抽象了,不利于解决问题。。
吐槽两点:
1. 标题应该把问题概括出来
2. 正文部分把问题尽量详细地描述出来,而不是反过来把问题抽象化
回复

使用道具 举报

43

主题

326

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2240
金钱
2240
注册时间
2014-10-20
在线时间
376 小时
发表于 2016-1-7 13:19:09 | 显示全部楼层
捕获.PNG
试了一下,没发现有问题。。

回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2016-1-7 13:48:01 | 显示全部楼层
問題是沒事把結構名稱 跟變數名稱宣告的一模一樣
你是沒BUG想弄點BUG出來嗎?
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 13:58:50 | 显示全部楼层
Rocks 发表于 2016-1-7 13:48
問題是沒事把結構名稱 跟變數名稱宣告的一模一樣
你是沒BUG想弄點BUG出來嗎?

谢谢你的回答,哪里一样啦? JJJJ 和jjjj   onTime  一样嘛?
你艹我,我艹你,都一样。
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 14:00:09 | 显示全部楼层
telentmmc 发表于 2016-1-7 13:19
试了一下,没发现有问题。。

问的那么清楚,要不你加我qq467666701
你艹我,我艹你,都一样。
回复

使用道具 举报

43

主题

326

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2240
金钱
2240
注册时间
2014-10-20
在线时间
376 小时
发表于 2016-1-7 14:06:09 | 显示全部楼层
zhoucl123 发表于 2016-1-7 14:00
问的那么清楚,要不你加我qq467666701

好多年没用过QQ了,而且公司不允许上QQ。。不好意思
仔细再看了一下,发现我上面举的例子不是很合适(举例上是struct的用法),感觉typedef struct用法上出了问题,建议你先仔细研究下typedef struct的用法。
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2016-1-7 14:08:28 | 显示全部楼层
结构体数据字节对齐再试试
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 14:47:37 | 显示全部楼层
229382777@qq.co 发表于 2016-1-7 14:08
结构体数据字节对齐再试试

怎么对齐,可否举个例子?谢谢。
#pragma pack(push)
#pragma pack(1)

我用了这个,算是对齐了么?
你艹我,我艹你,都一样。
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 14:48:33 | 显示全部楼层
telentmmc 发表于 2016-1-7 14:06
好多年没用过QQ了,而且公司不允许上QQ。。不好意思
仔细再看了一下,发现我上面举的例子不是很合适(举 ...

typedef struct  用法是正确的,谢谢你的热情回答。
你艹我,我艹你,都一样。
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2016-1-7 14:59:05 | 显示全部楼层
你的例子 結構名稱=JJJJ 跟變數名稱=jjjj

試試我的?
typedef struct
{
...
    u8 onTimer;
...
}JJJJ;

在程序中声明全局JJJJ mytest;
mytest.onTimer++;

另外任何數值使用前請先定義好初始化數值
mytest.onTimer=0;
回复

使用道具 举报

30

主题

282

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2015-8-24
在线时间
241 小时
发表于 2016-1-7 15:15:56 | 显示全部楼层
Rocks 发表于 2016-1-7 14:59
你的例子 結構名稱=JJJJ 跟變數名稱=jjjj

試試我的?

我很怀疑就是没初始化,没别的问题。
回复

使用道具 举报

43

主题

326

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2240
金钱
2240
注册时间
2014-10-20
在线时间
376 小时
发表于 2016-1-7 15:18:56 | 显示全部楼层
捕获.PNG
这是刚写的例子,然后再仔细考虑考虑6楼说的话

回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 15:19:32 | 显示全部楼层
沉默焚烧 发表于 2016-1-7 15:15
我很怀疑就是没初始化,没别的问题。

呵呵,我 也希望自己没有初始化,可是我还真的初始化了。但是即使不初始化,应该也能加上去的呀。(我不是C++,而是标准的C语言)
感谢你的回答。
你艹我,我艹你,都一样。
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 15:20:23 | 显示全部楼层
Rocks 发表于 2016-1-7 14:59
你的例子 結構名稱=JJJJ 跟變數名稱=jjjj

試試我的?

你好,感觉问题很有可能是10楼回答的,字节对齐的问题。
你艹我,我艹你,都一样。
回复

使用道具 举报

30

主题

282

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2015-8-24
在线时间
241 小时
发表于 2016-1-7 15:24:22 | 显示全部楼层
zhoucl123 发表于 2016-1-7 15:20
你好,感觉问题很有可能是10楼回答的,字节对齐的问题。

你试过了吗?现在到底什么状况呢?
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 15:27:28 | 显示全部楼层
沉默焚烧 发表于 2016-1-7 15:24
你试过了吗?现在到底什么状况呢?

现在比如在机构体里面,我加了onTime,其他成员变量,却加了,而onTime却没加。这现象感觉就是字节没有对齐。也就是我一开始就怀疑:结构体在强转的时候,定位错误了。
你艹我,我艹你,都一样。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2016-1-7 20:37:10 来自手机 | 显示全部楼层
加上volatile看看。可能是编译器优化了,而你看到的是硬件ram中的值?跳出循环再看看变量有没有变。
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-1-7 20:41:03 | 显示全部楼层
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2016-1-7 20:41:58 | 显示全部楼层
楼上的情况也有可能
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 20:44:16 | 显示全部楼层
ofourme 发表于 2016-1-7 20:37
加上volatile看看。可能是编译器优化了,而你看到的是硬件ram中的值?跳出循环再看看变量有没有变。

多谢,不是优化的问题。
你艹我,我艹你,都一样。
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-7 20:47:22 | 显示全部楼层
229382777@qq.co 发表于 2016-1-7 19:51
我曾经出现过结构体赋值但是一直为0的情况,原因是我在程序中使用了类似memcpy等内存复制的函数而没有令 ...

多谢,你回答的比较靠谱点吧。但实际我不是采用对齐的方式解决的(其实本身我已经按字节对齐的了)。算了,问题已经解决,你的回答就结贴吧。
你艹我,我艹你,都一样。
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2016-1-7 20:49:20 | 显示全部楼层
zhoucl123 发表于 2016-1-7 20:47
多谢,你回答的比较靠谱点吧。但实际我不是采用对齐的方式解决的(其实本身我已经按字节对齐的了)。算了 ...

希望楼主告知如何解决的,方便遇到同个问题的人参考
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-1-8 12:40:14 | 显示全部楼层
zhoucl123 发表于 2016-1-7 12:55
你好,恕我愚钝,帖子我看完了,是讲的emWin5.22的移植,和我的问题有啥联系么?

帖子最后有讲到++和--
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
 楼主| 发表于 2016-1-8 19:43:59 | 显示全部楼层
八度空间 发表于 2016-1-8 12:40
帖子最后有讲到++和--

多谢,然后呢?

似乎和我问的根本不是一个问题。
你艹我,我艹你,都一样。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 23:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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