积累日常生活的点滴,开发过程的心得。

发布Sqlite Developer 0.55

发布Sqlite Developer 0.55

特点

+支持Sqlite 语法高亮
+可视化查询创建器

+数据库Database Schema设计器

+支持数据导出为word, xml, html, csv, excel

antlr之Hello World

最近要写一个SQL的Parser,因此需要一个Parser代码生成器,以前用过Lex 和 Yacc,但是缺点是生成的代码可读性非常差,而且生成的都是C的代码,重用性不好,所以这次准备用Antlr来实现.

* 首先下载antlr2.75,安装运行
* 然后安装JRE1.42
* 然后添加classpath c:\antlr\275\bin
* 编写一个简单的test.g

class P extends Parser;

startRule
: n:NAME
{printf("name:%s ", n->toString().c_str());}
;

class L extends Lexer;

// one-or-more letters followed by a newline
NAME: ( 'a'..'z'|'A'..'Z' )+ NEWLINE
;

NEWLINE
: '\r' '\n' // DOS
| '\n' // UNIX
;

* 运行命令java antlr.Tool test.g 将生成parser的java代码
* 要生成cpp的代码只要在test.g文件中添加一个选项就可以了
options {

将一个消息处理过程绑定到多个控件

在VC中,我们使用ClassWizard可以创建指定控件的消息处理函数,但是如果界面上有多个控件要处理时,需要绑定多个消息处理过程,如果消息处理过程完全一下的情况下,会造成大量的代码冗余,幸好VC中提供了基于控件ID范围设定的消息宏,可以将一个消息处理过程绑定到多个控件上,比如ON_CONTROL_RANGE。vc中只定义了一些常用的基于范围的消息绑定宏,特殊的消息范围宏,我们可以自定义来实现,下例就是一个将EN_SETFOCUS消息处理函数绑定到多个控件的宏。

用于调试的两个宏

VC里面提供了两个可以在调试期间获得当前行号,当前单元名称的宏, __FILE__, __LINE__,可以自定义一个异常,将行号,单元名传给异常,俘获异常后,将信息输出到日志中,可以很方便的用于调试.

不要在构造函数和析构函数中抛出异常

原因好像挺简单的,C++中没有对构造和析构函数如何处理异常作出定义,每种编译器的实现都可能不同,在构造和析构函数中产生的异常很可能导致程序崩溃.

真土,头一回发现Java的方法全都是虚方法

难怪那么慢,C#则支持非虚的方法.

标准模版容器访问的越界检查问题

今天,检查一个程序Bug时发现了一个没想到的问题,C++的标准模版库为了追求效率,在使用下标访问容器内元素时,没有对容器的size作越界检查,因为对于不同类型的容器,size函数并不是一个常数时间的操作,结果导致我已经Clear的一个容器,仍然可以通过下标正确访问到已经从容器中删除的元素.折腾了我一个个小时来确认Bug的原因.

 

Boost字符串处理库

lexical_cast实现字符串和基础数据类型之间的转换。

format用于字符串格式化。

定制自绘画的ComboBox高度

今天写了一个自绘画的ComboBox,结果发现一个以前从来没有注意的问题,就是设定了OwnerDraw样式的ComboBox的高度被系统自动设定为比普通的ComboBox大那么几个像素,重载MesureItem方法,定制列表项目的高度也不解决问题,最后发现只要重载PreSubclassWindow方法,给ComboBox发一个CB_SETITEMHEIGHT的消息就可以了,代码示意如下

使用标准模版库的流处理CSV文件

标准模版库中的文件流支持>>操作符号重载,可以方便的实现数据导入和类型转换,但是有一个比较弱智的限制就是输入的字符串只能用空格分割,不支持逗号分割,今天处理csv文件,用了一个比较龌龊的方法就是,将所有的逗号先替换为空格,然后导入,代码示意如下

  1. ifstream fRoad(szFile.c_str());
  2.  
  3. if (!fRoad)
  4. throw e_open_file_fail;
  5.  
  6. entities.clear();
  7.  
  8. char buffer[0xFF] = {0};
  9.  
  10. while (!fRoad.eof())
  11. {
  12. fRoad.getline(buffer, sizeof(buffer));
  13. string szLine=buffer;
  14. replace_if(szLine.begin(),szLine.end(), //range
  15. bind2nd(equal_to<char>(),','), ' ');
  16. istringstream ssLine(szLine);
  17. road_entity entity;
  18.  
  19. ssLine >> entity;
  20. .....
  21.  
  22. istringstream& operator>>(istringstream& ss, road_entity& e)
  23. {

同步内容