??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一级做a爰片久久毛片,国产ww久久久久久久久久,AV无码久久久久不卡蜜桃http://m.shnenglu.com/bourne/archive/2006/09/28/13082.htmlBourneBourneThu, 28 Sep 2006 03:03:00 GMThttp://m.shnenglu.com/bourne/archive/2006/09/28/13082.htmlhttp://m.shnenglu.com/bourne/comments/13082.htmlhttp://m.shnenglu.com/bourne/archive/2006/09/28/13082.html#Feedback0http://m.shnenglu.com/bourne/comments/commentRss/13082.htmlhttp://m.shnenglu.com/bourne/services/trackbacks/13082.html本文l出了一个对Microsoft .NET 和Microsoft's XML Web服务q_的M介绍以及使用它们的好处。同时我们还D例说?/font> .NET 是如何改变终端用户和商业的计模式?
  
    在本文中我们不想涉及到很_深的技术,ME微懂一点电脑和Internet知识的h都可以理解本的内容。Micorosoftqؓ那些希望掌握
.NET 的公司执行官、IT领导和程序员?
  提供了更多的资源?
  
    什么是Microsoft
.NET ?
  
    Microsoft
.NET 是Microsoft?/font> XML Web服务q_?/font> .NET 包含了徏立和q行Z XML ?/font> 软g 所需要的全部部g?
  
    Microsoft
.NET 解决了下面这些当?/font> 软g 开发中的一些核心问题:
  
    ●互操作?Interoperability)、集成?Integration)和应用程序的可扩展?extensibility)太难实现而且代h很高。Microsoft
.NET 依靠 XML (一个由World Wide Web Consortium(W3C)理的开放标?消除了数据共享和 软g 集成的障?
  
    ●无数具有相当竞争力的私?/font> 软g 技术?/font> 软g 的集成变得非常复杂。而Microsoft .NET 建立在一个开攄标准上,它包含了所?/font> ~程 语言?
  
    ●当l端用户使用
软g Ӟ他们总觉得不够简ѝ有时甚x到很沮Q因Z们无法在E序之间方便地共享数据或是无法对能访问的数据q行操作?/font> XML 使数据交换变得容易了Qƈ?/font> .NET 软g 可以使得用户只要一得到数据p对它们进行操作?
  
    ●终端用户们在用Web的时候,无法对自q个h信息和数据进行控Ӟq导致了个h隐私和安全泄漏问题。而Microsoft
.NET 提供了一套服务,使用户可以管理他们的个h信息Qƈ且控制对q些信息的访问?
  
    ?COM公司和Web站点开发者们很难为用户们提供_的有价值的数据Q至有一部分原因是由于他们的应用E序和服务无法很好地和其他程序和服务合作Q只是一个不和外界连接的信息孤岛。而Microsoft
.NET 的设计宗旨就是ؓ了来自于多个站点和公司的数据或服务能够整合h?
  
    如同MS-DOS和Windows一P
.NET 大大改变我们的计算领域。MS-DOS使得个h电脑在商业和家庭中广为接受;Windows增强了用L囑Ş界面Q其成为首选的?/font> 软g 交互方式Q最l得图形界面成Z人电脑的L。?/font> .NET 则要?/font> XML Web服务变成日后的主计模式?
  
    
XML Web服务是徏立在 XML 数据交换基础上的 软g 模型Q它帮助应用E序、服务和讑֤一起工作。用 XML q行׃n的数据,彼此之间独立Q但同时又能够松耦合地连接到一个执行某特定d的合作组?
  
    想了?/font> XML Web服务如何工作Q最方便的方法就是把它和D 游戏 作比较?/font> XML Web服务和拼?/font> 游戏 的拼块一h一些独立的单元。后者用一个标准的Ҏ怺咬合在一P XML Web服务与这cMQ但它是通过 XML message实现怺交互的。当你把拼块拼在一hQ你得C一个对象:一q房子、一艘船或一枉机。同P当你?/font> XML Web服务l合在一hQ你得C一个完成某特定d?/font> 软g 解决Ҏ。同一拼块可以用在很多不同对象中,而一?/font> XML Web服务同样也可以用在不同的Ҏl中Q作Z同Q务解x案的一个组成部分?
  
    
XML Web服务使开发者能够对他们所要的E序的来源进行选择Q可以自己创建或购买E序的功能块Q同样也可以选择是让自己的方案用其他的 XML Web服务Q还是让其他的程序用自q服务。这意味着一个公怸必ؓ了给客户一个完整的解决Ҏ而不得不提供Ҏ的每一个组成部分?
  
    
XML Web服务除了个服务相互之间独立以外,对访问它们的讑֤而言也是独立的。与独立应用E序不同的是Q?/font> XML Web服务q没有束~于某一特定?/font> ~程 语言或商业应用程序或者是某一在线服务。这l了l端用户_的自由,使其可以使用M讉K讑֤Q从台式电脑到移动电话都可以?
  
    
.NET 战略
  
    Microsoft
.NET E序员们设计~写的是 XML Web服务Q而不是服务器或客L的独立应用程序。他们把q些服务l合成松耦合Q相互协作的 软g XML Web服务之间使用 XML messagingq行通讯。ؓ了做到这一点,E序员需要:
  
    1.一?/font> 软g q_Q用于徏立一U新的完整的个h用户l验?
  
    2.一?/font> ~程 模型和工P用以建立和整?/font> XML Web服务?
  
    3.一套能为应用程序和服务提供基础的可
~程 的服?
  
    Microsoft?/font> .NET 战略q准了q三炏V?
  
    
.NET 包括Q?
  
    ?/font> .NET q_Q这是一?/font> ~程 工具和基本构Ӟ用来创徏、发布、管理和整合 XML Web服务
  
    ?/font> .NET 体验Q这是终端用L以和 .NET 交互的手D?br />
.NET q_
  
    Microsoft的^台是q于创建和q行
XML Web服务l成的。它包含了下面四个组Ӟ
  
    
.NET 框架和Visual Studio .NET :q些是开发h员用来生?/font> XML Web服务的工兗?/font> .NET 框架是Microsoft .NET q_核心中的一?/font> ~程 接口QVisual Studio .NET 是一套多语言pd?
  
~程 工具?
  
    服务器基本结?Server Infrastructure):
.NET 的服务器基本l构是一pd用于生成、发布和操作 XML Web服务的基E序Q包括Windows和各U?/font> .NET 企业服务器。主要的技术包括对 XML 、scale-out及跨E序和服务的商务程(business process orchestration)的支持。这些服务器包括有:
  
    ●Application Center 2000Q用于scale-out solutions
  
    ●BizTalk Server 2000Q用于创建和理Z
XML 的跨E序和服务的商务程(business process orchestration across applications and services)
  
    ●Host Integration Server 2000Q用来访问主Z的数据和应用E序
  
    ●Mobile Information 2001 ServerQɿUd讑֤Q比如移动电话,也能使用q些应用E序
  
    ?/font> SQL Server 2000储存和检索结构化?a class="Channel_KeyLink" >XML数据
  
    Building Block Services: Building Block Services是一套以用户Z心的
XML Web服务Q它把用h据的控制权从应用E序Ud了用h上,使Web有了一个翻天覆地的变化Q做CE序、服务和讑֤之间的简单性及一致性,q保证了所有的交易都必d到用L同意。这些服务包含了Passport(用于用户w䆾验证)、服务之间的消息传递、文件存储、用户个性设|的理、日历管理和其他一些功能。Microsoft在那些?/font>.NET基本l构赯关重要作用的领域内提供一些块构徏服务(building block services)。大量的合作伙伴和开发商对q些块构建服务作重要的扩展?
  
    讑֤(smart device):
.NET利用软g使智能设备,诸如手提电脑、轻便电话?/font>游戏操纵台等都能够在.NET世界中得以用?
  
    一个智能设备应该:
  
    ●对用户要智能:能根据用L
