作者ando5566 (贩卖梦想的人)
看板C_and_CPP
标题[问题] 请教指标操作方式
时间Wed Jun 15 18:00:42 2022
开发平台(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):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.231.184.52 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1655287244.A.D2B.html
1F:推 LPH66: 来跟我说一次: 「阵列不等於指标」 06/15 18:58
2F:→ LPH66: 所以你在 getDataFun() 这里把一个不相容的结构传进去了 06/15 18:59
3F:→ LPH66: 你可能需要厘清一下到底 _USE 结构是要怎麽用 06/15 19:02
4F:→ LPH66: 应该不会是像你这样硬传进去 06/15 19:03
5F:→ chaos1993: 看完的理解是getDataFunc(&obj) 将obj.usedata纪录glo 06/16 00:26
6F:→ chaos1993: baldata[0]的记忆体位置,所以step1才取值拿到globald 06/16 00:26
7F:→ chaos1993: ata[0]位置并assign给char* 06/16 00:26
8F:→ chaos1993: 但这种不相容strict可以过..?compiler相对不严谨吗 06/16 00:28
9F:→ chaos1993: 更正struct 06/16 00:28
10F:推 god145145: PIC用XC8比较多,你要不要换一下 06/16 09:16
11F:→ Lipraxde: 他是用 XC8 吧 XD? 06/16 10:37
12F:→ ando5566: 是XC8没错 抱歉打反了 06/16 14:02
13F:推 OnlyRD: 你根本没有拷贝阵列吧?只是破坏了原本的struct的 06/16 20:18
14F:→ OnlyRD: 占一个pointer 06/16 20:18
15F:→ OnlyRD: 的记忆体。 06/16 20:18
16F:推 OnlyRD: 喔喔你是要复制资料到global的array去吗?这写法 06/16 20:30
17F:→ OnlyRD: 实在难不出有 06/16 20:30
18F:→ OnlyRD: 什麽理由要这样做,感觉像故意隐藏起来,也许是che 06/16 20:30
19F:→ OnlyRD: cksum还是防伪 06/16 20:30
20F:→ OnlyRD: 防盗版?不懂。但这段code看起来挺危险,不过如果 06/16 20:30
21F:→ OnlyRD: 字节对齐没问题 06/16 20:30
22F:→ OnlyRD: ,应该可以动作,但不知道compiler有没有一些奇奇 06/16 20:30
23F:→ OnlyRD: 怪怪的编译设定 06/16 20:30
24F:→ OnlyRD: 要注意。 06/16 20:30
25F:→ sarafciel: 妈呀我看了20分钟才看懂这段code到底想干嘛= = 06/17 02:09
27F:→ sarafciel: 我没用过这颗compiler 但应该不至於连union都不支援..? 06/17 02:12
28F:推 CoNsTaR: 叠床架屋下的产物吧 06/17 07:55
29F:→ CoNsTaR: 这段 code 的问题应该只有把 MSG_OBJ_USE* 当作 MSG_OBJ* 06/17 07:55
30F:→ CoNsTaR: 用而已,其他看起来没问题吧 06/17 07:55
31F:→ Lipraxde: C 的 symbol 没有 mangling,变数变成用不同 type 去解 06/17 10:27
32F:→ Lipraxde: 读的失误也很容易发生,说不定也是他这个 obj 能这样传 06/17 10:27
33F:→ Lipraxde: 的原因XD 06/17 10:27
34F:推 OnlyRD: 以前看过类似的东西,叫做GObject,但他是为了提供 06/17 17:43
35F:→ OnlyRD: ABI级的相容性 06/17 17:43
36F:→ OnlyRD: (没记错的话),还有讯号、物件等等,但用GObject写 06/17 17:43
37F:→ OnlyRD: 程式无敌痛苦 06/17 17:43
38F:→ OnlyRD: ,写过一次就希望以後都不要碰到了,一堆代码重复 06/17 17:43
39F:→ OnlyRD: 的功夫。 06/17 17:43