Archive

Posts Tagged ‘C’

[翻译]使你的C/C++代码支持Unicode

April 22nd, 2009 yaker No comments

译文见 http://www.i18nguy.com/unicode/c-unicode.zh-CN.html
原文见 http://www.i18nguy.com/unicode/c-unicode.html

偶然读到i18nguy上的这篇文章的英文原文,虽然是几年之前的文章,但是觉得作为一个简明手册还是很有价值的。于是给文章的作者Tex Texin先生发了封邮件,得到texin先生的支持后便翻译了一下。

文章并不长,没有使用OmegaT这种辅助翻译的利器,只用了网页编辑器(Kompozer)。刚刚翻译完的时候,自己读了一遍,觉得有些地方很生硬,又润色了一下。之后看了下翻译相关的书籍,对翻译工作的艺术性有了点切身的了解。

Tex Texin先生是XenCraft公司首席架构师及全球化咨询师。Unicode Bulldog Award获得者(2004)。关于他更详细的介绍见这里

Categories: translation, unicode Tags: ,

使用C语言解析bmp文件

March 1st, 2009 yaker No comments

bmp.zip

昨天整理工程目录时翻出来的小东西。一个小的函数库,可以对bmp文件做一些简单的操作。打开bmp图像(支持2色,256色,24bit),保存文件(只支持256色图片),获取原始的缓冲区(raw_buf),以及高度和宽度。这些代码最早是clayman所写的C++代码,yeldsd和我修改了一点memory leak的问题。“种子杯”的时候把接口改成了C语言的提供给参赛者。常见的语言中也有各种库来支持这种简单(并且多少有点过时的)格式,在只能使用C语言的情况下这个utility才有用。

bmp的文件格式相对比较简单,解析起来并不难,只是注意一下对齐的问题就可以了。解析大概需要不超过300行的C语言代码。具体可以参考BMP_file_format(wikipedia)。项目里用的解析图片的库其实很多也都是C语言的。e.g. libjpeg & libpng。

Categories: programming Tags: ,

GUI工具简介讲稿

May 5th, 2008 yaker 6 comments

GUI工具简介讲稿pdf版

前几天做了这样一个ppt,转成pdf放上来,有兴趣的可以看一下.简要的介绍了目前C++语言中所使用的GUI解决方案,ppt是英文的,不过没什么难的单词.

Categories: programming Tags: ,

野人与修道士问题的求解

March 2nd, 2008 yaker 4 comments

源程序下载:33.CPP
这个野人与修道士问题是上个学期在算法课本上看到的,当时写了个程序,但是没发到blog上来。一直没忘记这个事情,但是总是没空,两个多月后,我发上来了。

野人与修道士的问题:
河的左岸有3个野人和3个修道士以及一条小船,修道士们想用这条小船把所有的人都运到河的右岸,但又受到以下限制:
1、修道士和野人都会划船,但船一次只能载2人;
2、在任何岸边,野人数不能超过修道士数,否则修道士将会被野人吃掉。
假定野人愿意服从任何一种过河的安排,请规划出一种确保修道士安全的过河方案。

我搜索了一下,发现有人在纸上推断出来了,不知是真是假。我和zhichao lee以及heng zhao推导过一次,觉得用纸笔推断难度比较大,正向推导或者反向推导5层左右就混乱了。

我的思路如下:基本思想使用状态机。一侧的野人数目和修道士数目以及船在哪一岸共同构成一种状态,分析一下会发现合法的状态只有17种,这个问题的求解此时便类似于寻路问题,已知两个结点和所有节点间的连接关系,求两节点之间的一条路径(最短路径),简单的进行广搜即可。

合法的状态举例:

State allStates[] = { State(3, 3, 1), // 左岸3修道士,3野人,船在左岸
// 0,0,1不存在
State(2, 2, 1),
State(1, 1, 1),
State(3, 0, 1),
State(0, 3, 1),
State(3, 1, 1),… }


图1 执行结果(h表示修道士,s表示野人)
Categories: programming Tags: ,

使用CppUnit测试MFC应用程序

February 12th, 2008 yaker 1 comment

这里有一份样例工程(Visuao Studio.Net 2003)。
示例代码下载:TestExample.zip
关于测试工程的建立可以参阅vckbase 的文档库的一篇文章
http://www.vckbase.com/document/viewdoc/?id=1258
首先说一下用CppUnit进行测试的原理。被测试的语句放在CPPUNIT_ASSERT…这样的语句里。测试工程构建程序后,运行测试程序时将检查CPPUNIT_ASSERT里的语句将被执行。一般来说要测试的代码通常不来自于测试工程,这也是我的文章里建立了两个工程的原因。
通常的做法是将要测试的工程生成库文件(.lib),然后链接到测试工程中。要注意的就是工程属性的设置,静态库的一些属性一定要与测试工程一致。以Visual Studio的工程为例说明以下,使用其它IDE生成的工程类似。
使用方法:使用配置管理器设置当前的生成配置为”Test”,依次生成MainPrj和TestPrj工程即可。