.NETw䆾、档?profile)和有x据简化用L工作Q另外要对用L存在_的智能,能根据你的在与不在对通知(notification)作出调整?
  
    ●对|络要智能:负责带宽的限Ӟ支持应用E序的在U和U下两种使用模式Q知道有哪些有效的服务?
  
    ●对信息要智能:能在M地方、Q何时间访问、分析和操作数据?
  
    ●对其他的设备要Q能发现和报告其他智能设备、服务和Internet的存在;知道如何为其他设备提供服务;能够灉|方便CPC上访问信息?
  
    ●对
软g和服务要Q能Ҏ表单的情况,最恰当地表现应用和数据Qؓl端用户提供合适的输入Ҏ和连接;?/font>XML、SOAP和UDDI来用Web服务Q对开发者来_要具有可~程性和扩展?
  
    Microsoft的一?/font>软g使能够在讑֤上运行的Q它们包括Windows XP、Windows Me、Windows CE、嵌入式Windows?/font>.NET框架以及.NET Compact框架?
  
    
.NET体验(.NET experiences)
  
    l端用户是通过
.NET体验讉KXML Web服务的,q和现有的独立应用程序有点类|但在下列q些重要的方面是不同的:
  
    ?/font>.NET体验可用于多种讑֤我们无需为可能用的每一个设备编写一个不?/font>XML Web服务和不同的.NET体验Q?/font>.NET体验能够d用户选取讑֤的特征,l出一个恰当界面?
  
    ?/font>.NET体验使用XML Web服务?/font>.NET体验q入|络后就能有效地利用XML Web服务为用户带来额外的价|以更好地解决问题?
  
    ?/font>.NET体验是以用户Z心的.NET体验的焦点在l端用户Q用基于n份验证的块构建服务来为用户验证、参数设定、通知机制和用h据提供服务。因为用h据是由块构徏服务理的,而不是应用程序本w,所以用户就能控制他们自q数据Q能保障它的正确性,q且可以在不同的E序和服务之间协调数据?
  
    Microsoft正在使最受欢q的四个产品q渡?/font>.NET体验。Microsoft Office XP为用h?/font>.NET体验斚w跨出了第一步。另外,MSNQ包括MSN Explorer本地客户端的使用Q正在创Z个基于消费者的.NET体验。Microsoft bCentral的小型商务入?business portal)正努力ؓ型事务(比如商品目录理)提供必要?/font>XML Web服务Q同时也使用一些重要的XML Web服务(比如eBay)。Visual Studio开发系l将为开发者们提供.NET体验Q可以在q些开发工具中直接得到MSDN信息?
  
    
.NET的好?
  
    Microsoft
