作者besnow (~风中的羽翼~)
站内Programming
标题Re: [问题] const 转换问题..
时间Tue Jun 23 11:50:21 2009
用推文有点慢,我用回文的好了。谢谢您~
※ 引述《tinlans ( )》之铭言:
: ※ 引述《besnow (~风中的羽翼~)》之铭言:
: : 就是我现在有三个函式是
: : A( const Packet *p)
: : B(Packet *p)
: : C(Packet *p)
: : 而Packet是一个struct的型态。
: : 现在原本是
: : ===================================
: : B (Packet *p){
: : ...
: : C(p);
: : return;
: : }
: : ===================================
: : 可是我现在希望可以透过A函式。可是又没法拿掉const。因为拿掉会有问题。
: : 要变成:
: : -----------------------------------
: : B (Packet *p){
: : ...
: : A(p);
: : retuen;
: : }
: : A (const Packet *p){
: : ...
: : C(p);
: : ...
: : return;
: : }
: : --------------------------------------
: : 这样去写的话,第一个问题就是B要传进A的时候,Packet *p to const Packet *p
: : 的部份会error,然後在A函式中,A要传进C时,同样的也会发生
: 乱讲,
: B 把 p 传到 A 是 non-const 变成 const,
: 从较松的限制转成较严的限制怎麽可能会 error,
: 如果真的 error 请写信去向你的 compiler 制造商提出严重抗议,
: 都 2009 年了 C++ compiler 还写不好。
这个部份没有不会出现error,是我说错了。
可是很奇怪的是,我这样丢过去的时候,里面的东西竟然有所改变了。
我在B(Packet *p)中去fprintf该packet中某一个栏位,它不会有出现0的情形。
可是转过去以後去做fprintf,却发现某一个栏位会出现很多0的情形。
不知道是转过去时有发生什麽样的事情还是?..想请教一下。
我说的问题是这个!之前没表达清楚真的很抱歉。
: : const Packet *p to Packet *p 发生error。
: : 如果用强制转。
: : --------------------------------------
: : B (Packet *p){
: : ...
: : A((const Packet*)p);
: : retuen;
: : }
: : A (const Packet *p){
: : ...
: : C((Packet)p);
: : ...
: : return;
: : }
: : -----------------------------------------
: 这样写绝对是有问题,
: C((Packet)p) 你这样是把 pointer type 硬转成非 pointer type,
: 除非是你已经知道它的行为故意这样用否则一定是写错;
: 以下我先当你是想写成 C((Packet *)) 继续说明。
这个是我真的少了加"*",呵!^^
: : 可以complier过,可是里头东西都有问题。不是原本的那个packet。
: : 所以想来请教一下,有什麽方式可以解决。或是说,有办法去转换型态?
: : 还是非得要用memcpy的方式去一个一个做?..
: : 想请教大大们,谢谢。
: 你要充分了解你自己的需求是什麽,
: 我只能跟你说 non-const 丢 const 这个方向是通的,
: 但是 const 丢 non-const 这个方向有 99% 的机率是你的设计概念出问题。
: 你的 A 绝对不可以接收 (const Packet *),
: 然後为了能丢 C 硬把 p 转成 (Packet *);
: 如果你的 C 本身真的不会改到 p 所指的空间,
: 你应该把 C 的参数也 const 化;
: 如果你的 C 本身会修改到 p 所指的空间,
: 你写 C((Packet *)p) 是绝对会出问题,
: 考虑下面程式码片段:
: const Packet packet = { ... };
: A(&packet);
: 如果输出的执行档格式支援 read-only section (如 ELF),
: compiler 会把 packet 配置在 read-only section 上,
: 这时因为 A 宣称它不会改变 packet 内的值,
: 所以 compiler 放心的让你把 &packet 丢进去,
: 结果你的 A 却叫 C 去改了 packet,
: 这样的结果就是程式在执行到修改的地方时马上被 OS 强制终止;
: 总而言之这样写就是 A 本身的语意矛盾 (说不改又马上叫 C 去改),
: 而程式码出现语意矛盾都是设计者的设计概念有问题。
其实会这样用,是因为那个A函式的const没法拿掉,因为他牵扯到很广。
我本身是在写ns2的东西,如果拿掉,里头会出现很多其他的问题。
因为本身对整个ns2架构熟悉度有限,所以才会不得已用这样的方式。
我在编写的时候也发现这样有很多矛盾的地方,不过如果一更改。
就会很麻烦,不过,最好的方法就是可以把C(Packet *p)也更改为
C(const Packet *p),让他维持不去修改,不过现在问题点比较出现在
我上头说的,non-const => const 这个情形下,是否里头有些东西会改变呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.252.48
1F:→ tinlans:不会变,然後 C 不会改东西的话就标 const 118.160.105.96 06/23 14:10
2F:→ besnow:请问楼上大大,您的不会变的意思是??.. 122.116.252.48 06/23 19:21
3F:→ besnow:可是我去把某标头资料拿出来看..不太一样耶 122.116.252.48 06/23 19:22
4F:→ tinlans:non-const 转 const 内容物不变,你看到会 118.160.105.96 06/23 20:26
5F:→ tinlans:变应该是其它地方出问题造成的连锁效应。 118.160.105.96 06/23 20:26