关于static类成员变量初始化的问题

hpxzw 2013-09-09 11:23:54
大家好,我这里有个问题百撕不得骑姐,希望大家帮帮忙,灌水的就谢谢了,不过分就少了哈~~
----------------------------------------------------------------------------------------

有个类(就叫A)-需要有公有成员变量(结构体数组arr),定义为static,

在其他的类(例如B)中要访问这个数组(先需要同步,再访问),直接A::arr[0].digit=0,类似这样就没问题,如果在类A中加一个函数InitTrendArr(),然后在类B中调用A::GetInstance()->InitTrendArr(),在InitTrendArr()函数中把变量的值打印输出,没问题,但调用完成之后,在类B中打印就不对了,保持原来的值,我把数值和数组arr地址打印输出了,在pc上是一样的,在板子上就不一样了。。。难道是跟编译器有关的么?
volatile关键字也加了试过,还是不行~~

我现在是不这样调用A::GetInstance()->InitTrendArr(),直接A::arr[0].digit=0,这样就没问题,但总觉得这样不好


有个应用实例是:打开一个窗口,oncreate的时候 需要先同步一下arr数组中的变量,需要对数组arr进行一些初始化(每次打开前都要初始化)


ps:我是做嵌入式的,有模拟器可以在pc环境调试,但实际的结果是pc上没问题,板子上就有问题了

我回复可能慢些,但想着差不多一个星期结贴吧,希望能弄明白
...全文
312 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2013-09-17
  • 打赏
  • 举报
回复
应该有硬件调试器的吧, 比如JLink之类的. 或者你输出的两个地址有相关性没得, 比如两个地址偏移差多少之类的.
赵4老师 2013-09-17
  • 打赏
  • 举报
回复
先学会用板子自带的调试器。
hpxzw 2013-09-17
  • 打赏
  • 举报
回复
引用 7 楼 hordemark 的回复:
看你头像晃的我头晕。。。
你看内容就行了 头像不用看
hpxzw 2013-09-17
  • 打赏
  • 举报
回复
引用 6 楼 FreeMyself 的回复:
会不会和编译器设置有关,比如大小端,优化级别等
我也怀疑是跟这有关。。。
hpxzw 2013-09-17
  • 打赏
  • 举报
回复
我也怀疑是跟这有关。。。
hpxzw 2013-09-17
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
先学会用板子自带的调试器。
引用 12 楼 xiaohuh421 的回复:
应该有硬件调试器的吧, 比如JLink之类的. 或者你输出的两个地址有相关性没得, 比如两个地址偏移差多少之类的.
------------------------------------------------------------------------------ 这个应该涉及到C++,类函数是否能修改static变量有关,跟板子关系应该不大吧。。。或者是跟编译器优化有关?
hordemark 2013-09-16
  • 打赏
  • 举报
回复
看你头像晃的我头晕。。。
FreeMyself 2013-09-16
  • 打赏
  • 举报
回复
会不会和编译器设置有关,比如大小端,优化级别等
modyaj 2013-09-09
  • 打赏
  • 举报
回复
PC上一样 板子上不一样 我表示只能灌水
hpxzw 2013-09-09
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
有没有大小端的问题? pc 和arm 应该还是有很多不一样的!
这个没,打印输出是地址不一样!
max_min_ 2013-09-09
  • 打赏
  • 举报
回复
有没有大小端的问题? pc 和arm 应该还是有很多不一样的!
hpxzw 2013-09-09
  • 打赏
  • 举报
回复
引用 4 楼 azhou88 的回复:
哥们,最好把代码贴出来,光这样子说你在锻炼我的想象力。 我想想你的问题可能是可能是指针的问题。
嗯 我贴上关键code --------------------------------------------------- a.h ---- typedef struct trend_paramdata { NT_UINT16 paramid; //参数id NT_INT16 strid; // NT_INT16 uintStrid; //单位strid NT_INT16 moduleid; //所属模块 NT_INT16 digit; //小数位 NT_BOOL bmoduleon; //模块是否打开 }TREND_PARAMDATA; class NTTrendData { NT_VOID InitTrendArray(); static TREND_PARAMDATA volatile G_S_PAR_DATA[TREND_ITEM_MAX+1]; }; a.cpp ---- volatile TREND_PARAMDATA NTTrendData::G_S_PAR_DATA[TREND_ITEM_MAX+1] = { {TREND_ITEM_XXX, STR_HR_NAME, STR_UNIT_XXX, MODULE_ID_XXX, DIGIT_0,NT_TRUE}, }; NT_VOID NTTrendData::InitTrendParamArray() { G_S_PAR_DATA[0].uintStrid = STR_UNIT_OF; NTPrintf("1 %d--\n",&G_S_PAR_DATA[0]); } b.cpp ----- NT_VOID NTReviewMenu::Init() { NTTrendData::GetInstance()->InitTrendParamArray(); NTPrintf("2 %d--\n",&NTTrendData::G_S_PAR_DATA[0]); } 就是这样 1、2打印出来的地址不一样(在pc上调试是一样的,板子上不一样)
azhou88 2013-09-09
  • 打赏
  • 举报
回复
哥们,最好把代码贴出来,光这样子说你在锻炼我的想象力。 我想想你的问题可能是可能是指针的问题。

64,636

社区成员

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

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