博文

Visulal C++是什么?--兼谈其他 [推荐,转](2006-04-16 12:07:00)

摘要:Visulal C++是什么?--兼谈其他  [转]
weizhisheng 原作 安安:本文学习团队blog上转的,这篇文章写的很不错,挺辩证的,表示感谢并推荐给网友。

这个问题很奇怪吗?大概是。不过,当我又看到有人发表诸如“Windows/Office是VC编写的”或者“VC是无所不能的”这种高论,我就禁不住这样问自己。 Visual C++究竟是什么?你平常在其中工作的那个标记着“Microsoft Visual C++”的窗口,真的就代表Visual C++吗? 按照我的理解,Visual C++是一个开发工具包,它大概可以分成三个主要的部分: 1. Developer Studio,这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft Visual C++”,所以很多人理所当然的认为,那就是Visual C++了。其实不然,虽然Developer Studio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。我们也知道,Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio当成Visual C++, 它充其量只是Visual C++的一个壳子而已。这一点请切记! 2. MFC。从理论上来讲,MFC也不是专用于Visual C++,Borland C++,C++Builder和Symantec C++同样可以处理MFC。同时,用Visual C++编写代码也并不意味着一定要用MFC,只要愿意,用Visual C++来编写SDK程序,或者使用STL,ATL,一样没有限制。不过,Visual C++本来就是为MFC打造的,Visual C++中的许多特征和语言扩展也是为MFC而设计的,所以用Visual C++而不用MFC就等于抛弃了Visual C++中很大的一部分功能。但是,Visual C++也不等于MFC。 3. Platform SDK。这才是Visual C++和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它。大致说来,Platform SDK是......

阅读全文(3799) | 评论:3

Ajax服务三部曲:Why not,Why,When (转)(2006-04-10 19:07:00)

摘要:Ajax服务三部曲:Why not,Why,When
2006.04.10  来自:IT专家网   
安安:Ajax这个东西今年很热,到处都是,也转了一篇看看
 
  除了SOA这方面,也许还有另外一个方面让SOA成为最近几个月内的很多IT机构开发列表上的东西,那就是:Ajax。尽管这一方面更加倾向于在Web的可用性和专业设计上取得轰动效应,它的确带来了有效的跨入面向服务架构的领域的途径,我们将会在下面为你展示这些方法中的一部分。   Ajax是异步JavaScript和 XML单词的缩写(asynchronous JavaScript and XML)。正如Web服务开发者应该关于的一样,我们最应该的关注的技术是它的异步本质,以及随之而来的它的暗示了关于在一个语言可执行的环境的知识的JavaScript根源——命名为一个浏览器——并且也带来了在至少的一点来看,一旦能够运转之后它所产生的视觉效果(不是说我们要忽略这个最后的一点,而是图像设计师一般的比程序员更加熟练于解决这些问题)。   异步是描述的一个客户端和一个服务器端的交互的侧面,在这种交互中客户端不用等待服务器端——或者经常称之为的被阻塞——来等待接受从服务器端的响应。 消息传递系统,如MQ-Series, Tibco Rendezvous和类似于JMS的可编程API,都是比较早就采用异步机制的概念了的,但是现在Ajax正在以相同的方式来解决Web应用程序的问题。   Ajax 的异步概念来自于由浏览器进行的JavaScript 函数调用,并把结果返回给Web服务提供者或者服务端的应用程序。当你和一个Ajax应用程序交互的时候,那种可以更新展示在屏幕上的信息块的而不需要刷新或者重载它的所有内容的方式就是异步的,因为你能够在服务器端构建很多不同的调用而不需要在等待服务器响应的时候——客户阻塞——时刻的盯着一个空白的屏幕。   尽管正式那些Web2.0的支持者包括图像设计者和软件市场人员最经常的使用Ajax,很多开发出来的软件使得Ajax应用程序可以作为可复用服务的集合。   奇怪的是为一个Ajax应用程序提供的数据不需要由一个Web浏览器客户端的约束或者JavaScript语言来帮定,实际上一个最优化的Ajax设计将会确定的在服务端......

阅读全文(2263) | 评论:0

printf的输出格式(2006-03-30 22:38:00)