.NET为程序员、商业领对{IT部门以及消费者带来了很多好处?
  
    ●相Ҏ_E序员是比较~Z的,雇用的费用也很高。然而Microsoft
.NET?/font>~程工作变得更加ҎQ开发投资的回报率也最大化。开发者们可以创徏能重用的XML Web服务Q而不再是一个单一的程序;q些Web服务易于~程和调试,彼此之间怺独立Q通过XML message通讯及合作。所以对某一个服务的修改不会影响到其他的服务?
  
    ׃
XML Web服务可以被很?/font>.NET体验共同使用Q所以对一个服务模块的有效更新Q也xC所有用这个模块的.NET体验。Q?/font>~程语言都可以用来编?/font>XML Web服务(如:C?/font>C++、Visual Basic、COBOL、Perl、Python和Java{?Q所以你的程序员可以选择他们最熟悉的语a?/font>~程Q这大大提高了开发效率。更值得一体的是,他们q没有因使用了不同的语言而失去跨服务或跨lg的调试能力?
  
    ●Microsoft
.NET减少了程序员要写的代码量。一?/font>XML Web服务能适用于所以的讑֤Q不必再Mؓ每一个设备编写一个不同的版本。另外,显C特性与.NET体验分开以便以后加入新的接口技术,比如语音或手写识别,而不必去重写E序?
  
    ●Microsoft
.NET开创了全新的商业模型,它得一个公司可以用多种Ҏ来把自己的技术商品化。据个例子来_一个通讯公司可以使用XML Web服务的方式提供语音信件和呼叫者ID的访问,让用户从一个即时消息程序、电子邮件或用户所选的其他信息~译器中讉KCqC息。技术提供商可以把他们现有的软g包{变ؓXML Web服务Qƈ把这些服务出售给需要这些功能第三方Q或是给.NET体验提供商,用以构徏新的软g包?br />
●Microsoft
.NET允许IT部门使用其他提供商的XML Web服务Q减内部研发的开销Qƈ能提高工作效率?
  
    ●Microsoft
.NET?用户界面友好"作了重新定义。终端用戯够徜徉于一个智能化的、个性化的InternetQ它能记住用L个h讄Qƈ在适当的时候,向用户用的讑֤上发送适当的数据?br />

[1]

.NET如何改变计算
  
    Microsoft
.NET从Ҏ上改变我们的思考和使用电脑的方式。目?服务??桌面电脑"q两U概念占据了计算领域的统d位。然而Microsoft .NET是一U分布式计算范例Q它没有了传l上的服务器和桌面电脑的区别Q取而代之的是,计算的处理被攑֜最合适的地方q行Q可能是服务
  器,或是PCQ也有可能是手提电脑以及其他讑֤。这是计算?
  
    
.NET的计模型对商务和终端用户都产生了重要媄响,但方法不同。对l端用户来说Q这个新计算模式更具个性化、综合程度更高,会给他们带来一U史无前例的C验。对商务来说Q这个模式改变了刉和销?/font>软g的方法,使IT成ؓ一个公司成功的重要贡献者,q徏立v新的商务模型?
  
    对终端用L改变
  
    q里有一个例子,说明?/font>.NET体验是如何对一个终端用户生媄响的?
  
    BobQ一个不安的商务旅行者,在芝加哥下了飞机Q突然想起他竟忘了带上他的那部智能电话。这下完了,没了q电话他无法知道晚宴在哪里进行,无法知道原本打算在晚宴上见面的h的电话号码,更惨的是Q他无法在这个关键的会议之前再看一下重要的文g。但不用急,他从机场的租了一部智能电话,插入了自q卡。很快通过内置的Internetq接Q各U相关的重要数据全部被下载了下来Q现在他能访问他的所有信息,不光是日E安排和电话,q有所有通常用他的PC讉K到的所以文件?
  
    不幸的是Q他在离开机场时不心在自动扶梯上l了一跤,脚踝严重扭伤Q这个月q已l是W二ơ了。无奈,他强忍疼痛要求电话接Rogerȝ的办公室Q听电话的是接待员Mildred姐。Bob通过电话认了自qw䆾Q他授权于Mildred姐Q让她访问自q所在位|和其他一些信息,以便使她可以在附q找一家整形外U诊所。Mildred能够知道哪家诊所正在营业Q有多远Q是否接受Bob的保险。Bob所要做的就是轻按电话上的按钮授权给她,Mildred在找到诊所后便会和ȝU时间?
  
    与Mildred通话l束后,Bob用他的智能电话访问出UR服务Q查扄他最q的出租车,q确认目的地。接下来Bob只需爬进车内Q轻按电话的昄屏确认支付的费用卛_?
  
    从用戯度来Ԍ
.NET提供的好处即过了现在的独立的程序,也胜q了Ua的Web站点?/font>XML Web服务拥有传统?/font>软g功能Q如创徏文档、计数字、存储数据等。而且在下U后也能提供服务Q比如呼叫出URQ这q不需要CPU的参与?
  
    从上面的例子我们可以看到Q?/font>XML Web服务使终端用户得C更ؓ个性化的、综合性的体验Q同时便捷也?/font>.NETl我们带来的一大好处?
  
    对企业的改变
  
    Bob那不走运的商务旅行结束了Q他y跚地回C?虽然那个晚宴非常成功Q但现在他不得不面对六个星期的n体治?。接下来QBob要提交费用报告。他拿出了他的PDAQ验明n份后QPDA列出了其信用卡上的支付纪录。他标出了与q次芝加哥之行有关的费用Q至于那些止痛药和寄Uh信g的费用,他标Z人开销。信用卡公司ؓ其生成必要的账单?
  
    因ؓBob标记了一些个用,所以信用卡公司根据他指定的方法ؓBob生成一张个人帐单。在q个例子中,Bob使用的是直接从他银行账号中提qҎQ但同时他也要一份药费开支报告的拷贝。根据他的选择Q信用卡公司会Email发给他一个PDF文档QBob只需它打印出来卛_?
  
    对于那些业务上的开支,信用卡公怼lBob的公司发Z张电子帐单,它被送到公司的会计部门,由公怼计Chris来处理。电子帐单到达时QChris会收C自动生成的EmailQ随后他d会计pȝ打开q䆾帐单。他仔细查每一W费用,没问题后Q他q行支付Q这也就是授权将一W金从公司的账户转移C用卡公司的̎户上?
  
    从企业角度讲Q?/font>.NET能够自动地处理很多Q务,节约了员工的大量旉。当?/font>XML系l和XML Web服务q接h后,数据交换变得非常方便Q数据处理也变得轻而易举。在q个例子中,员工Bob和Chris分别只要单击一?同意"和启动一个事务处理,无需花大量的旉d写报销单或是往会计pȝ中手工录入数据,一切都变得非常之简单?
  
    对企业和企业l端用户来说Q?/font>.NET预示q些?/font>XML Web服务衍生出来的应用程序有着很强的个性化和高度的整合性的特点Q同时它们适用于各U智能设备,h相当的灵zL?
  
    什么东西没有变
  
    管Microsoft
.NETl计带来了一些翻天覆地的变化Q但q有很多东西依然没有改变.
  
    ●终端用户将依然使用熟悉的界面,像
.NET体验中的Microsoft Office一栗这可以减少再培训的开支,也意味着用户可以马上开始?/font>.NET软g?
  
    ?/font>g上运行的q是象Windows、Unix、Windows CE和Palm OS一L操作pȝ。实际上Q?/font>.NET增加?/font>软g的运行场所Q但同时减少了开发的负担。由?/font>XML Web服务只?/font>XML与设备通信Q所以Q何智能设备都可以享用XML Web服务?
  
    ●对E序员来_他们依然可以使用他们原先熟悉?/font>~程语言?/font>.NETq_借助?/font>.NET框架的公paq行旉?CLR)使得用不同语a开发的XML Web服务之间也可以相互操作。有没有.NET体验问题不大Q你依旧可以用Visual Basic、Java、甚xCOBOL创徏XML Web服务。这U对~程语言的中立性意味着不用Zq入.NET世界而抛弃已有的投资?
  
    ●原先系l无需被替换。一部分的Microsoft
.NET产品是Z能方便地现有的pȝ整合到新Q的XML Web服务?/font>.NET体验中去而设计的。Host Integration Server是个例子,它简化了对主机的讉K。再比如是BizTalk Server,它管理的商务程(business process orchestration)包括了对现有pȝ和数据格式的支持Qƈ会执行一些必要的转换Q将数据转成XML?
  
     所以这U下一代的分布式计是建立在目前这一代基上的。Microsoft
.NET不是我们所惌的那P对现在的应用软g作大规模的替换,而是一个自然的q化q程Q在原先的技术孤岛之间徏立了协作关系Q协同工作能力逐渐加强Q我们也从中受益无I?
  
    ȝ
  
    Microsoft
.NET是Microsoft?/font>XML Web服务的^台。这是下一代的Internet计算模型Q各?/font>XML Web服务之间彼此是松耦合的,通过XMLq行通讯Q协同完成某一特定的Q务。Microsoft .NET战略提供了一个用以徏立新.NET体验?/font>软gq_、一?/font>~程模型、用以徏立和整合XML Web服务的工具以及一套可~程的Web接口?
  
    现在我们正处于向
.NET转变的过E中。Microsoft已经宣布?/font>.NET框架的第一个部?-.NETq_、Visual Studio.NET和一些块构徏服务以及最初的.NET体验。Microsoft在今q和明年中将会提供更多的工具和服务?/font>


Bourne 2006-09-28 11:03 发表评论
]]>
语言专题——标准库http://m.shnenglu.com/bourne/archive/2006/07/28/10629.htmlBourneBourneFri, 28 Jul 2006 02:35:00 GMThttp://m.shnenglu.com/bourne/archive/2006/07/28/10629.htmlhttp://m.shnenglu.com/bourne/comments/10629.htmlhttp://m.shnenglu.com/bourne/archive/2006/07/28/10629.html#Feedback0http://m.shnenglu.com/bourne/comments/commentRss/10629.htmlhttp://m.shnenglu.com/bourne/services/trackbacks/10629.html
用法Q?include <string.h>

功能Q由src所指内存区域复制count个字节到dest所指内存区域?br />
说明Qsrc和dest所指内存区域不能重叠,函数q回指向dest的指针?br />
举例Q?br />
// memcpy.c

#include <syslib.h>
#include <string.h>

main()
{
char *s="Golden Global View";
char d[20];

clrscr();

memcpy(d,s,strlen(s));
d[strlen(s)]=0;
printf("%s",d);

getchar();
return 0;
}

原型Qextern char *strchr(char *s,char c);

用法Q?include <string.h>

功能Q查扑֭W串s中首ơ出现字Wc的位|?br />
说明Q返回首ơ出现c的位|的指针Q如果s中不存在c则返回NULL?br />
举例Q?br />

// strchr.c

#include <syslib.h>
#include <string.h>

main()
{
char *s="Golden Global View";
char *p;

clrscr();

strchr(s,'V');
if(p)
printf("%s",p);
else
printf("Not Found!");

getchar();
return 0;
}

1 复制

 

char* strcpy (char *s1, const char *s2);
字W串s2复制?/span>s1指定的地址

 

char* strncpy (char *s1, const char *s2, size_t len);
void*  memcpy (void *s1, const void *s2, size_t len);
?/span>s2的前len个字W?/span>(字节)复制?/span>s1中指定的地址, 不加'\0'

 

void* memmove (void *s1, const void *s2, size_t len);
当源单元和目的单元缓冲区交P时?/span>

 

size_t strxfrm (char *s1, const char *s1, size_t len);
ҎE序当前的区域选项, ?/span>s2的前len个字W?/span>(字节)复制?/span>s1中指定的地址, 不加'\0'

 


2
q接

 

char* strcat (char *s1, const char *s2);
字W串s2q接?/span>s1N

 

char* strncat (char *s1, const char *s2, size_t len);
字W串s2的前len个字W连接到s1N, 不加'\0'

 


3
比较

 

int strcmp (const char *s1, const char *s2);
比较字符?/span>s1?/span>s2

 

int strncmp (const char *s1, const char *s2, size_t len);
int  memcmp (const void *s1, const void *s2, size_t len);
?/span>s1?/span>s2的前len个字W?/span>(字节)作比?/span>

 

int strcoll (const char *s1, const char *s2);
ҎE序当前的区域选项中的LC_COLLATE, 比较字符?/span>s1?/span>s2

 


4
查找

 

char* strchr (const char *s, int ch);
void* memchr (const void *s, int ch, size_t len);

?/span>s中查扄定字W?/span>(字节?/span>)chW一ơ出现的位置

 

char* strrchr (const char *s, int ch);
在串s中查扄定字W?/span>ch最后一ơ出现的位置, r表示从串ּ?/span>

 

char* strstr (const char *s1, const char *s2);
在串s1中查找指定字W串s2W一ơ出现的位置

 

size_t strspn (const char *s1, const char *s2);
q回s1中第一个在s2中不存在的字W的索引(find_first_not_of)

 

size_t strcspn (const char *s1, const char *s2);
q回s1中第一个也?/span>s2中存在的字符的烦?/span>(find_first_of)

 

char* strpbrk (const char *s1, const char *s2);
?/span>strcspncM, 区别是返回指针而不是烦?/span>

 

char* strtok (char *s1, const char *s2);
从串s1中分d׃s2中指定的分界W分隔开的记?/span>
(token)
W一ơ调用时s1为需分割的字?/span>, 此后每次调用都将s1
NULL,
每次调用strtokq回一个记?/span>, 直到q回NULL为止

 


5
其他

 

size_t strlen (const char *s);
求字W串s的长?/span>

 

void* memset (void *s, int val, size_t len);
s开始的len个字节置?/span>val

 

char* strerror (int errno);
q回指向错误信息字符串的指针

 

source: ?/span>C & C++ Code Capsules?/span>


Bourne 2006-07-28 10:35 发表评论
]]>
KMP字符串匹配算法C语言实现http://m.shnenglu.com/bourne/archive/2006/07/05/9472.htmlBourneBourneWed, 05 Jul 2006 15:48:00 GMThttp://m.shnenglu.com/bourne/archive/2006/07/05/9472.htmlhttp://m.shnenglu.com/bourne/comments/9472.htmlhttp://m.shnenglu.com/bourne/archive/2006/07/05/9472.html#Feedback4http://m.shnenglu.com/bourne/comments/commentRss/9472.htmlhttp://m.shnenglu.com/bourne/services/trackbacks/9472.htmlQi nclude <stdio.h>
Qi nclude <stdlib.h>
Qi nclude <string.h>
Qi nclude <time.h>

