以上是研究AGG的源码及注释。
2008年10月17日星期五
2008年10月12日星期日
整理一下,做一个备份(有些库看名字就知道了,但是有些需要用google回忆下)
| 名字 | 说明 |
| aaronsziputils.zip | |
| agg-2.5.zip | |
| cximage600_full.zip | |
| dirtyrectdomo.rar | 云风blog上说明的脏矩形算法 |
| eva-0.4.1.tar.bz2 | |
| fetionfx.rar | 飞信 |
| GuiPreview_Regex.rar | |
| lines.tar.gz | |
| lua-5.1.3.tar.gz | |
| lumaqq.net(vs2005).rar | |
| mapnik_src-0.5.0.tar.gz | |
| pegtl-0.29.tar.gz | |
| QQ.NET.rar | |
| SDL-1.2.13.zip | |
| SDL-devel-1.2.13-VC6.zip | |
| slviewer-src-Braqnch_1-20-13-Viewer-r91658.zip | |
| tcc-0.9.24.tar.bz2 | |
| tinyxml_2_5_3.zip | |
| TransparentBltTest.zip | |
| VFS.rar | |
| yard-1.4.1.zip | |
| ZipTest_src.zip | |
| zlib123.zip | |
| HMIDesignEditor | |
| scompiler | |
| tcpmp.src.0.72RC1 | |
| yard-1.4.1 |
2008年9月25日星期四
首先阅读Boost源码剖析之:容器赋值-assign
咋一看这段代码,
| std::vector<int> i_v; i_v += 1, 2, 3, 4, 5; |
首先i_v+=1, 这段要实现就必须重载+=操作符号。实现的代码大概是这样的。
| template<class V, class A, class V2> void operator+=(std::vector<V,A>& c, V2 v) { return c.push_back(v); } |
接下来是解决输入2的问题。 如果上一步的操作返回为空,就不行了,这样的话就连接不起来了。如果返回std::vector对象呢,则中间缺少操作符。所以要对上面的重载操作做一些手术,人工添加个()重载操作,这样就多一层函数的嵌套。
| template<class V, class A, class V2> void operator+=(std::vector<V,A>& c, V2 v) { return push_back(c)(v); } push_back返回的类具有()重载操作,可以这样实现: class class_has_optemplate< class C > { operator()(V2 v) { this.push_back(v); } } |
| // assignment.cpp : Defines the entry point for the console application. // // #define ASSIGN_LIB #include "stdafx.h" #include <vector> #include <map> #include <string> using namespace std; #ifdef ASSIGN_LIB #include "boost/assign/std/vector.hpp" #include "boost/assign/list_inserter.hpp" using namespace boost::assign; #endif #ifndef ASSIGN_LIB template<typename C1> class list_inserter { public: C1& c_; list_inserter(C1& c) : c_(c) { } template<class T> void operator()(T r)//这里存在问题,连接不上!!没有返回list_inserter对象 { c_.push_back(r); } }; template<class C1> list_inserter<C1> make_list_inserter(C1 &c) { return list_inserter<C1>(c); } template <typename C > list_inserter<C> push_back(C& c) { return make_list_inserter(c); } template <typename V, typename A, typename V2> list_inserter<std::vector<V, A>> operator+=(std::vector<V, A>&c, V2 a) { return push_back(c)(a); } #endif int _tmain(int argc, _TCHAR* argv[]) { std::vector<int> i_v; i_v += 2; #ifdef ASSIGN_LIB i_v += 1, 2, 3, 4, 5; printf("%d", i_v.size()); map<string, int> months; insert(months) ("January", 31)("February", 28); #endif return 0; } |
| 为完整解决上面的问题,list_inserter还需要实现逗号的重载类和一个封装好的FUNCTION函数,该函数的功能是计算结果,然后有list_inserter返回本身的对象。 |
2008年9月24日星期三
最近准备在完成了正则表达式引擎之后,好好的读一下Boost.spirit 的源代码。
可惜前面一项工作不知道什么时候完成呢。需要设计好的数据结构,使用合理的算法,清晰的思路来解决。
MS Blogger没法写过多的代码,否则就上传不了。。。工作还有许多啊
在网上找到一些资料,还没看呢
http://www.cs.princeton.edu/courses/archive/spr05/cos126/lectures/
2008年9月9日星期二
2.3 The Chomsky hierarchy of grammars and languages
这里涉及到几个概念:上下文无关文法 ,BNF (Backus-Naur Form)(巴克斯-诺尔范式)经常用来表达上下文无关文法。 这里还要补充一个类型4 Finite-choice grammars.在该文法的右边不存在非终结符。
| 自动机理论: 形式语言和形式文法 | |||
|---|---|---|---|
| 乔姆斯基层级 | 文法 | 语言 | 极小自动机 |
| 类型 0 | 无限制 | 递归可枚举 | 图灵机 |
| n/a | (无公用名) | 递归 | 判定器 |
| 类型 1 | 上下文有关(content-sensitive) | 上下文有关 | 线性有界 |
| n/a | 附标 | 附标 | 嵌套堆栈 |
| n/a | 树-邻接 | 适度上下文有关 | 嵌入下推 |
| 类型 2 | 上下文无关(content-free) | 上下文无关 | 非确定下推 |
| n/a | 确定上下文无关 | 确定上下文无关 | 确定下推 |
| 类型 3 | 正则(Regular grammars) | 正则 | 有限 |
| 每个语言或文法范畴都是其直接上面的范畴的真子集。 | |||
2008年9月6日星期六
2008年9月5日星期五
今天用了大半天调试了一个BUG, 是这样的:
Command not processed, because id is 0x1798
Data Abort: Thread=82d07480 Proc=801e6610 'gwes.exe'
AKY=00004009 PC=0001f824(gwes.exe+0x0000f824) RA=0001f81c(gwes.exe+0x0000f81c) BVA=0800000d FSR=00000003
TLSKERN_NOFAULT set... bypassing kernel debugger.
Data Abort: Thread=82d8c904 Proc=801e6610 'gwes.exe'
AKY=00002009 PC=0001f824(gwes.exe+0x0000f824) RA=0001f81c(gwes.exe+0x0000f81c) BVA=0800000d FSR=00000003
TLSKERN_NOFAULT set... bypassing kernel debugger.
Data Abort: Thread=837e24a8 Proc=801e6610 'gwes.exe'
AKY=00000049 PC=0001f824(gwes.exe+0x0000f824) RA=0001f81c(gwes.exe+0x0000f81c) BVA=0800000d FSR=00000003
TLSKERN_NOFAULT set... bypassing kernel debugger.
最后调试出来是在::PostMessage(HWND_BROADCAST, WM_COMMAND, wparam, lparam);
(这边我传递的lparam不是0,而是RADIO msg.)
后出错的,在GOOGLE了之后,貌似WM_COMMAND的lparam本来是控件ID。
具体原因还要进一步研究。
ps:LL语法分析做的太慢了!. 完了之后结合ParsingTechs书,做一个正则表达式引擎,当然呀在条件允许的情况下了。
Command not processed, because id is 0x1798
Data Abort: Thread=82d07480 Proc=801e6610 'gwes.exe'
AKY=00004009 PC=0001f824(gwes.exe+0x0000f824) RA=0001f81c(gwes.exe+0x0000f81c) BVA=0800000d FSR=00000003
TLSKERN_NOFAULT set... bypassing kernel debugger.
Data Abort: Thread=82d8c904 Proc=801e6610 'gwes.exe'
AKY=00002009 PC=0001f824(gwes.exe+0x0000f824) RA=0001f81c(gwes.exe+0x0000f81c) BVA=0800000d FSR=00000003
TLSKERN_NOFAULT set... bypassing kernel debugger.
Data Abort: Thread=837e24a8 Proc=801e6610 'gwes.exe'
AKY=00000049 PC=0001f824(gwes.exe+0x0000f824) RA=0001f81c(gwes.exe+0x0000f81c) BVA=0800000d FSR=00000003
TLSKERN_NOFAULT set... bypassing kernel debugger.
最后调试出来是在::PostMessage(HWND_BROADCAST, WM_COMMAND, wparam, lparam);
(这边我传递的lparam不是0,而是RADIO msg.)
后出错的,在GOOGLE了之后,貌似WM_COMMAND的lparam本来是控件ID。
具体原因还要进一步研究。
ps:LL语法分析做的太慢了!. 完了之后结合ParsingTechs书,做一个正则表达式引擎,当然呀在条件允许的情况下了。
订阅:
博文 (Atom)