图一 设置配置管理器

Test配置下的一些设置。
解决方案下有两个工程,分别为MainPrj和TestPrj(主工程和测试工程)。
主工程
改为生成静态库文件
生成路径为”../TestPrj”
链接生成选项为”$(OutDir)/$(ProjectName).lib”
测试工程
附加包含目录添加”../contrib/inc”
附加库目录添加”../contrib/lib”
附加库添加cppunitd.lib和MainPrj.lib
如果使用.Net 2003或者更低的版本的Visual Studio开启动态类型识别。
补充

如果想测试类的私有方法和保护方法可以在主工程相应文件里添加测试工程里的类的友元。

class Example
{
public:
    friend class TestExample;
    ....
};
Categories: C++ Tags: ,

用wstring存取xml中的unicode字符

November 18th, 2007 yaker 3 comments

unicode实际上是个很复杂的主题,至少不是两个字节那么简单(实际上utf-8是变长的,utf-16也有代用对的概念).有兴趣可以参考一下《国际化软件开发》这本书,我所了解到的关于unicode的知识多数是从这本书上看来的,最早知道unicode是《Joel说软件》里面有一章提到,说:作为一个程序员,unicode是你必须知道的东西.

附带的xml文件是utf-8编码的,utf-8的编码是互联网上常用的格式,用utf-8还有一个好处就是在我的ubuntu系统上我仍然可以查看.要记住,windows操作系统的基本文本表示格式是utf-16.所以用库(我用的TinyXml)函数将xml读出后得到的实际上是utf-8编码的字符,不能在windows程序中直接使用.首先要转换一次,使用MultiByteToWideChar函数(Windows API).转换前要自己创建一个字符缓冲区,这个缓冲区的管理也是个麻烦问题,谁来释放内存呢?因为转换后的字符串要返回的,这样每个调用者都负责自己清理,实际上是很麻烦的事情.我现在的做法是用STL里的string,确切来说是wstring.这样会损失一些效率(如果是引用计数机制的实现的话就没有什么效率损失了),主要的好处还是在于不同部分的代码职责明确.

将utf-8编码的字符串转换为windows内部的unicode编码的代码如下:

using std::wstring;
 
wstring utf_to_ws(const char *utf8)
{
    int len = MultiByteToWideChar(CP_UTF8,0,utf8,strlen(utf8),NULL,0);
    if (len == 0)
        return wstring(TEXT(""));
    TCHAR *unicode = new TCHAR[len+1];
    unicode[len]=L'\0';
    MultiByteToWideChar(CP_UTF8,0,utf8,strlen(utf8),unicode,len+1);
    wstring ws(unicode);
    delete[] unicode;
    return ws;
}

P.S.
如需将Unicode字符转换为ASCII格式,参见编写国际化软件的一些Tips

Reference
1.unicode科普
http://baike.baidu.com/view/40801.htm
2.我所知道的一些
windows操作系统的基本文本表示格式是utf-16.在windows处理任何基于代码页的数据都首先转换为UTF-16,并用unicode处理,在windowsAPI中例如MessageBox有两个版本,MessageBoxA和MessageBoxW,分别代表ANSI和宽字符版本,处理ANSI字符时首先转换为unicode字符.
3.样例xml文件
查看文件

Categories: unicode Tags: , ,

C/C++ 轧名规则(name mangling)简介

August 18th, 2007 yaker 1 comment

[简介]
LINK 2019应该都见得比较多了,随便搜索一个得到一个
error lnk2019: unresolved external symbol
“__declspec(dllimport) public: virtual __thiscall osgviewer::viewer::~viewer(void)”
(__imp_??1viewer@osgviewer@@uae@xz) referenced in function _wmain
注意这个:__imp_??1viewer@osgviewer@@uae@xzf
这就是函数轧名后的结果
轧名解决了现代编程语言中的很多问题,比如重载等等。它为连接器提供了额外的信息,在编译器和连接器之间传递信息。
[C语言中的轧名]
非常遗憾的说,C语言中也有轧名。
wikipedia上的题目是:C name decoration in Microsoft Windows。因为轧名规则最早由微软提出,并且由其他各大编译器厂商普遍采用。注意这里name decoration和name mangling有同样的意思。实际上像C一样不支持重载的语言,并不怎么需要轧名。轧名在C语言中可以为函数提供额外信息,比如调用预定(calling conventions)。例如在Windows平台上支持三种调用约定。
比如以下函数

int __cdecl    f (int x) { return 0; }
int __stdcall  g(int y) { return 0; }
int __fastcall h(int z) { return 0; }
/* 使用32为编译器,轧名后的结果为 */
_f
_g@4
@h@4