//获得prefix数组
int* GetPrefixValue(char* strPattern, int iPatternLen)
{
    int i, j; /* i runs through the string, j counts the hits*/
    int* prefix = (int*)malloc(iPatternLen*sizeof(int));
   
    i = 1; j = 0;
    prefix[0] = 0;
   
    while(i<iPatternLen)
    {
        if(strPattern[i] == strPattern[j])
        {
            prefix[i] = ++j;
        }
        else
        {
            j = 0;
            prefix[i] = j;
        }
       
        i++;
    }
   
    return prefix;          
}   

//q回target串在pattern串中W一ơ匹配的index
int KMPStringMatch(char* strPattern, int iPatternLen, char* strTarget, int iTargetLen, int* prefix)
{
    int i = 0;
    int j = 0;
   
    while(i<iPatternLen && j<iTargetLen)
    {
        if(j==0 || strPattern[i]==strTarget[j])
        {
            i++;  j++;
        }
        else
        {
            j = prefix[j];
        }
    }            
   
    free(prefix);
    
    if(j==iTargetLen)
    {
        return i-j;
    }
    else
    {
        return -1;
    }        
}        

int KMP(char* strPattern, char* strTarget)
{
    int* prefix = GetPrefixValue(strPattern, strlen(strPattern));
    int index = KMPStringMatch(strPattern, strlen(strPattern), strTarget, strlen(strTarget), prefix);
    return index;
}

//在文本文件中查找target串出现的行数
int SearchInTxtFile(char* fileName, char* strTarget)
{
    FILE* hFile = fopen(fileName, "r");
   
    char str[1024];
    int count = 0;
   
   
    while(fgets(str, 1024, hFile)) 
    {
        if(KMP(str, strTarget)!=-1)
        {
            count++;
        }   
    }     
   
    fclose(hFile);
    hFile=NULL;
   
    return count;
}    
            
int main()
{
    char ch;
    char str1[] = "abcabcabctasksb,abTo";
    char str2[] = "abc";
   
    double t=clock();
    printf("%d\n", KMP(str1,str2));
    printf("耗时Q?f毫秒Q\n", (clock()-t));
   
    t=clock();
    printf("find %d \n", SearchInTxtFile("c:\\txt.txt", "NULL"));
    printf("耗时Q?f毫秒Q\n", (clock()-t));
    scanf("%c", &ch);

    return 0;



Bourne 2006-07-05 23:48 发表评论
]]>
c/c++中的旉函数http://m.shnenglu.com/bourne/archive/2006/07/05/9423.htmlBourneBourneWed, 05 Jul 2006 04:12:00 GMThttp://m.shnenglu.com/bourne/archive/2006/07/05/9423.htmlhttp://m.shnenglu.com/bourne/comments/9423.htmlhttp://m.shnenglu.com/bourne/archive/2006/07/05/9423.html#Feedback1http://m.shnenglu.com/bourne/comments/commentRss/9423.htmlhttp://m.shnenglu.com/bourne/services/trackbacks/9423.html摘要Q?br />本文从介l基概念入手Q探讨了在C/C++中对日期和时间操作所用到的数据结构和函数Qƈ对计时、时间的获取、时间的计算和显C格式等斚wq行了阐q。本文还通过大量的实例向你展CZtime.h头文件中声明的各U函数和数据l构的详l用方法?br />
关键字:UTCQ世界标准时_QCalendar TimeQ日历时_QepochQ时间点Q,clock tickQ时钟计时单元)

