Archives for c

all about c code

一个新的开源项目Libsvm-androidjni

我创建了一个关于libsvm库+Android的开源项目 Libsvm-androidjni. 这个项目的目的是让当今最流行的SVM支持向量机机器学习库Libsvm被移植到Android平台中。当然官方提供了Java库,但用Java来进行大规模的SVM计算还是太低效了,所以这个项目是要把c/c++版本的库移植到JNI环境下。 目前的code状态是svm的training和prediction功能皆可正常运行。具体的使用方式请参考README。虽然是c++环境,但主体code还是c的风格,这和我个人喜好有关,不影响使用。 目前还有一些高级功能不完善,比如完整的参数传递和误差计算。 项目代码请到https://github.com/cnbuff410/Libsvm-androidjni下载。

速度和代码体积的角逐—33种程序语言测试

没有标题党,没有标题党,今天要介绍的网站,是一个针对33种程序语言进行了13个交叉测试的牛逼网站,The Computer Language Benchmarks Game(Attention: 目前非常时期,需要翻墙方可访问)。如果你希望了解一些关于程序语言的速度,代码体积等特性比较,并希望以此作为依据来选择要学习的语言的话,这里绝对是你的最佳参考场所之一。 如果你是属于对这种测试已经感到厌倦并声称不再相信任何测试的人,那么不要着急,先看看这篇声明。基本上,The Benchmark Game做了大量的工作来保证其测试的公平公正已经普适性,如果放下偏见,也许你会稍微对其有一些认同。自从回家休假后杂事太多,所以我只是稍微看了一下,没有深入研究。有兴趣的朋友请自行围观。 测试结果可以用下面这个坐标图表示

嵌入式系统上的简易printf

此文针对嵌入式软件的业余初学者,高手请自行路过打酱油。 嵌入式中,调试手段通常有两种,一是远程gdb,一是直接printf。如果是调试自己玩的小板子,用gdb有点大张旗鼓了,大多数情况下printf就可以搞定。不过printf的问题是stdio lib的size太大,稍微有点程序,加上几个常用的库,比如stdio和string,超过16k甚至32k(已经大于一些低端芯片的flash容量了)是很正常的事情,而且通常比较慢,程序越多,越麻烦。道理很简单,标准C语言库的规范中,Printf() 必须处理大量的数据格式,包括字符串、字符、(各种长度的有符号和无符号)数字,以及浮点值。而且格式字符串还要包括用于更改文本对齐、基数、间距、字段宽度和精度的调节器和指示器。符合这个规范的代码必然会是冗长和繁重的。一些嵌入式系统库倒是提供了一些之针对整数的printf,但还是有问题,首先是还是太大,其次是你没有自己的调整权限。 其实printf也就是IO的调用包装而已,我们完全可以自己写一个简易版本的printf满足自己的需要,并随时根据需要裁剪。具体来说,printf在这里要起的作用就是将调试字符串从嵌入式目标空闲的串口压出,并在运行于宿主工作站的终端模拟器上显示结果。下面就简单介绍一下,如何来自己写一个简易printf函数。

两个有趣的图片

在MSDN Rowe的blog上看到的,放到这里来,估计是比较火星了。 第一个是文本编辑器的学习曲线。说是文本编辑器,其实vim,emacs都不算纯的文本编辑器,更不用说可怜的再次受鄙视的VS了。我是一个vim的坚定支持者,原因就在于vim的学习曲线。当然,你看起来很陡很短的坡,我用熟练也花了至少3个月,也没有那么短的:) Anyway, it’s worthy of efforts. 下一个图片是典型的口水图片。

初学python,感受和C的不同

从开始看Python到现在也有半个多月了,前后看了Python核心编程和Dive into Python两本书。话说半个月看两本,是个人都知道有多囫囵吞枣,这也是因为我暂时没有需求拿这个做大型开发,主要是平时的小程序test用一用。所以我的策略是,整体浏览,用到时候现查。话说这核心编程第一版太古老了,老在讲2.2之前的东西,我看的翻译电子版,翻译得也不好,很晦涩。看完这个后还有点云里雾里,看网上人家说DIP好,啄木鸟还有免费电子文档,就找来看这个。怎么说呢,讲的比核心编程好,但不适合第一次看的初学者。我之所以觉得讲得好,是因为看核心编程,有些概念还有些模糊,看了这本书就明白不少了。要是初学者上来就看这本,保证不好理解。

编译安装Google-Gadgets-for-Linux

Google Gadgets的Linux版本发布了!

工作在Linux下的想要获得gadgets的朋友有福了,Linux版本是和Windows以及其他版本的Gadgets兼容的,而且也是开源的,效果也是和MAC以及Win版本一样。更关键的是,好像目前已有的Gadgets开发API不变,只是跨平台了,原有开发者不需要学习新API,这是很爽的。这里谈一谈怎么安装吧。

10个重要的算法C语言实现源代码

包括拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔

都是转载的,而且都是没有经过测试的源代码,看看思路就行了,作为资料在这里保存一份下来。

浅谈获得随机数的几种方法