P.S. 32位的汇编编译器下也是同样的
[C++轧名规则]
C++的轧名规则比不是那么统一,可以见reference1里的表格,各大编译器产品都有自己的标准
非命名空间里的函数,非成员函数
void h(int)
轧名结果:
GNU GCC 3.x _Z1hi  _Z1hi
Microsoft VC++ v6/v7 ?h@@YAXH@Z
见reference来得到更多信息,讲的Visual Studio下的轧名规则,写的很详尽,这里转帖一些

Preliminary Notes
These are surely inaccurate, but it’s a start. Mangled function names have the following pieces, in order:
1.a prefix of ‘?’
2.the function’s name (ignoring any class). Operators, constructors, and destructors are represented by two-character codes;
3.If the function is not an operator, the separator ‘@’ terminates the function name.
4.If the name is qualified by a class name:
1.For each qualifying class name from inner to outer, the encoded class name followed by the separator ‘@’.
2.the separator ‘@’
3.the value “Q”
else
1.the separator ‘@’
2.the value “Y”
5.the encoded function calling convention
6.the encoded signature of the function’s return value
7.the encoded signature of the function’s arguments
8.a suffix of ‘Z’

[Reference]
1.Name mangling(wikipedia)
2.C++ Name Mangling/Demangling
P.S. wikipedia能访问多方便啊

Categories: C++ Tags: ,

C++文档生成工具doxys详解

July 23rd, 2007 yaker No comments

Doxys是基于Doxygen 1.3.3的一款C++文档生成工具(注意,这并不代表它需要Doxgen的支持)
支持成员模板,模板特化(Doxygen不支持模板),风格更加C++,支持中文。
点击该文章的PDF版本

[需要的工具]
Doxys 0.95
本站下载
官网下载
HTML Help Workshop(非必须,用来生成CHM文档)
安装Visual Studio会带这个,比较大,不好上传,自己去找吧
Graphviz(非必须,用来生成图形)
下载地址
这个版本是2.12的官方版本,我用的居然是2.8不知道怎么回事
效果图

官方截图
使用方法
1.放置文件到一个文件夹下,双击运行在同一目录下得到配置文件
2.修改配置文件。doxys并不像doxygen一样附带了图形的配置程序(至少我没看到),要手动修改。
3.运行->CMD,切换到doxys所在路径,然后输入”doxys”(不包含引号),回车
4.文档就生成好了,当前目录下生成了一个doxys_docs目录,双击index.html文件
修改配置的详情:
“INPUT = “后填源文件所在的地方,这个最重要,要不然给谁生成文档啊…
“PROJECT_NAME”代表工程名
暂时有这些就够了,配置并不如doxygen多

进一步制作文档
1.生成chm文件
把”GENERATE_HTMLHELP1″的值改为YES

重新生成一次,当前目录下会得到扩展名为hhp的文件,如果已经安装”HTML Help WorkShop”,双击打开,File->compile编译得到chm文件
2.生成图(包括类图,包含关系图等)
安装graphviz工具,修改doxys的配置文件doxysfile,在”DOT_PATH”一栏填入graphviz程序的安装地址(注意,一定要填到”\bin”那一层。再次生成文档

注意:
1.我的代码(证明支持模板)

/// template class, tested by yaker
template <typename T>
class TestDoxys
{
public:
    /// member template, if it can, i appreciate
    template<typename X>
    TestDoxys(X begin, X end)
    {
        vt_(begin, end);
    }
    void DoSth();
private:
    std::vector<T> vt_;
};
 
///template function
template <typename T>
void TestDoxys<T>::DoSth()
{
    std::cout << vt_[0]; << std::endl;
}
 
/// template specialization, my god, doxys even support it
template<>
class TestDoxys<double>
{
    void Dosth()
    {
        std::cout << "double" << std::endl;
    }
};

2.statics的说明
生成html页面时会生成stastics页面,统计注释率以及未注释文件。但是生成chm文件时并不会被添加进去,手动修改一下hhp文件即可。
附官方简要介绍:
DoxyS, an advanced C++ documentation tool.
DoxyS is a code documentation tool for C++/C. DoxyS strives to yield a very professional looking output, presenting the the code in a structured easy to navigate set of HTML pages. Easy to use: Just navigate to the root of your code directory and type doxys.
Currently it runs on Windows and Linux, but should be quite portable.

Main features
* Generated output reflects the code directory structure.
* Layers of abstraction with heavy use of overview tables providing names and brief descriptions of classes, functions etc. Inspired by Microsoft documentation.
* Wiki like syntax for writing directory level documentation and related documentation pages or even design documents.

See all the features as well as the vision behind DoxyS on the Features page.
http://www.doxys.dk/doxys_homepage/index.html

Categories: C++ Tags: ,