摘要: printf的输出格式        一直都怎么没有写技术文章,在我看来,写技术文章很有难度,就说那个文章的深度就不好把握,写简单了没什么意思,自己都知道了,都很熟练了还写什么写啊,又不是要出书;要是写深一点,就会发现很多知识其实都是一个无底洞,你越钻,发现需要考虑的问题越多,同其相关的知识也越多。因此,我比较少写技术的文章,本文也不是,只是一点小的总结(不完全,有待添加)。      
       其实我的学习曲线是从C++开始的,对于C的一些格式不是很了解,在C++里面,这种cout比printf安全也比较好用。不过这次有兴趣整理这个是因为老师上课的要求(非必须的)   #include<cstdio> int main()
{
    //for int
    int i=30122121;
    long i2=309095024l;
    short i3=30;
    unsigned i4=2123453;     printf("%d,%o,%x,%X,%ld,%hd,%u\n",i,i,i,i,i2,i3,i4);//如果是:%l,%h,则输不出结果
    printf("%d,%ld\n",i,i2);//试验不出%ld和%d之间的差别,因为long是4bytes
    printf("%hd,%hd\n\n\n",i,i3);//试验了%hd和%d之间的差别,因为short是2bytes
    //for string and char
    char ch1='d';
    unsigne......

阅读全文(14139) | 评论:4

windows application和MFC application原理(2006-01-15 15:57:00)

摘要:windows application的原理,其实主要就是依靠下面两个函数
WinMain(hInst, hPrev, ...)
{
   MSG msg;
   RegisterClass(...);//定义窗口类的属性和行为(其实就是窗口函数)
   CreateWindow(...);//产生窗口
   ShowWindow(...);//显示窗口
   UpdateWindow(...);//先传递WM_PAINT给窗口以驱动窗口的绘图操作
   while(GetMessage(&msg...)) //从消息队列中取得消息
   {
       TranslateMessage(...);//转换键盘消息        //下面这个函数用于分派消息,借助USER模块的协助。
       //当消息产生后,OS标志消息属于哪个窗口,而窗口类只有一个统一的窗口函数WndProc()
       //这个知道消息属于哪个窗口就知道应该调用哪个窗口函数
       DispatchMessage(...);
   }
   return msg.wParam;
} //窗口函数,是一个回调函数(就是由你设计的,但是不是你调用,而是为系统准备的)
WndProc(hwnd, msg, wParam, lParam)
{
   switch (msg)
   {
       //case后面一般包含消息处理函数
       case WM_CREATE: ...
       ......

阅读全文(5934) | 评论:1

学习C++和编程的50个观点[新的修订版](2006-01-14 03:54:00)

摘要: 旧的50个:http://blog.programfan.com/article.asp?id=7149 关于初学者如何学习C++,请见:http://blog.programfan.com/article.asp?id=1651 Kingofark's 50 Points of View About Learning C++ And Programming
关于学习C++和编程的50个观点
2003修订版 前 言 Long long time ago, on a topic far far away……是的,很久很久以前,kingofark无心之中写了一篇关于学习C++和编程的发牢骚的文章。未曾料到的是,这篇文章被N个好心的网络同胞流传至今,以至于作者得意忘形的将文章简称为Ks50PV,在浅薄和浮躁中麻醉自己。 某个醉生梦死的深夜,kingofark关上电脑,屋内一片墨黑,忽然发觉窗外的透彻和宁静。凑到窗前向天空看去,惊讶的发现白光——不,Agent Mulder,不是UFO——来自圆月。笔者联想到了牛郎织女——先辈们早已灰飞烟灭,只有故事被流传下来,因为被流传而流传。 一篇文章不能因为被流传而流传,被流传的不应该是流传本身。带着这样的冲动,kingofark又打开电脑…… 眼前给大家展现的,是经过kingofark重新审视,结合作者最新感受的修订版。其中有些条款彻底的更换或者修改了。这一方面反映了国内图书市场近年来发生的变化,另一方面也反映出:其实有些时候,无知的人说得最多。欢迎大家批评讨论甚至予以唾弃。 在这个修订版中,作者没有删掉旧的条款,仅在新旧条款前加了“新”、“旧”二字以示区别。新旧条款下面伴有作者的评论。 1. 把C++当成一门新的语言学习(和C没啥关系!真的。); 是的,我们仍然应该抱着这样一种心态来学习C++。前一段时间,C/C++ User’s Journal 上面有一连串关于C与C++关系的文章,Bjarne Stroustrup、Herb Sutter等几位C++领域的大师从不同方面讨论了C/C++今后发展的问题,颇为深刻。 看问题有深有浅,有高有低。我们不是大师,不要把C和C++说得好像自己的两个儿子。 水果刀是一种刀。瑞士军刀也是一种刀,但它何尝不是剪刀、起子、锯子......

阅读全文(6157) | 评论:1

C语言编程技巧汇萃(来自编程爱好者论坛)(2005-11-21 20:36:00)

摘要:C语言编程技巧汇萃(来自编程爱好者论坛) 编程函数集,详细内容如下:

读键盘扫描码
获取机器日期
将浮点数转化为字符串
清除屏幕
显示时间
打印一个矩形
砍掉字符串中所有空格
取子字符串
从文件中读取字符
字符串左靠齐
取左字符串
向文件写数据
取右字符串
打开或关闭光标
喇叭发声
时间延迟
正点报时
写整数于文件中
从文件中读取整数
报警
字符串右靠齐
字符串居中
删除子字符串
查找指定字符串
产生空格
产生字符串
砍掉字符串左边空格
砍掉字符串右边空格
显示一个字符串
定义屏幕颜色
显示提示窗口显示警告窗口
得到文件长度
窗口滚屏
扫描键盘
插入字符串
检测磁盘是否准备就绪
检测磁盘是否写保护
修改文件的某一行
成批拷贝文件
拷贝一个文件
建立目录
得到目录
得到文件名
任意两个正整数相加(<80位)
任意两个正整数相乘


注意:该函数集省略了不少TC标准头文件,读者使用时要自行添加。而且由于该函数集内部函数间有的有调用关系,读者拆卸时要谨慎。


/*编程技巧荟萃*/

/*从键盘中读取字符 功能:按下普通键时,返回其ASCII码 扫描码CODE=0*/
int INKEY(int *code)
{
int m;
while(!bioskey(1))/*可加入无按键时代码*/;
*code=bioskey(0);
m=*code*255;
if(!m) m=*code>>8;
*code=*code&255;
return m;
}

/*获取机器日期*/
int DATE(char *s,char type)
{
char dat[30];
int num;
struct tm *tblock;
time_t t;
t=time(NULL);
tblock=localtime(&t......

阅读全文(3940) | 评论:0

学习C++和编程的50个观点zz(2005-11-19 13:27:00)

摘要:学习C++和编程的50个观点zz 注:这篇文章早就流传了很久了,自我初学编程(02年)的时候我同学就转到我们班级的校友录上面,这里面的很多建议是比较好的,基本上都是不错,当然有一些说得比较绝对,这个不伤大雅,因此我也就不提出来了。大家学习以后慢慢会领悟其中的道理。仅以次篇献给各位初学者。 新版的50条:http://blog.programfan.com/article.asp?id=9618 关于初学者如何学习C++,请见:http://blog.programfan.com/article.asp?id=1651 1.把C++当成一门新的语言学习(和C没啥关系!真的。); 2.看《Thinking In C++》,不要看《C++变成死相》; 3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看; 4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言; 5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点; 6.会用Visual C++,并不说明你会C++(其实不会C++根本不可能真正学会Visual C++)。 7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书; 8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的; 9.看Visual C++的书,是学不了C++语言的; 10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!? 11.浮躁的人容易问:我到底该学什么;——别问,学就对了; 12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行; 13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀! 14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行; 15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人; 16.把时髦的技术挂在......

阅读全文(5651) | 评论:3

在linux 上安装gcc-3.3.1编译器[转帖](2005-11-07 13:08:00)

摘要:在linux 上安装gcc-3.3.1编译器[转帖]
    安装之前,必须保证系统中有cc或者gcc等编译器,并且是可用的,或者用环境变量CC指定系统上的编译器。如果系统上没有编译器,不能安装源代码形式的GCC 3.3.1情况,可以在网上找一个与你系统相适应的如RPM等二进制形式的GCC软件包来安装使用。本文介绍的是以源代码形式提供的GCC软件包的安装过程,软件包本身和其安装过程同样适用于其它Linux和Unix系统。   系统上原来的GCC编译器可能是把gcc等命令文件、库文件、头文件等分别存放到系统中的不同目录下的。与此不同,现在GCC建议我们将一个版本的GCC安装在一个单独的目录下。这样做的好处是将来不需要它的时候可以方便地删除整个目录即可(因为GCC没有uninstall功能);缺点是在安装完成后要做一些设置工作才能使编译器工作正常。在本文中我采用这个方案安装GCC 3.3.1在安装完成后,仍然能够使用原来低版本的GCC编译器,即一个系统上可以同时存在并使用多个版本的GCC编译器。
  按照本文提供的步骤和设置选项,即使以前没有安装过GCC,也可以在系统上安装上一个可工作的新版本的GCC编译器。
  1. 下载
在GCC网站上(http://gcc.gnu.org/)或者通过网上搜索可以查找到下载资源。目前GCC的最新版本为 3.3.1。可供下载的文件一般有两种形式:gcc-3.3.1.tar.gz和gcc-3.3.1.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。
  2. 解压缩
  根据压缩格式,选择下面相应的一种方式解包(以下的“%”表示命令行提示符):
% tar xzvf gcc-3.3.1.tar.gz
  或者
  % tar jxvf gcc-3.3.1.tar.bz2
  新生成的gcc-3.3.1这个目录被称为源目录,用${srcdir}表示它。以后在出现${srcdir}的地方,应该用真实的路径来替换它。用pwd命令可以查看当前路径。
  在${srcdir}/INSTALL目录下有详细的GCC安装说明,......

阅读全文(5244) | 评论:0

GCC 命令行详解[转帖](2005-11-07 13:01:00)

摘要: GCC 命令行详解[转帖]
1、gcc包含的c/c++编译器 gcc、cc、c++、g++
gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译 2、gcc的基本用法 gcc test.c这样将编译出一个名为a.out的程序
gcc test.c -o test这样将编译出一个名为test的程序
-o参数用来指定生成程序的名字 3、为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm 4、-l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件) 放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest 另外,大部分libxxx......

阅读全文(19931) | 评论:0

回答网友的问题:主题:关于指针及数组的基本概念问题(2005-08-10 17:39:00)

摘要:对本论坛上:主题:关于指针及数组的基本概念问题,的回答

提问作者id:nee   回答者:本人,id:xiangyu138
http://www.programfan.com/club/showbbs.asp?id=95120

1.请问如下的函数参数定义是不是相等的,用指针做参数有什么意义
Node(double *xyz) { x = xyz[0]; y = xyz[1]; z = xyz[2]; }
Node(double xyz[3]) { x = xyz[0]; y = xyz[1]; z = xyz[2]; }

答:两者是相等的,而且第一种其实更标准,因为第二种也是转化为第一种。在函数形式参数里是没有数组的,

都被转化为指针了。所以这时在函数里面没有办法通过像:sizeof(xyz)/sizeof(xyz[0])来取得数组元素的个数

(因为根本就不是数组),所以一般还要传递一个数组元素个数的值,否则编这个函数的人不知道你原来的数组

个数是多少。
如:Node(double xyz[],int n) { x = xyz[0]; y = xyz[1]; z = xyz[2]; }

2.单看double *xyz 的定义,是不是数或数组都可以传递。但是看了{ x = xyz[0]; y = xyz[1]; z = xyz[2]; }

这个具体实现所以才知道要传递一个数组过来?

答:这个完全错,是看形式参数double *xyz 就知道要传递一个一次指针(一次地址)过来,你要是传数值就会

出错的,而且不能传二次指针如:char **argv;的argv。
3.请问 main(int argc,char **argv)
这里面的char **argv 具体是表示的是什么意思,传递参数进来时,是应该传递一个指针还是其他,谢谢!

答:char **argv 是二次指针,也就是二次地址的意思,就是地址的地址(本身地址也是一个二进制数,它也需

要一个地址来保存的哦)。可以传char ......

阅读全文(2916) | 评论:0