1Q概?br />在C/C++中,对字W串的操作有很多值得注意的问题,同样QC/C++Ҏ间的操作也有许多值得大家注意的地斏V最q,在技术群中有很多|友也多ơ问到过C++语言中对旉的操作、获取和昄{等的问题。下面,在这文章中Q笔者将主要介绍在C/C++中时间和日期的用方?

通过学习许多C/C++库,你可以有很多操作、用时间的Ҏ。但在这之前你需要了解一些“时间”和“日期”的概念Q主要有以下几个Q?br />
Coordinated Universal TimeQUTCQ:协调世界Ӟ又称Z界标准时_也就是大家所熟知的格林威L准时_Greenwich Mean TimeQGMTQ。比如,中国内地的时间与UTC的时差ؓ+8Q也是UTC+8。美国是UTC-5?br />
Calendar TimeQ日历时_是用“从一个标准时间点到此时的旉l过的秒数”来表示的时间。这个标准时间点对不同的~译器来说会有所不同Q但对一个编译系l来_q个标准旉Ҏ不变的,该编译系l中的时间对应的日历旉都通过该标准时间点来衡量,所以可以说日历旉是“相Ҏ间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说Q日历时间都是一L?br />
epochQ时间点。时间点在标准C/C++中是一个整敎ͼ它用此时的时间和标准旉点相差的U数Q即日历旉Q来表示?br />
clock tickQ时钟计时单元(而不把它叫做旉滴答ơ数Q,一个时钟计时单元的旉长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位?br />
我们可以使用ANSI标准库中的time.h头文件。这个头文g中定义的旉和日期所使用的方法,无论是在l构定义Q还是命名,都具有明昄C语言风格。下面,我将说明在C/C++中怎样使用日期的时间功能?br />
2Q?计时

C/C++中的计时函数是clock()Q而与其相关的数据cd是clock_t。在MSDN中,查得对clock函数定义如下Q?br />
clock_t clock( void );

q个函数q回从“开启这个程序进E”到“程序中调用clock()函数”时之间的CPU旉计时单元Qclock tickQ数Q在MSDN中称之ؓ挂钟旉Qwal-clockQ。其中clock_t是用来保存时间的数据cdQ在time.h文g中,我们可以扑ֈ对它的定义:

#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif

很明显,clock_t是一个长整Ş数。在time.h文g中,q定义了一个常量CLOCKS_PER_SECQ它用来表示一U钟会有多少个时钟计时单元,其定义如下:

#define CLOCKS_PER_SEC ((clock_t)1000)

可以看到每过千分之一U(1毫秒Q,调用clockQ)函数q回的值就?。下面D个例子,你可以用公式clock()/CLOCKS_PER_SEC来计一个进E自w的q行旉Q?br />
void elapsed_time()
{
printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);
}

当然Q你也可以用clock函数来计你的机器运行一个@环或者处理其它事件到底花了多时_

#include “stdio.h?br />#include “stdlib.h?br />#include “time.h?br />
int main( void )
{
   long    i = 10000000L;
   clock_t start, finish;
   double  duration;
   /* 量一个事件持l的旉*/
   printf( "Time to do %ld empty loops is ", i );
   start = clock();
   while( i-- )      ;
   finish = clock();
   duration = (double)(finish - start) / CLOCKS_PER_SEC;
   printf( "%f seconds\n", duration );
   system("pause");
}

在笔者的机器上,q行l果如下Q?br />
Time to do 10000000 empty loops is 0.03000 seconds

上面我们看到旉计时单元的长度ؓ1毫秒Q那么计时的_ֺ也ؓ1毫秒Q那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而计时_ֺ更高呢?通过试Q你会发现这h不行的。在标准C/C++中,最的计时单位是一毫秒?br />
3Q与日期和时间相关的数据l构

在标准C/C++中,我们可通过tml构来获得日期和旉Qtml构在time.h中的定义如下Q?br />
#ifndef _TM_DEFINED
struct tm {
        int tm_sec;     /* U??取值区间ؓ[0,59] */
        int tm_min;     /* ?- 取值区间ؓ[0,59] */
        int tm_hour;    /* ?- 取值区间ؓ[0,23] */
        int tm_mday;    /* 一个月中的日期 - 取值区间ؓ[1,31] */
        int tm_mon;     /* 月䆾Q从一月开始,0代表一月) - 取值区间ؓ[0,11] */
        int tm_year;    /* q䆾Q其值等于实际年份减?900 */
        int tm_wday;    /* 星期 ?取值区间ؓ[0,6]Q其?代表星期天,1代表星期一Q以此类?*/
        int tm_yday;    /* 从每q的1?日开始的天数 ?取值区间ؓ[0,365]Q其?代表1?日,1代表1?日,以此cL */
        int tm_isdst;   /* 夏o时标识符Q实行夏令时的时候,tm_isdst为正。不实行夏o时的q候,tm_isdst?Q不了解情况Ӟtm_isdst()?/
        };
#define _TM_DEFINED
#endif

ANSI C标准UC用tml构的这U时间表CZؓ分解旉(broken-down time)?br />
而日历时_Calendar TimeQ是通过time_t数据cd来表C的Q用time_t表示的时_日历旉Q是从一个时间点Q例如:1970q?????U)到此时的U数。在time.h中,我们也可以看到time_t是一个长整型敎ͼ

#ifndef _TIME_T_DEFINED
typedef long time_t;         /* 旉?*/
#define _TIME_T_DEFINED      /* 避免重复定义 time_t */
#endif

大家可能会生疑问:既然time_t实际上是长整型,到未来的某一天,从一个时间点Q一般是1970q?????U)到那时的U数Q即日历旉Q超Z长整形所能表C的数的范围怎么办?对time_t数据cd的值来_它所表示的时间不能晚?038q??8?9?4?7U。ؓ了能够表C更久远的时_一些编译器厂商引入?4位甚x长的整Ş数来保存日历旉。比如微软在Visual C++中采用了__time64_t数据cd来保存日历时_q过_time64()函数来获得日历时_而不是通过使用32位字的time()函数Q,q样可以通过该数据类型保?001q?????U(不包括该旉点)之前的时间?br />
在time.h头文件中Q我们还可以看到一些函敎ͼ它们都是以time_t为参数类型或q回值类型的函数Q?br />
double difftime(time_t time1, time_t time0);
time_t mktime(struct tm * timeptr);
time_t time(time_t * timer);
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

此外Qtime.hq提供了两种不同的函数将日历旉Q一个用time_t表示的整敎ͼ转换为我们^时看到的把年月日时分U分开昄的时间格式tmQ?br />
struct tm * gmtime(const time_t *timer);                                          
struct tm * localtime(const time_t * timer);

通过查阅MSDNQ我们可以知道Microsoft C/C++ 7.0中时间点的|time_t对象的|是从1899q?2?1???U到该时间点所l过的秒敎ͼ而其它各U版本的Microsoft C/C++和所有不同版本的Visual C++都是计算的从1970q?????U到该时间点所l过的秒数?br />
4Q与日期和时间相关的函数及应?br />在本节,我将向大家展C怎样利用time.h中声明的函数Ҏ间进行操作。这些操作包括取当前旉、计时间间隔、以不同的Ş式显C时间等内容?br />
4.1 获得日历旉

我们可以通过time()函数来获得日历时_Calendar TimeQ,其原型ؓQ?br />
time_t time(time_t * timer);

如果你已l声明了参数timerQ你可以从参数timerq回现在的日历时_同时也可以通过q回D回现在的日历旉Q即从一个时间点Q例如:1970q?????U)到现在此时的U数。如果参CؓI(NULQ,函数只通过q回D回现在的日历旉Q比如下面这个例子用来显C当前的日历旉Q?br />
#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
printf("The Calendar Time now is %d\n",lt);
return 0;
}

q行的结果与当时的时间有养I我当时运行的l果是:

The Calendar Time now is 1122707619

其中1122707619是我运行程序时的日历时间。即?970q?????U到此时的秒数?br />
4.2 获得日期和时?br />
q里说的日期和时间就是我们^时所说的q、月、日、时、分、秒{信息。从W?节我们已l知道这些信息都保存在一个名为tm的结构体中,那么如何一个日历时间保存ؓ一个tml构的对象呢Q?br />
其中可以使用的函数是gmtime()和localtime()Q这两个函数的原型ؓQ?br />
struct tm * gmtime(const time_t *timer);                                          
struct tm * localtime(const time_t * timer);

其中gmtime()函数是将日历旉转化Z界标准时_x林尼L_Qƈq回一个tml构体来保存q个旉Q而localtime()函数是将日历旉转化为本地时间。比如现在用gmtime()函数获得的世界标准时间是2005q??0??8?0U,那么我用localtime()函数在中国地得的本地旉会比世界标准旉?个小Ӟ?005q??0?5?8?0U。下面是个例子:

#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *local;
time_t t;
t=time(NUL);
local=localtime(&t);
printf("Local hour is: %d\n",local->tm_hour);
local=gmtime(&t);
printf("UTC hour is: %d\n",local->tm_hour);
return 0;
}

q行l果是:

Local hour is: 15
UTC hour is: 7

4.3 固定的时间格?br />
我们可以通过asctime()函数和ctime()函数时间以固定的格式显C出来,两者的q回值都是char*型的字符丌Ӏ返回的旉格式为:

星期?月䆾 日期 ??U?q\n\0
例如QWed Jan 02 02:03:55 1980\n\0

其中\n是一个换行符Q\0是一个空字符Q表C字W串l束。下面是两个函数的原型:

char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

