博文

目前显示的是 2004的博文

利用libcurl访问网页

#include <tchar.h>#include <curl/curl.h>int _tmain(int argc, _TCHAR* argv[]) { CURL* curl; CURLcode res; curl = curl_easy_init(); if(curl){ curl_easy_setopt(curl,CURLOPT_URL,"http://localhost/snnn/index.html"); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } return0; }

开发手记

学了一年半的c++,整天吼着说什么这不是面向对象,那不符合c++ standard,真正准备写一个类出来的时候,才明白自己是多么的无知。
我早就准备尝试做做符号运算,苦于不知道用来存储表达式的树该怎么来写,一直搁浅。
从小事做起,我想先从多项式做起,这个很简单。
于是,今晚开始动工!
嗯,先设计第一个类,MonomialExpr,单项式表达式。
首先,最核心的两个数据成员,次数和幂数,想了想,还是设为了private.但愿我有能力把它完全封装在内。
什么类型呢?double?为了以后扩展需要,还是不要声明类型了。我想等我再学会点Blitz++后试试那些huge 的浮点型。我可不想告诉我的用户:“对不起,c++的内置数据类型最大只为double,所以此程序在您的32位x86 PC机上最大只能处理64位的数据!”
private:
COEFFICIENT_TYPE coefficient_;
EXPONENT_TYPE exponent_;
Ok,下来怎么处理这两个类型?按我以前的方式,都是放在一个config.h中,用宏来定义
#define COEFFICIENT_TYPE double
呵呵,不是说c++中的模板除了有点像类外就是宏吗?好吧!试试,复杂的类型我不会写type_traits,这些简单的double,float我还是会处理的。
好,加上默认构造函数,拷贝构造函数,析构函数,它大致就是这样了/*! \class MonomialExpr * */ template class MonomialExpr{ public: /// Default constructor;MonomialExpr(){ }; /// construct by a given coefficient and exponent; MonomialExpr(COEFFICIENT_TYPE coefficient,EXPONENT_TYPE exponent): coefficient_(coefficient), exponent_(exponent) { };/// Default destructor; ~MonomialExpr(){ }; /// Copy constructor MonomialExpr(const MonomialExpr&){ …

NTDLL.dll

打开NTDLL.dll,惊奇的发现原来CRT的许多基本函数居然都是在这里实现的!甚至包括qsort,ceil这样的函数,还有臭名昭著的strcpy(严格来讲,这只能怪使用者不当心)。堆的释放,进城管理,似乎都是在这。于是,我决定,仔细察看以下它,这1410个函数是做什么的用户模式的代码在调用系统内核函数的时候,首先把一个叫做system call number的数放在EAX中,把参数放在其它的寄存器中了。然后调用INT 2E中断。但是大部分应用程序并不需要直接这么做。通常都是在调用kernel32.dll等时由他们来调用INT 2E.内核模式的代码,做法稍微有点不同。他们通常调用由NTOSKRNL.EXE导出的NTDLL.dll中Zw开头的那一系列函数,比如ZwWaitForSingleObject, 反之,如果是用户级代码需要调用内核,就会利用INT 2E调用WaitForSingleObject.对于许多函数的批量调用,你会明显发现 Zw族要比Rtl族效率高很多。可惜ntdll.dll中的大部分函数都是undocumented.
对于一部分得知其定义形式的函数,可以这样调用:
1.先将NTDLL.DLL读入 LoadLibrary(TEXT("NTDLL.dll"))
2.利用GetProcAddress 获取其函数入口地址
3.利用得到的函数指针调用但是可以大致的分为几类吧
1 PropertyLengthAsVariant 它被排在了第一号,但是我就是不明白它是做什么的
2 Csr(configuration status register? Command and Status Register?)系列
CsrAllocateCaptureBuffer CsrAllocateMessagePointer CsrCaptureMessageBuffer CsrCaptureMessageMultiUnicodeStringsInPlace CsrCaptureMessageString CsrCaptureTimeout CsrClientCallServer CsrClientConnectToServer CsrFreeCaptureBuffer CsrGetProcessId CsrIdentifyAlertableThread CsrNewT…

刚刚对ie的一点新体会

首先,很多人一看见explorer出错,就以为是ie挂掉了,这是不正确的。因为它们完全是两个东西,explorer是windows的shell
而ie的全称是internet explorer,是windows的一个组件。
这两个东西应该是毫不相干的,因为当你关闭shell进程的时候,ie依旧可以正常工作.
之前我是这样认为的,但是,刚刚感觉又有点不对.于是准备细心探查下ie的究竟. 好吧,我们来看看ie由哪几部分组成 首先我们得明白,ie是windows的一个组件,而不只是一个简单的exe.
最上层是IEXPLORE.exe,它在ie被装载的时候初始化。(有人可能就会问了,什么时候ie会被装载呢?不就是点击IEXPLORE.exe的时候吗?不只是!其他的情况后面再说。)这个可执行程序,使用其他的组件来实现导航,历史记录管理,收藏夹,html的解析和呈现,等等。它自身只是提供一个windows窗体和它的工具栏。Iiexplore直接调用下层的shdocvw.dll. Shdocvw.dll,你可以把它看成就是一个dll宿主,它操控着下面的mshtml.dll(用来进行html的解析和呈现)以及其他的活动文档组件(Active Document component ),比如MS office,acrobat reader,这就是你为什么能在ie中直接打开doc和pdf文件.而Shdocvw.dll自身只提供浏览器的一些很基本功能,导航,链接置换,历史记录管理,收藏夹,等等.Shdocvw.dll其实也就是我们通常所说的浏览器控件.上面所说的链接置换(In-place linking)是指如果你点击一个链接,它会在当前窗口实例中打开该文档,而不是新建一个新的浏览器实例(如果我们只有mshtml控件,而没有它的话). 最后剩下Mshtml.dll,我想我不用说,大家也都知道它是做什么的了吧. 好,我们再来打开注册表来看下
来看下这个项
HKEY_CLASSES_ROOT\CLSID{871C5380-42A0-1069-A2EA-08002B30309D}
{871C5380-42A0-1069-A2EA-08002B30309D}是shell的一个命名空间(namespace),默认的打开方式是"C:\Program Files\Internet Explo…

用yacc做的一个简单的计算器

很简单,就是你输入
3+ 5 * 4 + (345 +2348) * (34 ^ 4)
它会告诉你
3598752871
用yacc做的
代码写的还是不够规范,中间有10个歧义是yacc帮我转换的
编译后整个发布包大小是65k,有需要的把你的邮箱留下%{ #define YYSTYPE double #include <math.h>#include <ctype.h>#include <stdio.h>intyylex(void); voidyyerror(charconst*); %} %token NUM %left '+''-' %left '*''/' %left UMINUS %% input: /* empty */ | input line ; line: '\n' | exp'\n' {printf ("\t%.10g\n",1);} ; exp: NUM { = 1; } | '('exp')' { = 2;} | exp'+'exp { = 1 + 3; } | exp'-'exp { = 1 - 3; } | exp'*'exp { = 1 * 3; } | exp'/'exp { = 1 / 3; } /* Exponentiation */ | exp'^'exp { = pow (1,3);} /* Unary minus */ | '-'exp %prec UMINUS { = -2;} ; %% /* The lexical analyzer returns a double floating point number on the stack and the token NUM, or the numeric code of the character read if not a number. It skips all blanks and tabs, and returns 0 f…

数组的安全复制

如果你要制作一个数组clone,你该怎么做?template <class T> T* NewCopy( const T* src,size_t srcsize, size_t destsize ) { assert( destsize >= srcsize ); T* dest = new T[destsize]; //可能会抛出bad_alloc异常 try { std::copy( src, src+srcsize, dest ); } catch(...) { delete[] dest; // delete 语句永远都不会抛出异常 throw; // 重新抛出异常 } return dest; }

汉化cygwin

默认情况下,cygwin的大部分命令是不支持中文的,比如ls,显示出来的都是问号
但是我们可以通过修改一些设置使它支持中文
首先,进入到用户主目录下
cd ~
然后找到.inputrc,没有的话就新建
在后面加上
set meta-flag on
set convert-meta off
set output-meta on
然后是.bashrc 或.bashprofile
export LESSCHARSET=latin1
alias ls=''ls --show-control-chars --color=auto''

在cygwin安装ace

解压cyper@snnn /cygdrive/f/temp $ gunzip ACESRC.tar.gzcyper@snnn /cygdrive/f/temp $ tar xf ACESRC.tar查看下有些什么cyper@snnn /cygdrive/f/temp $ cd ACE_wrapperscyper@snnn /cygdrive/f/temp/ACE_wrappers $ ls
ACE-INSTALL.html Makefile ace-config.1.in m4
ACE-install.sh Makefile.am ace-config.in man
ACEXML PROBLEM-REPORT-FORM aceConf.sh.in netsvcs
ASNMP README apps os-patches
AUTHORS THANKS bin performance-tests
COPYING TODO docs tests
ChangeLog VERSION etc websvcs
ChangeLogs acconfig.h examples
FAQ ace include下面我做下各个目录里是什么ace: 含有ACE工具包的源码bin:很多有用的实用程序,以后再说, 你现在可以不管他apps:含有很多基于ACE的实用程序,非常推荐你好好看看.不同于examples,这里面都是非常经典而短小精悍的实用程序,比如JAWS 就是一个小型的HTTP服务器,你可以拿它来代替iis,不过要它支持asp就得自己写插件了.Gateway,顾名思义,路由,不要在问我代理服务器该怎么做了,这有路由!而且这些代码的可重用度非常高.简直就是一个小型的库doc:文档,太少了,有和没有没区别,而且你还可以用doxygen自动生成一个examples:不用说了吧include/makeinclude 含有ACE的所有的构建系统文件test:测试,你可以用来测试下你的ACE装好了没有下面开始做配置有人可以问我为什么不讲windows或linux,而要讲cygwin呢, 很简单,那些平台太通用了,配置文件基本你就不用管,傻瓜型安装设置环境变量ACE_ROOTcyper@snnn /cygdrive/f/temp/ACE_wrappers $ export ACE_ROOT=pwd在ACE_ROOT…

Emacs 是什么的简称?[转载]

E. M. A. C. S.
Emacs Makes A Computer Slow
Escape Meta Alt Control Shift
Emacs Makers Are Crazy Sickos
Emacs Makes All Computing Simple
Emacs Makefiles Annihilate C-Shells
Emacs Manuals Always Cause Senility
Emacs May Allow Customized Screwups
Emacs Manuals Are Cryptic and Surreal
Eventually Munches All Computer Storage
Eight Megabytes And Constantly Swapping
Elsewhere Maybe All Commands are Simple
Excellent Manuals Are Clearly Suppressed
Emacs May Alienate Clients and Supporters
Except by Middle Aged Computer Scientists
Extended Macros Are Considered Superfluous
Every Mode Accelerates Creation of Software
Each Manual''s Audience is Completely Stupefied
Exceptionally Mediocre Algorithm for Computer Scientists
Easily Maintained with the Assistance of Chemical Solutions
Eradication of Memory Accomplished with Complete Simplicity

关于!=与^

a^b,当且仅当a=b的时候返回值为0.因此,在很多情况下,我们可以用^来代替!=
但是,二者的效率如何呢?
为次,我做了以下测试
测试平台:window XP sp1
编译器:VC++.net 2002
程序原代码如下:#include <iostream>int _tmain(int argc, _TCHAR* argv[]) { inta(0),b(0); std::cin>>a>>b; if(a != b) b=1; if(a ^ b) b=2; std::cout<<b<<std::endl; return0; } 在未开启优化,项目属性使用debug时,编译后所得的机器代码为
int _tmain(int argc, _TCHAR* argv[])
{
00433350 55 push ebp
00433351 8B EC mov ebp,esp
00433353 81 EC D8 00 00 00 sub esp,0D8h
00433359 53 push ebx
0043335A 56 push esi
0043335B 57 push edi
0043335C 8D BD 28 FF FF FF lea edi,[ebp-0D8h]
00433362 B9 36 00 00 00 mov ecx,36h
00433367 B8 CC CC CC CC mov eax,0CCCCCCCCh
0043336C F3 AB rep stos dword ptr [edi]
int a(0),b(0);
0043336E C7 45 F8 00 00 00 00 mov dword ptr [a],0
00433375 C7 45 EC 00 00 00 00 mov dword ptr [b],0
std::cin>>a>>b;
0043337C 8D 45 EC lea eax,[b]
0043337F 50 push eax
00433380 8D 4D F8 lea ecx,[a]
00433383 51 push ecx
00433384 B9 BC 06 4A 00 mov ecx,offset std::cin (4A06BCh)
00433389 …

doxygen使用手记

doxygen,一个从代码自动生成文档的小工具,很多类库的官方文档都是用它生成的
之前以为它和CVS一样神秘,很难用
今天试了试,真的是再简单易用不过了
doxygen 的window 版可以从
ftp://ftp.stack.nl/pub/users/dimitri/doxygen-1.3.9.1-setup.exe
下载到。linux版一般系统安装盘上就有
使用方式
到你的源代码的目录下
输入
doxygen -g
它会自动生成一个名为Doxyfile的配置文档
然后输入
doxygen Doxyfile即可(也可以直接输入 doxygen)
写代码的时候遵循现有的那些通用的c++规范就行了,唯一要注意一点的就是写注释的时候
要以///开头,而不是以前的//
因为我们通常有个习惯,//来注释掉暂时不用的代码
呵呵,当然,doxygen的功能相当丰富,更多的更详细的配置,就需要慢慢学了
当然,它有图形界面,但是我不喜欢用,速度还没有命令行快

利用GNU 开发工具套件开发c++应用程序

开发c++应用程序你会选用什么开发工具?Windows下用的最多的可能就是vc++了,或者CBuilderX,但是,我很穷,我没有几万人民币去买这些昂贵的开发组件,如果你有,恳请你不要忘了给我等难兄难弟施舍点。linux下,Kdevelop,大名鼎鼎(windows下也有,我也在用,不过不大稳定),再有就是后起之秀eclipse(无所不能,平台无关).而这两者,说出来你可能不信,都是基于我现在要讲的GNU development tools。
如果你对GNU还不大了解的话,请访问其官方网站(www.gnu.com).
这一套GNU development tools包括Automake, Autoconf, Libtool, Make, Emacs, Texinfo 和 GNU C and C++ 编译器(gcc系列).这些工具都是免费的,跨平台的(unix,linux,windows).
一.安装
1。linux\unix
既然是GNU嘛,当然就得遵守GNU规范了。
(1)下载。http://ftp.gnu.org/gnu/,或者你也可以在其主页上选择其他的镜像从那下载,理论上来讲,近点的镜像应该会更快
下面假设有一个软件包名为foo-1.0.tar.gz,以之为例
(2)解压 (unpack)
% gunzip foo-1.0.tar.gz
% tar xf foo-1.0.tar
(3)配置 (Configure)
% ./configure
注意:查看下有没有error
(4)编译 (compile)
% cd foo-1.0
% make
如果这个软件包很大的话,你可以先去喝杯咖啡.^_^
编译完后,你可以测试一下编译是否成功
% make check
(5)安装 (install)
% su
# make install
上面的步骤看起来很简单,用过linux的人都应该很熟悉,然而下面的核心就是,如何让你的软件包也遵守这样的规范.遵守规范的一大好处就在于,即使你不写INSTALL,其他人也可以很轻松的安装并使用,而且,你还可以不负责任的直接用下面要讲的工具自动生成一个安装文档交给用户.
2.windows
如果你的windows 下有cygwin的话,那就很简单了,直接下载cygwin中相应的软件包,然后和以前一样点安装就行了。
如果没有的话,那么你可以在www.sourceforge.net中找到GN…