[问题] 请教指标操作方式

楼主: ando5566 (风云变色)   2022-06-15 18:00:42
开发平台(Platform): (Ex: Win10, Linux, ...)
单芯片开发 PIC18
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
CX8 compiler
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
None
问题(Question):
关于这段code指标的操作觉得不太正常, 想请教版友帮我确认观念
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
定义与宣告部分:
typdef struct{
int A;
char *data;
} MSG_OBJ
typedef struct{
int B;
char useData[8];
} MSG_OBJ_USE
char globalData[8] = {0};
void getDataFun(MSG_OBJ* b)
{
b->data = globalData;
}
MSG_OBJ_USE obj;
以上是定义与宣告, 接下来呼叫时传入obj (特别处为obj之type是MSG_OBJ_USE)
getDataFun(&obj);
之后这段code执行
//Step.1
char* ptr = (char*)(*(uint16_t*)obj.useData); //平台指标为16 bits
//Step.2
for(int i=0;i<8;i++);
{
obj.useData[i] = ptr[i];
}
//问题:
Step1.的动作意思是useData array上面放的值是指标, 所以才可以取值(*)给ptr
然后用step2把copy资料.
我的疑问是b->data = globalData应该是把&globalData[0] 指定给b->data而已.
谢谢回答!!
补充说明(Supplement):
作者: LPH66 (-6.2598534e+18f)   2022-06-15 18:58:00
来跟我说一次: “阵列不等于指标”所以你在 getDataFun() 这里把一个不相容的结构传进去了你可能需要厘清一下到底 _USE 结构是要怎么用应该不会是像你这样硬传进去
作者: chaos1993 (栈前小二)   2022-06-16 00:26:00
看完的理解是getDataFunc(&obj) 将obj.usedata纪录globaldata[0]的内存位置,所以step1才取值拿到globaldata[0]位置并assign给char*但这种不相容strict可以过..?compiler相对不严谨吗更正struct
作者: god145145   2022-06-16 09:16:00
PIC用XC8比较多,你要不要换一下
作者: Lipraxde (Lipraxde)   2022-06-16 10:37:00
他是用 XC8 吧 XD?
楼主: ando5566 (风云变色)   2022-06-16 14:02:00
是XC8没错 抱歉打反了
作者: OnlyRD (里巷人)   2022-06-16 20:18:00
你根本没有拷贝阵列吧?只是破坏了原本的struct的占一个pointer的内存。喔喔你是要复制资料到global的array去吗?这写法实在难不出有什么理由要这样做,感觉像故意隐藏起来,也许是checksum还是防伪防盗版?不懂。但这段code看起来挺危险,不过如果字节对齐没问题,应该可以动作,但不知道compiler有没有一些奇奇怪怪的编译设定要注意。
作者: sarafciel (Cattuz)   2022-06-17 02:09:00
妈呀我看了20分钟才看懂这段code到底想干嘛= =https://godbolt.org/z/MM7fY5dPc 这样应该好懂一些我没用过这颗compiler 但应该不至于连union都不支援..?
作者: CoNsTaR ((const *))   2022-06-17 07:55:00
叠床架屋下的产物吧这段 code 的问题应该只有把 MSG_OBJ_USE* 当作 MSG_OBJ*用而已,其他看起来没问题吧
作者: Lipraxde (Lipraxde)   2022-06-17 10:27:00
C 的 symbol 没有 mangling,变量变成用不同 type 去解读的失误也很容易发生,说不定也是他这个 obj 能这样传的原因XD
作者: OnlyRD (里巷人)   2022-06-17 17:43:00
以前看过类似的东西,叫做GObject,但他是为了提供ABI级的相容性(没记错的话),还有讯号、物件等等,但用GObject写程式无敌痛苦,写过一次就希望以后都不要碰到了,一堆代码重复的功夫。

Links booklink

Contact Us: admin [ a t ] ucptt.com