很多朋友在编程的时候都会遇到要使用随机数的情况。怎样获得在一定范围内的随机数呢?

理解C中的序列点

这篇文章和浅谈获得随机数的几种方法是我07年初写的了。当时发在bokee那个网址上,本来早就遗弃那里了,今天一个网友发邮件问我上面的一个问题,我好奇得回去瞧瞧,这不看不知道,一看吓一跳,那里居然还保存着,bokee官方也没有删除,还有不少网友在上面留言,浏览量已经达到了28w多了……上帝,我放弃那里都已经一年多了……随手翻了翻,觉得有两个帖子可以贴过来作为入门文章,就转移过来了。

求证这个AVLTREE Delete

昨天晚上在写一段代码的时候,发现有上千个字符串要处理,查找,以前搞嵌入式编程,没有这么多数据要处理,一般遇到这种情况都是直接用简单的二叉树了事。现在这玩意对性能要求挺高,数据又多,怕普通查找树到最后容易不平衡,所以决定采用平衡树来做。

除了简单的链表队列查找树以外,大多数的数据结构都还给老师了…….没办法,赶鸭子上架,找了一本“数据结构与算法分析”的书,看了看上面的AVL树介绍。介绍倒是挺清楚的,不过天杀的居然只有insert的代码示例,但我这里关键是要delete的实现。于是乎,“拿来主义”的幻想就此破灭。一看时间,只有半个小时就要交code了,估摸着自己写了一个delete出来,只试了几种情况,也不知道是不是普遍性正确的,所以贴上来,如果有朋友稍微有耐心看完发现有错误,希望指出,呵呵。

一场辩论会:应用程序有无必要查询系统内存?

今天在Unix新闻组上看见一个帖子的讨论,破有感触。以前在编写应用程序的时候,有时候会面临一个比较头疼的问题:程序是否需要去获得有关系统当前可用内存的信息?通常,每一个观点都有正反两派,尤其是在网上的讨论,这个问题也不例外。 反对者说,“可用内存”这个概念实在太抽象,其实应用程序根本就没有必要去关心它,因为分配内存是操作系统的工作。赞成者说,有可能存在一些情况,应用程序需要合法地知道当前系统可用内存有多少。公说公有理,婆说婆有理,有些事清本来就是没有确定的答案的,因此我们也没有必要在这个问题上下一个明确的判断。不过具体针对这两种观点展开一些讨论,倒是有点意思。我以模拟辩论会的形式来一一讲出支持和反对的理由,希望各位能够适应这种方式^_^ 支持者: 感谢CCTV,感谢ChinaV,感谢Comp.Unix,感谢forwind让我有这个机会站在这个舞台上为大家陈述我的观点…….好了,切入正题,为什么我支持“允许查询”这个观点呢?,好,假定如果你是在编写一个专门用于报告可用系统资源的程序,例如Top……

Qt简介以及vs.net 2005与qt的联姻指南

提起 Qt Designer,搞linux的朋友早就非常熟悉,linux下界面编程基本都用它。但是windows下,用qt编写GUI的人却不多,西电我听说的也几乎没有。有人说,我直接用MFC不就行了?我觉得吧,MFC是一个框架,但它不应当要求使用它的人熟悉了整个框架之后才能够使用这个系统,但很显然,如果你不了解内部机制,是不太可能把它用好的,我不能解释清楚为什么会出现这种现象。而且,MFC只适用于WIN平台,Qt可以在Windows, Linux,Mac等上,MFC跨平台的特性远没有qt好。最重要的一点是,我比较懒,还不喜欢上层程序的编写,让我因为想做界面去学MFC,实在不爽,因此就选择了Qt拉。

有朋友说过,使用Qt库构建用户界面其实并不难,甚至比wxWidgets更加简单,稍加学习即可入门。它还是跨平台的,而其开源版同样是免费的,更要命的是开源版在Windows下仅支持MinGW,简直是为我们的需求订做的。——在这里需要重申,使用RAD的目的不是让你学会懒惰,去荒废 Windows或Linux的GUI SDK,而仅仅是一种快速建立demo的手段。C++下的GUI库并不少,之所以选择Qt,不为别的,只因为它提供了最好的RAD。当然这只是个小的推荐而已,C++领域图形库众多,每人都有自己的需要和喜好,并不想将“自由软件圣战”等口水引到这里^^。

获得随机数的方法探讨

很多朋友在编程的时候都会遇到要使用随机数的情况。怎样获得在一定范围内的随机数呢?如果是有特殊要求的随机数呢?下面是关于这个的详细探讨,

理解c中的序列点

让我们来看看下面的代码: int i=7; printf(“%d\n”, i++ * i++); 你认为会返回什么?56?no。正确答案是返回 49?很多人会问为什么?难道不该打印出56吗?在ccfaq中有非常详尽的解释,根本原因在于c中的序列点。

向数据文件读写结构

如果遇到向数据文件读写结构的问题,会让很多编程人员都非常头疼。一般来说,最简单,最常用,最清晰的办法是用 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%可移植的。