`
hellhell
  • 浏览: 23215 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
文章列表
    前面写过碰到的链接问题http://silconfuse.iteye.com/blog/491830,当时写的应该是错误的,从dll中import的函数并不是改名为imp_xxx,这个imp_xxx是指向函数地址的地址。         比如从dll输入一个函数func,调用func时,那么生成的汇编应该是 DWROD __imp_func@4 = 0x12345678 call dword ptr[__imp_func@4]     编译器为什么要这样做,因为链接器在链接期间肯定不会知道func的地址,只能得到一个推测值。因此模块加载器经常需要找到一个引入函数的正确地址并 ...
    今天被同事发现一个编程错误,一个局部变量,因为将其指针传递了太多层,里面已经搞不清,把它当成堆的变量进行cache,幸好他眼尖,避免了这一严重的bug。     不过今后应该如何避免这一问题呢。我首先想到的是,以后如果是栈上的变量向下传,就传引用,如果是堆上的变量向下传,就传指针。不过这一想法还不行,因为有时候是在一个framework里做,或者和别人的代码一起协作,人家的代码可能并不会按这个规范来。后来,我想起之前在《软件随想录》里看到的关于匈牙利命名法的文章,完全可以这样用嘛,如果是一定要向下传栈上变量的指针,就把它命名为localXXX之类的,看着就一目了然了。
1. 一种类型的数据在系统中只应该有一种表示方法,如果表示法多于一种,而且互相之间转换不那么方便,就等着吃苦头吧。 2. 流程上的很重要的一点,如果设计时有难点,不应该把它推后,而是应该早早地就想清楚,推后的结果是有可能为了搞定这个难点,而要大规模修改其它已经完成的部分。
   我觉得我这样的故事算是典型,每天google reader里有无数未读项目,buzz和twitter上有不少更新,有时候还上技术论坛。不过我很少发言。我订阅了很多牛人的blog,buzz和twitter上也有follow了很多牛人,每天看这些所谓“牛人”的发言就花了很多的时间,但是我还不觉得这个是浪费,反而有种在“学习”的错觉。    实际上呢,我觉得我这几年进步很小,小到让人难堪的地步。我痛定思痛,开始反省,觉得自己其实并没有从这些网络上“牛人”的言论中学习到什么。反而,因为上一篇文章和下一篇文章之间,微博里上一句话和下一句话之间,并没有什么关联,使得我的阅读十分地碎片化,有那么多东西 ...
译者按:打算翻译一份lex& yacc教程,每天一点点,这个是原文的第一部分,介绍。 1. 介绍     直到1975年,写一个编译器还是一个非常耗时的里程。然后Lesk和Johnson发布了关于lex和yacc的论文。这些工具极大地简化了编译器的构造。lex和yacc的实现细节可以在 Aho[1986]里找到。     Lex和Yacc可以在以下地方找到     1. Mortice Kern Systems(MKS),http://www.mks.com     2.GNU flex and bison, at http://www.gnu.org,     3.Ming, a ...
我明白自己已经拿到了一张黄牌了,如果再拿一张,就面临着人生的出局,我必须努力,这样,到我死前,第二张黄牌也不会来。 我希望自己永远记住今晚,2010年6月6日,永远保持这一份危机感,为你。
http://sunxiunan.com/?p=1628这个文章是专门讲这个的,其实我觉得一句话就可以讲清楚,就是编译器生成汇编时,对应生成的是地址而非值的,就是左值。 比如a = b; 变成汇编可能是mov xxx[xxx], ebx; ebx里是b的值。 这时的a和b都是一样的形式,但是b生成代码时,是生成的值内容,而a则是生成对应的地址。上面引的那篇文章不错,可惜后面陷于讨论奇怪代码细节了。
看到蔡学镛的最新博文http://jerrylovesrebol.blogspot.com/2010/05/blog-post_26.html 第一句话 二十多年來,我幾乎每天都在瘋狂學習 真是羞愧,自己说这三天都在疯狂学习的底气都没有。不过蔡大师文章中所说的问题也是老生长谈,上次榕哥说,学习是一个行->知->行的过程,所以,上班要赶紧干活,不要看书,要看书回家看去。
#include <stdio.h> void p(char* s, int a) { fprintf(stderr, "%s and %d", s, a); } void f(char* s, int a) { int b[1]; printf("%x\n", b[1]); printf("%x\n", b[2]); printf("%x\n", b[3]); b[4] = (int)(p); b[5] = (i ...
现在电脑换了台好的,不像以前那台连eclipse也跑不动,于是决定装个android的开发环境,结果活生生地整了一晚上。 我的系统是ubuntu9.10,首先去下eclipse(找个比较快的镜像都不容易,最快的有上海的镜像,不知道为什么不会自动 ...
接着看删除部分,删除部分比插入要更难搞一些。对于删除,同样需要分情况讨论。 1.如果是在一个平衡节点下删除,只要把这个节点的高度信息修改就可以了 2.如果是在较长的子树下删除,就把这个节点的高度信息修改成平衡 以上两种情况都不需要进行旋转。 3.如果是在较短的子树下删除,除了更新高度信息外,还需要旋转节点。这时又分3种情况讨论。 3种情况的图如下,直接针对编程就可以了 与插入一样,删除时不必从树根开始更新,记录一个path_top即可。如果某个节点是平衡的,那么删除不会影响到它以上的节点,如果某个节点下的情况和图1相同,那么删除也不会影响到它以上的节点。这时可以把path_top设 ...
最近在复习数据结构,看到avl树,这样比较复杂的数据结构通常都很搞人。于是上网,找到一个实现看,写这代码的老外叫Neil Brown,一个大胡子,我们知道,在国外,开发人员的水平经常和胡子的多少成正比。还看到他在blog中说,这个代码打算用在linux kernel里,自然不会是普通代码了。 我拿下来,狠看一阵才看懂,不得不说,这个代码很多地方的实现是很精妙的,和教材上只是为了让你理解概念的代码,区别很大。 这个实现有一个特点,就是没有一般树实现中的left和right指针,作者用一个数组next[2]来表示,next[0]就是左子树,next[1]就是右子树,然后每个节点也不保存当前的层高,这 ...
最近读了点lua的源码,打算记录下来,将来也知道自己这一段干了啥。 其实我以前也试图读过lua源码,不过一直没有找对下手方向,比如我一直试图从main下手,这个是错误的,还没有进行正题,就被一大堆初始化给搞晕了,加之决心不大,就这样一直拖着没有看。 不过最近因为工作的原因,熟悉了lua的c api,发现从c api入手是个不错的方法。但是首先,还是要熟悉下Lua里面的基础数据结构: /* ** Tagged Values */ #define TValuefields Value value; int tt typedef struct lua_TValue { ...
std::string(我们就默认是std::basic_string<char>吧)没有直接实现operator const char*,而是用一个c_str()函数来实现这个转换,我过去一直对STL这个舍近求远的做法不大理解,不过最近碰到一个应用场景,说明了这个做法的合理性。 const char* foo() { ....... // 这里正确的写法是str.size()?str.c_str():0; return str.size()?str:0; } 如果std::string实现了operator const char*,在这 ...
在MSVC中,如果用dllimport修饰的函数还在def文件中声明,那么它导出时函数名会被修改成_imp_funcname状.今天,client代码的写法是准备从dll在import函数,不想那个dll已经变成lib了,导致link错误,当时看到一堆找不到_imp_xxxx函数的错误,相当迷茫。 下面两个链接仔细说明这个问题: http://msdn.microsoft.com/en-us/library/54xsd65y.aspx http://stackoverflow.com/questions/334896/clrdump-c-error-lnk2019-unresolved-exte ...
Global site tag (gtag.js) - Google Analytics