教训都是血染的

五年前吐槽过自己买的杂七杂八的数码玩意儿,有不少血的教训。时光如水岁月如梭,后来我又买了不少杂七杂八的数码玩意儿,又有了不少血的教训……由于流血过多所以健忘的厉害,也想不大起来究竟是什么教训僚。估计以后会继续流血,继续吐槽……

这其实和我热爱拆卸和以伪电工自居有很大关系。我从小就喜欢折腾电子的东西,曾经订阅少年科学画报并邮购了太阳能充电器进行DIY作业,最终因为把电路图上的导线交点全部连通了导致成品完全不工作。这个事情一直到初中物理课上我才明白,原来交点上用力画个实心点才是连通的啊……

然而失败从来没有阻止我探索的好奇心,真正阻止我探索的是我的钱包。虽然有些东西实在想拆开来看看,但是在它未损坏之前贸然拆开,还是不能接受的。于是和其他人不同,我内心是期望他们损坏的,当然不是大毛病,拆开就可以修好的小毛病最赞了。还有保修贴什么的,真是让人纠结啊,不要阻止我拆卸的欲望嘛!不仅仅是拆卸,我对电烙铁也有一种执念,觉得它是最神奇的工具。大概刚上初中我就有了自己的烙铁,只是在学会阅读电路图之前,烙铁大部分是用来焊接那些该死的线路交叉点。我用烙铁最成功的经历是把GBA盗版卡改造成烧录卡,不过我花了100元买的4张卡只有一半改造成功,并且日后统统坏掉了。可是,这难道不就是DIY的核心精神——花钱又费力么!

记得我刚上大学的时候,别人带着大包小包的衣服食物书来到校园,而我的包包里装着电烙铁和万用表。这是怎样一种超前的态度啊!我甚至觉得所有的老师都将拜倒在我的电烙铁之下。遗憾的是高等学府生涯摧毁了我对电子世界进一步探索的欲望,至今让我仍停留在手持电烙铁焊接导线的阶段。本来我会成为用烙铁制作CPU的人,现在却只能变成用小键盘编写操作系统的人。我曾经不止一次的想过,假如我始终保持着对电子设备钻研的兴趣,在不远的将来,我一定会成为一名伟大的……电工……

无论如何,俱往矣,数杯具人物,还看今朝。我其实是想说……

我的kindle貌似被我拆坏了啊啊啊啊啊啊啊啊!

我勒个去kindle的屏幕哪里有双面胶粘了,铁壳子上层是可以取下来的啊啊啊啊啊啊!

网上的拆机教程能不能不要写的那么二啊啊啊啊啊啊!

(被拖走)

补丁也有补出问题的时候

上一篇提到的member-function pointer的问题,后来发现并不是因为不同的编译环境造成指针大小不一样,而是因为不同的环境下结构体的对齐规则出了问题。

出问题的是vc6.0 sp5,在这个环境下,如果定义unknow type的member-function pointer,例如这样:

class Unkonw; //forward declaration

typedef void(Unkonw::* MFP)(int param);

struct Callback {

char* szName;

MFP fp; }

即使编译选项里面没有设定其他的对其规则,使用了默认的8字节对齐,这个sizeof(Callback)也是32,而不是正常的24。这个问题在原始的vc6.0里面并没有出现,打了sp5补丁才会出现。如果继续升级到sp6就修复这个问题了。所以说,真正邪恶的不是member-function pointer,而是出错的编译器才对-_-b

查问题的时候,有种很简单的输出sizeof结果的方法,可以做到编译期查看对象大小,方法是:

template<int s> class TestTSize; 

然后在需要的地方写TestSize<sizeof(xxx)>()即可在编译出错的信息里面看到求值以后的sizeof。这个技巧貌似在《Modern C++ Design》里面提到过。嗯嗯,很有用的说。