其中asctime()函数是通过tml构来生成具有固定格式的保存旉信息的字W串Q而ctime()是通过日历旉来生成时间字W串。这L话,asctimeQ)函数只是把tml构对象中的各个域填到时间字W串的相应位|就行了Q而ctimeQ)函数需要先参照本地的时间设|,把日历时间{化ؓ本地旉Q然后再生成格式化后的字W串。在下面Q如果t是一个非I的time_t变量的话Q那么:

printf(ctime(&t));

{h于:

struct tm *ptr;
ptr=localtime(&t);
printf(asctime(ptr));

那么Q下面这个程序的两条printf语句输出的结果就是不同的了(除非你将本地时区设ؓ世界标准旉所在的时区Q:

#include "time.h"
#include "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
ptr=gmtime(&lt);
printf(asctime(ptr));
printf(ctime(&lt));
return 0;
}

q行l果Q?br />
Sat Jul 30 08:43:03 2005
Sat Jul 30 16:43:03 2005

4.4 自定义时间格?br />
我们可以使用strftimeQ)函数时间格式化为我们想要的格式。它的原型如下:

size_t strftime(
   char *strDest,
   size_t maxsize,
   const char *format,
   const struct tm *timeptr
);

我们可以Ҏformat指向字符串中格式命o把timeptr中保存的旉信息攑֜strDest指向的字W串中,最多向strDest中存放maxsize个字W。该函数q回向strDest指向的字W串中放|的字符数?br />
函数strftime()的操作有些类gsprintf()Q识别以癑ֈ?%)开始的格式命o集合Q格式化输出l果攑֜一个字W串中。格式化命o说明串strDest中各U日期和旉信息的确切表C方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大写的?br />
%a 星期几的?
%A 星期几的全称
%b 月分的简?
%B 月䆾的全U?
%c 标准的日期的旉?
%C q䆾的后两位数字
%d 十进制表C的每月的第几天
%D ??q?
%e 在两字符域中Q十q制表示的每月的W几?
%F q???
%g q䆾的后两位数字Q用基于周的年
%G q分Q用基于周的年
%h 写的月䆾?
%H 24时制的时
%I 12时制的时
%j 十进制表C的每年的第几天
%m 十进制表C的月䆾
%M 十时制表C的分钟?
%n 新行W?
%p 本地的AM或PM的等hC?
%r 12时的时?
%R 昄时和分钟:hh:mm
%S 十进制的U数
%t 水^制表W?
%T 昄时分U:hh:mm:ss
%u 每周的第几天Q星期一为第一?Qg0?Q星期一?Q?br />%U W年的第几周Q把星期日做为第一天(g0?3Q?br />%V 每年的第几周Q用基于周的年
%w 十进制表C的星期几(g0?Q星期天?Q?br />%W 每年的第几周Q把星期一做ؓW一天(g0?3Q?
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十q制q䆾Qg0?9Q?br />%Y 带世U部分的十进制年?
%zQ?Z 时区名称Q如果不能得到时区名U则q回I字W?br />%% 癑ֈ?br />
如果xC现在是几点了,q以12时制显C,p下面q段E序Q?br />
#include “time.h?br />#include “stdio.h?br />int main(void)
{
struct tm *ptr;
time_t lt;
char str[80];
lt=time(NUL);
ptr=localtime(&lt);
strftime(str,100,"It is now %I %p",ptr);
printf(str);
return 0;
}

其运行结果ؓQ?br />It is now 4PM

而下面的E序则显C当前的完整日期Q?br />
#include <stdio.h>
#include <time.h>

void main( void )
{
        struct tm *newtime;
        char tmpbuf[128];
        time_t lt1;
        time( &lt1 );
        newtime=localtime(&lt1);
        strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);
        printf(tmpbuf);
}

q行l果Q?br />
Today is Saturday, day 30 of July in the year 2005.

4.5 计算持箋旉的长?br />
有时候在实际应用中要计算一个事件持l的旉长度Q比如计打字速度。在W?节计旉分中Q我已经用clock函数举了一个例子。Clock()函数可以_到毫U。同Ӟ我们也可以用difftime()函数Q但它只能精到U。该函数的定义如下:

double difftime(time_t time1, time_t time0);

虽然该函数返回的以秒计算的时间间隔是doublecd的,但这q不说明该时间具有同double一L_度,q是由它的参数觉得的Qtime_t是以Uؓ单位计算的)。比如下面一D늨序:

#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
time_t start,end;
start = time(NUL);
system("pause");
end = time(NUL);
printf("The pause used %f seconds.\n",difftime(end,start));//<-
system("pause");
return 0;
}

q行l果为:
hL键l? . .
The pause used 2.000000 seconds.
hL键l? . .

可以惛_Q暂停的旉q不那么巧是整整2U钟。其实,你将上面E序的带有?/<-”注释的一行用下面的一行代码替换:

printf("The pause used %f seconds.\n",end-start);

其运行结果是一L?br />
4.6 分解旉转化为日历时?br />
q里说的分解旉是以年、月、日、时、分、秒{分量保存的旉l构Q在C/C++中是tml构。我们可以用mktimeQ)函数用tml构表示的时间{化ؓ日历旉。其函数原型如下Q?br />
time_t mktime(struct tm * timeptr);

其返回值就是{化后的日历时间。这h们就可以先制定一个分解时_然后对这个时间进行操作了Q下面的例子可以计算?997q??日是星期几:

#include "time.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
struct tm t;
time_t t_of_day;
t.tm_year=1997-1900;
t.tm_mon=6;
t.tm_mday=1;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=1;
t.tm_isdst=0;
t_of_day=mktime(&t);
printf(ctime(&t_of_day));
return 0;
}

q行l果Q?br />
Tue Jul 01 00:00:01 1997

现在注意了,有了mktime()函数Q是不是我们可以操作现在之前的Q何时间呢Q你可以通过q种办法出1945q??5h星期几吗Q答案是否定的。因个时间在1970q??日之前,所以在大多数编译器中,q样的程序虽然可以编译通过Q但q行时会异常l止?br />
5Qȝ

本文介绍了标准C/C++中的有关日期和时间的概念Qƈ通过各种实例讲述了这些函数和数据l构的用方法。笔者认为,和时间相关的一些概忉|相当重要的,理解q些概念是理解各U时间格式的转换的基Q更是应用这些函数和数据l构的基?br />
参考文?br />
[1] 标准C++E序设计教程Q电子工业出版社Q?003?br />[2] MSDN LibraryQ?Microsoft CorporationQ?003?/font>

Bourne 2006-07-05 12:12 发表评论
]]>
转脓:链接错误LINK2001http://m.shnenglu.com/bourne/archive/2006/06/20/8756.htmlBourneBourneTue, 20 Jun 2006 08:36:00 GMThttp://m.shnenglu.com/bourne/archive/2006/06/20/8756.htmlhttp://m.shnenglu.com/bourne/comments/8756.htmlhttp://m.shnenglu.com/bourne/archive/2006/06/20/8756.html#Feedback2http://m.shnenglu.com/bourne/comments/commentRss/8756.htmlhttp://m.shnenglu.com/bourne/services/trackbacks/8756.html上网搜东西的时候搜Cq个Q觉得蛮使用的,攑֜q里以备后用Q?br />
--  LINK2001
学习VCQ+时经怼遇到链接错误LNK2001Q该错误非常讨厌Q因为对?br />~程者来_最好改的错误莫q于~译错误Q而一般说来发生连接错误时Q?br />~译都已通过。生连接错误的原因非常多,其LNK2001错误Q常怋Z
明其所以然。如果不深入地学习和理解VCQ+Q要x正连接错误LNK2001?br />常困难?br />  初学者在学习VCQ+的过E中Q遇到的LNK2001错误的错误消息主要ؓQ?br />  unresolved external symbol “symbol”(不确定的外部“符号”)?br />  如果q接E序不能在所有的库和目标文g内找到所引用的函数、变量或
标签Q将产生此错误消息。一般来_发生错误的原因有两个Q一是所引用
的函数、变量不存在、拼写不正确或者用错误;其次可能使用了不同版?br />的连接库?br />  以下是可能生LNK2001错误的原因:
  一Q由于编码错误导致的LNK2001?br />  1Q不相匹配的E序代码或模块定义(.DEFQ文件能DLNK2001。例?
如果在CQ+ 源文件内声明了一变量“var1”,却试囑֜另一文g内以变量
“VAR1”访问该变量,发生该错误?br />  2Q如果用的内联函数是在.CPP文g内定义的Q而不是在头文件内?br />义将DLNK2001错误?br />  3Q调用函数时如果所用的参数cd同函数声明时的类型不W将会?br />LNK2001?br />  4Q试图从基类的构造函数或析构函数中调用虚拟函数时会DLNK2001?br />  5Q要注意函数和变量的可公用性,只有全局变量、函数是可公用的?br />  静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访?br />M没有在该文g内声明的静态变量时导致编译错误或LNK2001?br />  函数内声明的变量Q局部变量) 只能在该函数的范围内使用?br />  CQ+ 的全局帔R只有静态连接性能。这不同于CQ如果试囑֜CQ+?br />多个文g内用全局变量也会产生LNK2001错误。一U解决的Ҏ是需要时?br />头文件中加入该常量的初始化代码,q在.CPP文g中包含该头文Ӟ另一U?br />Ҏ是用时l该变量赋以常数?br />  二.׃~译和链接的讄而造成的LNK2001
  1Q如果编译时使用的是/NODQ?NODEFAULTLIBQ选项Q程序所需要的q行
库和MFC库在q接时由~译器写入目标文件模块, 但除非在文g中明包?br />q些库名Q否则这些库不会被链接进工程文g。在q种情况下?NOD导
致错误LNK2001?br />  2Q如果没有ؓwWinMainCRTStartup讑֮E序入口Q在使用Unicode和MFC
时将得到“unresolved external on _WinMain@16”的LNK2001错误信息?br />  3Q?MD选项~译?既然所有的q行库都被保留在动态链接库之内Q?br />源文件中对“func”的引用Q在目标文g里即对“__imp__func?的引用?br />如果试图使用静态库LIBC.LIB或LIBCMT.LIBq行q接Q将在__imp__func上发
生LNK2001Q如果不使用/MD选项~译Q在使用MSVCxx.LIBq接时也会发生LNK2001?br />  4Q?ML选项~译Ӟ如用LIBCMT.LIB链接会在_errno上发生LNK2001?br />  5Q当~译调试版的应用E序Ӟ如果采用发行版模态库q行q接也会?br />生LNK2001Q同P使用调试版模态库q接发行版应用程序时也会产生相同?br />问题?br />  6Q不同版本的库和~译器的混合使用也能产生问题Q因为新版的库里?br />能包含早先的版本没有的符号和说明?br />  7Q在不同的模块用内联和非内联的~译选项能够DLNK2001。如?br />创徏CQ+库时打开了函数内联(/Ob1?Ob2Q,但是在描q该函数的相应头
文g里却关闭了函数内联(没有inline关键字)Q这时将得到该错误信息?br />为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数?br />  8Q不正确?SUBSYSTEM?ENTRY讄也能DLNK2001?br />  其实Q生LNK2001的原因还有很多,以上的原因只是一部分而已Q对?br />学者来说这些就够理解一阵子了。但是,分析错误原因的目的是Z避免?br />误的发生。LNK2001错误虽然比较困难Q但是只要注意到了上q问题,q是?br />够避免和予以解决的?/p>

Bourne 2006-06-20 16:36 发表评论
]]>
VC++中的q接问题Q请大侠帮忙Q我快崩溃了http://m.shnenglu.com/bourne/archive/2006/06/19/8711.htmlBourneBourneMon, 19 Jun 2006 08:56:00 GMThttp://m.shnenglu.com/bourne/archive/2006/06/19/8711.htmlhttp://m.shnenglu.com/bourne/comments/8711.htmlhttp://m.shnenglu.com/bourne/archive/2006/06/19/8711.html#Feedback4http://m.shnenglu.com/bourne/comments/commentRss/8711.htmlhttp://m.shnenglu.com/bourne/services/trackbacks/8711.htmlq是我做的那个链表的模板c?br />我分别写了头文gChain.hQ源文gChain.cpp,q且在main.cpp中进行测试?br />但是在连接的时候出C问题Q不知道什么原因,希望能够有高手指点一下,非常感谢Q?br />
其中Chain.h声明了类的数据成员和成员函数Q具体内容如下:

#ifndef _CHAIN_H
#define _CHAIN_H

#include <iostream>
using namespace std;

template<class T>
class Chain;


template<class T>
class ChainNode
{
 friend class Chain<T>;
 friend ostream& operator<<(ostream& out, const Chain<T>& x);
private:
 T data;
 ChainNode<T> *link;
};

template<class T>
class Chain{

public:
 Chain(int p) {first = 0;};
 ~Chain();
 bool IsEmpty() const {return first == 0;}
 int Length() const;
 bool Find(int k, T& x) const;
 int Search(const T& x) const;
 //Chain<T>& Delete(int k, T& x);
 Chain<T>& Insert(int k, const T& x);
 void Output(ostream& out = cout) const;
private:
 ChainNode<T> *first; // 指向W一个节点的指针
};

template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x);

#endif  // _CHAIN

  在Chain.cpp中对Chain.h中声明的函数q行了定义,具体内容如下Q?br />
#include "Chain.h"
#include <iostream>
using namespace std;

template<class T>
Chain<T>::~Chain()
{
 //链表的析构函?用于删除链表中的所有节?br /> ChainNode<T> *ptr = first;
 while (ptr)
 {
  first = ptr->link;
  delete ptr;
  ptr = first;
 }
}

template<class T>
int Chain<T>::Length() const
{
 //q回链表中的元素L
 int count = 0;
 ChainNode<T> *ptr = first;
 while (ptr)
 {
  ++count;
  ptr = ptr->link;
 }
 return count;
}

template<class T>
bool Chain<T>::Find(int k, T& x) const
{
 //L链表中的Wk个元素,q将其传送至x
 //如果不存在第k个元素,则返回falseQ否则返回true
 if (k < 1)
 {
  return false;
 }
 int count = k;
 ChainNode<T> *ptr = first;
 while (count && ptr)
 {
  --count;
  ptr = ptr->link
 }
 if (!ptr)
 {
  return false;
 }
 x = ptr->data;
 return true;
}

template<class T>
int Chain<T>::Search(const T& x) const
{
 //LxQ如果发现xQ则q回x的地址
 //如果x不在链表中,则返?
 int count = 1;
 ChainNode<T> *ptr = first;
 while(ptr && (ptr->data!=x))
 {
  ++count;
  ptr = ptr->link;
 }
 if (ptr)
 {
  return count;
 }
 else
 {
  return 0;
 }
}

template<class T>
void Chain<T>::Output(ostream& out = cout) const
{
 ChainNode<T> *ptr = first;
 while (ptr)
 {
  out<<ptr->data<<"  ";
  ptr = ptr->link;
 }
}

//重蝲<<q算W?br />template<class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
{
 x.Output(out);
 return out;
}

template<class T>
Chain<T>& Chain<T>::Insert(int k, const T& x)
{
 ChainNode<T> *ptr = first;
 int count = 0;
 while (ptr && count < k)
 {
  ++count;
  ptr = ptr->link;
 }
 if (!ptr)  //如果没到Wk个节?br /> {
 
 }
 else
 {
  //要插入的新节?br />  ChainNode<T>* cn = new ChainNode<T>;
  cn->data = x;
  cn->link = 0;
  if (ptr->link==0)  //到达了链表的l尾
  {
   ptr->link = cn;
  }
  else  //没到辄?br />  { 
   cn->link = ptr->link;
   ptr->link = cn;
  }
 }
 return *this
}

 在main.cpp中进行测试,试的内容很,但是刚开始就q行不了了。main.cpp内容如下Q?br />
#include "Chain.h"
using namespace std;

int main()
{
 Chain<int> c;
 cout<<c.Length();
 return 0;
}

~译的时候没有问题,但是在连接的时候就出现了问题,报错如下Q?br />--------------------Configuration: Chain - Win32 Debug--------------------
Linking...
main.obj : error LNK2001: unresolved external symbol "public: __thiscall Chain<int>::~Chain<int>(void)" (
??1?$Chain@H@@QAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall Chain<int>::Length(void)const " (
?Length@?$Chain@H@@QBEHXZ)
Debug/Chain.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

Chain.exe - 3 error(s), 0 warning(s)
但是从报错信息来看,应该是在main.cpp中没有找到所用到的函?~Chain<int>(void)和Length()的定义,在main.cpp中一qC三个函数Q构造函数Chain()Q但是构造函数是在Chain.h中定义的Q所以编译器扑ֈ了其定义Q但是另外两个函数是在Chain.cpp中定义的Q而且目前报错没有扑ֈQ但是如果在main.cpp中引?include "Chain.cpp"Ӟ~译和连接就没有问题Q这p实了原来的估计是没有错的。我实在是不知道问题出现在哪里,所以希望哪位高手看出问题来的话Q请告诉我,多谢了!



Bourne 2006-06-19 16:56 发表评论
]]>
微YVC++对友元类和模板的支持真的q么差吗Q?/title><link>http://m.shnenglu.com/bourne/archive/2006/06/17/8678.html</link><dc:creator>Bourne</dc:creator><author>Bourne</author><pubDate>Sat, 17 Jun 2006 15:39:00 GMT</pubDate><guid>http://m.shnenglu.com/bourne/archive/2006/06/17/8678.html</guid><wfw:comment>http://m.shnenglu.com/bourne/comments/8678.html</wfw:comment><comments>http://m.shnenglu.com/bourne/archive/2006/06/17/8678.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://m.shnenglu.com/bourne/comments/commentRss/8678.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/bourne/services/trackbacks/8678.html</trackback:ping><description><![CDATA[ <p>以前写代码的时候就遇到VC++对友元支持得不太好的问题Q同时也看过侯捷老师对gnu c++, VC++, BCB 三种~译器的比较Q其中VC++Ҏ板友元的支持׃是很好?br />今天晚上写了一个比较简单的链表的模板类Q其中头文gChain.h原来的代码如下:<br /><br /><font color="#0000ff" size="2">#include <iostream><br />using namespace std;</font></p> <p> <font color="#0000ff" size="2">#ifndef _CHAIN<br />#define _CHAIN</font> </p> <p> <font color="#0000ff" size="2">template<class T><br />class ChainNode<br />{<br /> friend class Chain<T>;<br />private:<br /> T data;<br /> ChainNode<T> *link;<br />};</font> </p> <p> <font color="#0000ff" size="2">template<class T><br />class Chain{<br />public:<br /> Chain() <br /> {<br />  first = 0;<br /> };<br /> ~Chain();<br /> bool IsEmpty() const {return first == 0;}<br /> int Length() const;<br /> bool Find(int k, T& x) const;<br /> int Search(const T& x) const;<br /> //Chain<T>& Delete(int k, T& x);<br /> Chain<T>& Insert(int k, const T& x);<br /> void Output(ostream& out = cout) const;<br />private:<br /> ChainNode<T> *first; // 指向W一个节点的指针<br />};</font> </p> <p> <font color="#0000ff" size="2">#endif  // _CHAIN<br /><br />l果报错Q?br />--------------------Configuration: Chain - Win32 Debug--------------------<br />Compiling...<br />Chain.cpp<br />g:\work plan\c++ code practice\chain\chain.h(17) : error C2059: syntax error : '<'<br />        g:\work plan\c++ code practice\chain\chain.h(21) : see reference to class template instantiation 'ChainNode<T>' being compiled<br />g:\work plan\c++ code practice\chain\chain.h(17) : error C2238: unexpected token(s) preceding ';'<br />        g:\work plan\c++ code practice\chain\chain.h(21) : see reference to class template instantiation 'ChainNode<T>' being compiled<br />g:\work plan\c++ code practice\chain\chain.h(40) : error C2989: 'Chain' : template class has already been defined as a non-template class<br />        g:\work plan\c++ code practice\chain\chain.h(17) : see declaration of 'Chain'<br />g:\work plan\c++ code practice\chain\chain.cpp(6) : error C2059: syntax error : '<'<br />g:\work plan\c++ code practice\chain\chain.cpp(6) : error C2588: '::~Chain' : illegal global destructor<br />g:\work plan\c++ code practice\chain\chain.cpp(6) : fatal error C1903: unable to recover from previous error(s); stopping compilation<br />Error executing cl.exe.</font> </p> <p> <font color="#0000ff" size="2">Chain.obj - 6 error(s), 0 warning(s)<br /><br /><font size="3"><font color="#000000">感觉从代码来看应该是没有问题的,如果哪个高手看出问题来了请一定告诉我啊,如果知道~译不通过的原因也请一定要告诉我啊。没办法Q最后采用解决的办法是修改ChainNode的定义了Q定义ؓl构?)<br /><font color="#0000ff" size="2">template<class T><br />struct ChainNode<br />{<br />  T data;<br />  ChainNode<T> *link;<br />};</font><br />反正l构体中的数据成员都是public的,至于讉K限制的实现就依靠q代器来实现了,g++的STL中的树结点不也是l构体吗Q?)<br /></font></font></font> </p> <img src ="http://m.shnenglu.com/bourne/aggbug/8678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/bourne/" target="_blank">Bourne</a> 2006-06-17 23:39 <a href="http://m.shnenglu.com/bourne/archive/2006/06/17/8678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.aann8.cn" target="_blank">þ99ֻоƷ</a>| <a href="http://www.dgcry.cn" target="_blank">þþþþþþþѾƷ</a>| <a href="http://www.sspfn.cn" target="_blank">ĻƷþþþþ3Dն</a>| <a href="http://www.mt4.net.cn" target="_blank">þþƷ99͵</a>| <a href="http://www.fayongshicai.cn" target="_blank">þۺϾþۺϾþۺ</a>| <a href="http://www.7cdy.cn" target="_blank">޹ƷۺϾþ</a>| <a href="http://www.cn987.cn" target="_blank">þþþƷ2019ѹۿ</a>| <a href="http://www.caoyb.cn" target="_blank">þøһëƬ</a>| <a href="http://www.orzdream.cn" target="_blank">ҹavþþþ</a>| <a href="http://www.a0037.cn" target="_blank">ƷþþĻ</a>| <a href="http://www.xiaodaoyl.cn" target="_blank">þҹ³˿ƬҹƷ</a>| <a href="http://www.sj-gd.cn" target="_blank">AV12þ</a>| <a href="http://www.denstone.cn" target="_blank">þݺҹҹ</a>| <a href="http://www.goldenshipping.cn" target="_blank">þþƷav鶹ѿ</a>| <a href="http://www.zmcgmih22.cn" target="_blank">avþþþþòվ</a>| <a href="http://www.jiedidianzubiao.cn" target="_blank">þù˾Ʒ</a>| <a href="http://www.ganzhoupei.cn" target="_blank">ɫAVԾþþþþ</a>| <a href="http://www.auto-insurance.cn" target="_blank">þۺ¶þü</a>| <a href="http://www.lebow01.cn" target="_blank">Ʒ9999þþþ</a>| <a href="http://www.pocoho.cn" target="_blank">þAV뾫Ʒɫҹ鶹 </a>| <a href="http://www.okboom.cn" target="_blank">ҹƷþþþþ</a>| <a href="http://www.nn75.cn" target="_blank">þþþƷ鶹</a>| <a href="http://www.hit5.cn" target="_blank">鶹ھƷþþþþ</a>| <a href="http://www.ifim.cn" target="_blank">ƷۺϾþþþþ97</a>| <a href="http://www.djdnx.cn" target="_blank">ҹþþþþ</a>| <a href="http://www.ssc629.cn" target="_blank">ξþ99Ʒþþþþ</a>| <a href="http://www.cbanqi.cn" target="_blank">˺ݺۺϾþ88</a>| <a href="http://www.woyaopeizi.cn" target="_blank">þþþŷղAV</a>| <a href="http://www.zhantu520.cn" target="_blank">þӰۺ</a>| <a href="http://www.gxsc.net.cn" target="_blank">޹Ʒþþþ</a>| <a href="http://www.0532ks.cn" target="_blank">þþƷav</a>| <a href="http://www.rdyly1688.cn" target="_blank">þ91Ʒ91</a>| <a href="http://www.zzcjw.cn" target="_blank">뾫ƷþɪӰ</a>| <a href="http://www.fscre.cn" target="_blank">99þþƷѹۿ</a>| <a href="http://www.265z.cn" target="_blank">þþƷ</a>| <a href="http://www.chianyuxun.cn" target="_blank">ŷ˾þƬ</a>| <a href="http://www.juruse.com.cn" target="_blank">Ʒ9999þþþ</a>| <a href="http://www.rootwiremesh.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.panroad.cn" target="_blank">ݺݾþ</a>| <a href="http://www.egpk.cn" target="_blank">߳߳þþ</a>| <a href="http://www.baojingqi88.org.cn" target="_blank">պһþ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>