Programming 板


LINE

用推文有点慢,我用回文的好了。谢谢您~ ※ 引述《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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP