如果遇到向数据文件读写结构的问题,会让很多编程人员都非常头疼。一般来说,最简单,最常用,最清晰的办法是用 fwrite() 来写一个结构 fwrite(&somestruct, sizeof somestruct, 1, fp); 对 应的 fread() 调用可以再把它读回来。但是这样写出的文件却不能移植。为什么呢?我们知道,结构中,各个成员在内存中的存放并不是紧挨着的,而是可能有一些空位,这些空 位的目的是为了填充,保持结构中后面的域的对齐,大多数情况下,这是必须的。为了高效的访问,许多处理器喜欢 (或要求) 多字节对象 (例如,结构中任何大于 char 的类型)不能处于随意的内存地址,而必须是2或4或对象大小的倍数。 正是因为这该死的原因,让我们无法很好得移植这种文件,比如如果结构包含任何指针,则只有指针值会被写入文件,当它们再次读回来的时候,很可能已经失效。 最好的解决办法,就是写一对函数,用可移植(可能甚至是人可读)的方式按域读写结构。尽管开始可能工作量稍大。 那么,我们如何确定域在结构中的字节偏移呢?ANSI C 在 中定义了offsetof() 宏,用 offsetof(struct s, f) 可以计算出域 f 在结构 s 中的偏移量。如果出于某种原因,你需要自己实现这个功能,可以使用下边这样的代码: #define offsetof(type, f) ((size_t) \ ((char *)&((type *)0)->f – (char *)(type *)0)) 当然请注意,这段代码并不是100%可移植的。
Archives for April 2007
如何在linux中直接运行windows二进制程序
虽然大多数linux爱好者都不怎么使用windows,但是不少人还是习惯了某些windows下的软件,而不愿意从开源仓库中寻找替代品。当然,你可以 用拥有wine的GNU/Linux系统解决这个问题。但是还有令人感觉不如意的地方:每次想要启动这些程序时,你不得不输入 cd ~/.wine/drive_c/Program\ Files\My\ Windows\ App; wine My\ Windows\ App.exe 请注意,是每次。用shell脚本也不是什么很好的主意。有没有什么办法,能在xterm下直接通过My\ Windows\ App.exe来运行这些程序?
硬盘维修指南
似乎每次开博都要用这篇文章作为压宝,呵呵。在此前的一些时间,我的朋友若水也曾经写过一些关于硬盘存储器的文章。尔后的一些时间里他一直没有动笔,在这段时间里主要是对他自己的相关知识做一些总结和提炼,并且尽可能地进行了一些实际的动手操作和实验。 经过很长时间的酝酿和筹划,今天,他终于开始写这篇关于硬盘的文章。总体预计分为两个部分,一是硬盘工作的原理,另一则是典型故障的处理。可能这样会使得这篇文章显得略显晦涩,大家也急于看到故障处理方面的经验,但是还是坚持要将硬盘的原理放到前面来讲。硬盘是机电一体化、现代制造技术的典型产品,如果不能对其结构有一个基本的了解,即便是学会了修一两个盘,也不能做到举一反三。不论是对普通的DIYer还是维修从业者,都是没有好处的。
学习LCD编程的起步
在发表之前首先声明,这篇文章是我大一时候写的,最早以“雷风”的名字发表在21ic的论坛中,现在不少人转贴根本不著名“转”,甚至自己还标一个“原创”,还有人写个“作者不详”,拜托大家转贴还是要有点专业精神好不好。 之所以产生写这个东西的想法,是因为趁着大一寒假这段时间看了看学习板的源程序,在看lcd的时候很不顺利,花了五个晚上才看完(白天偷懒了^_^!,毕竟在春节嘛)。联想起还有很多水平和我差不多甚至可能还低一点的菜鸟,就觉得有义务把五个晚上的学习心得写出来。 这个心得是针对学习板上的lcd 驱动芯片SSD181X系列写的,当然思想应该是相通的。其实是我没有用过其他系列lcd(众人呕吐ing……)。好了,接下来进入正题。
让硬盘更聪明——NCQ详解
请记住以下几个日期,它们注定将成为存储史上重要的里程碑:2003年7月,英特尔与希捷共同公布了SATA的重要特性——本地命令序列(NCQ- Native Command Queuing)技术;2004年6月,英特尔最新的ICH6是首个支持NCQ的主板芯片组I/O控制芯片;也是在这月,希捷率先推出支持NCQ的桌面级硬盘——酷鱼7200.8。大家可能注意到他们都有一个关键词NCQ,那么什么是NCQ呢?
自己订制的相当全的vimrc配置文件
供vim爱好者参考。我自己最喜欢gui模式下desert这种配色,可是试验了半天,也不能把这种颜色加到我这个blog背景中,所以干脆自己又做了一个desert配色的html,欢迎下载下来看看。顺便说一句,在不断使用的途中我会不断修改这个配置文件,修改的内容我只更新在位于我主页仓库的这个链接中,这里就不再更新了。还有就是直接在这里看存在字符编码不合适导致乱码问题,如果你对出现乱码的地方比较感兴趣,建议下载附件或者通过上面这个链接来看。
如何在ubuntu下编译内核
每一个发行版本都带有一些特殊的工具,用来从源代码中创建一个自定义的内核,这篇文章就是关于如何在ubuntu系统中编译内核的。内容包括,如何利用最新的,未被修改过的,从www.kernel.org网站上下载下来的源代码来构建自订制系统,这样,你就能独立于发行版所提供的内核。文章同样涉及了如果你需要一些现有内核不包含的特性,如何对内核源代码进行修补等问题。
linux新手编程必读
假如,你是一个linux编程方面的初学者,那么,在开始这段神奇经历之前,你一定会对这篇文章所讲的一些方面非常感兴趣。特别当你以前是一个 windows环境下的程序员的话,那就必须改变一些编程方面的想法和思维,这样当你遇到完全不同的理念和思维方式的时候,才能将这种所谓的“文化”差异带来的影响降到最低。 针对程序员,特别是一些有经验的Windows程序员在论坛上所问的关于linux编程方面的常见问题,我的建议如下: