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

[1]

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


Bourne 2006-09-28 11:03 发表评论
]]>
语言专题——标准库http://www.shnenglu.com/bourne/archive/2006/07/28/10629.htmlBourneBourneFri, 28 Jul 2006 02:35:00 GMThttp://www.shnenglu.com/bourne/archive/2006/07/28/10629.htmlhttp://www.shnenglu.com/bourne/comments/10629.htmlhttp://www.shnenglu.com/bourne/archive/2006/07/28/10629.html#Feedback0http://www.shnenglu.com/bourne/comments/commentRss/10629.htmlhttp://www.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 复制

 (tng)

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

 (tng)

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

 (tng)

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

 (tng)

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

 (tng)


2
q接

 (tng)

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

 (tng)

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

 (tng)


3
比较

 (tng)

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

 (tng)

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

 (tng)

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

 (tng)


4
查找

 (tng)

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

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

 (tng)

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

 (tng)

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

 (tng)

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

 (tng)

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

 (tng)

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

 (tng)

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

 (tng)


5
其他

 (tng)

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

 (tng)

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

 (tng)

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

 (tng)

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


Bourne 2006-07-28 10:35 发表评论
]]>
KMP字符串匹配算法C语言实现http://www.shnenglu.com/bourne/archive/2006/07/05/9472.htmlBourneBourneWed, 05 Jul 2006 15:48:00 GMThttp://www.shnenglu.com/bourne/archive/2006/07/05/9472.htmlhttp://www.shnenglu.com/bourne/comments/9472.htmlhttp://www.shnenglu.com/bourne/archive/2006/07/05/9472.html#Feedback4http://www.shnenglu.com/bourne/comments/commentRss/9472.htmlhttp://www.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)
{
 (tng) (tng) (tng) int i, j; /* i runs through the string, j counts the hits*/
 (tng) (tng) (tng) int* prefix = (int*)malloc(iPatternLen*sizeof(int));
 (tng) (tng) (tng)
 (tng) (tng) (tng) i = 1; j = 0;
 (tng) (tng) (tng) prefix[0] = 0;
 (tng) (tng) (tng)
 (tng) (tng) (tng) while(i<iPatternLen)
 (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(strPattern[i] == strPattern[j])
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) prefix[i] = ++j;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) else
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) {
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) j = 0;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) prefix[i] = j;
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
 (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) i++;
 (tng) (tng) (tng) }
 (tng) (tng) (tng)
 (tng) (tng) (tng) return prefix; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
} (tng) (tng) (tng)

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

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

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

 (tng) (tng) (tng) return 0;
} (tng)



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

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

通过学习(fn)许多C/C++库,你可以有很多操作、用时间的Ҏ(gu)。但在这之前你需要了(jin)解一些“时间”和“日期”的概念Q主要有以下几个Q?br />
Coordinated Universal TimeQUTCQ:(x)协调世界Ӟ又称Z界标准时_(d)也就是大家所熟知的格林威L准时_(d)Greenwich Mean TimeQGMTQ。比如,中国内地的时间与UTC的时差ؓ(f)+8Q也是UTC+8。美国是UTC-5?br />
Calendar TimeQ日历时_(d)是用“从一个标准时间点到此时的旉l过的秒数”来表示的时间。这个标准时间点对不同的~译器来说会(x)有所不同Q但对一个编译系l来_(d)q个标准旉Ҏ(gu)不变的,该编译系l中的时间对应的日历旉都通过该标准时间点来衡量,所以可以说日历旉是“相Ҏ(gu)间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说Q日历时间都是一L(fng)?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中称之ؓ(f)挂钟旉Qwal-clockQ。其中clock_t是用来保存时间的数据cdQ在time.h文g中,我们可以扑ֈ对它的定义:(x)

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

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

#define CLOCKS_PER_SEC ((clock_t)1000)

可以看到每过千分之一U(1毫秒Q,调用clockQ)(j)函数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函数来计你的机器运行一个@环或者处理其它事件到底花?jin)多时_(d)(x)

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

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

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

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

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

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

大家可能?x)生疑问?x)既然time_t实际上是长整型,到未来的某一天,从一个时间点Q一般是1970q?????U)(j)到那时的U数Q即日历旉Q超Z(jin)长整形所能表C的数的范围怎么办?对time_t数据cd的值来_(d)它所表示的时间不能晚?038q??8?9?4?7U。ؓ(f)?jin)能够表C更久远的时_(d)一些编译器厂商引入?4位甚x(chng)长的整Ş数来保存日历旉。比如微软在Visual C++中采用了(jin)__time64_t数据cd来保存日历时_(d)q过_time64()函数来获得日历时_(d)而不是通过使用32位字的time()函数Q,q样可以通过该数据类型保?001q?????U(不包括该旉点)(j)之前的时间?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提供了(jin)两种不同的函数将日历旉Q一个用time_t表示的整敎ͼ(j)转换为我们^时看到的把年月日时分U分开昄的时间格式tmQ?br />
struct tm * gmtime(const time_t *timer); (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
struct tm * localtime(const time_t * timer);

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

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

如果你已l声明了(jin)参数timerQ你可以从参数timerq回现在的日历时_(d)同时也可以通过q回D回现在的日历旉Q即从一个时间点Q例如:(x)1970q?????U)(j)到现在此时的U数。如果参Cؓ(f)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果是:(x)

The Calendar Time now is 1122707619

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

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

#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果是:(x)

Local hour is: 15
UTC hour is: 7

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

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

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

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

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

printf(ctime(&t));

{h(hun)于:(x)

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

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

#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)(j)函数时间格式化为我们想要的格式。它的原型如下:(x)

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

我们可以Ҏ(gu)format指向字符串中格式命o(h)把timeptr中保存的旉信息攑֜strDest指向的字W串中,最多向strDest中存放maxsize个字W。该函数q回向strDest指向的字W串中放|的字符数?br />
函数strftime()的操作有些类gsprintf()Q识别以癑ֈ?%)开始的格式命o(h)集合Q格式化输出l果攑֜一个字W串中。格式化命o(h)说明串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 昄时和分钟:(x)hh:mm
%S 十进制的U数
%t 水^制表W?
%T 昄时分U:(x)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把星期一做ؓ(f)W一天(g0?3Q?
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十q制q䆾Qg0?9Q?br />%Y 带世U部分的十进制年?
%zQ?Z 时区名称Q如果不能得到时区名U则q回I字W?br />%% 癑ֈ?br />
如果x(chng)C现在是几点?jin),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;
}

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

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

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

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

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

double difftime(time_t time1, time_t time0);

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

#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果为:(x)
hL键(h)l? . .
The pause used 2.000000 seconds.
hL键(h)l? . .

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

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

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

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

#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

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

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

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

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

#ifndef _CHAIN_H
#define _CHAIN_H

#include <iostream>
using namespace std;

template<class T>
class Chain;


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

template<class T>
class Chain{

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

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

#endif (tng) // _CHAIN

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

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

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

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

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

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

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

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

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

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

~译的时候没有问题,但是在连接的时候就出现?jin)问题,报错如下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(jin)三个函数Q构造函数Chain()Q但是构造函数是在Chain.h中定义的Q所以编译器扑ֈ?jin)其定义Q但是另外两个函数是在Chain.cpp中定义的Q而且目前报错没有扑ֈQ但是如果在main.cpp中引?include "Chain.cpp"Ӟ~译和连接就没有问题Q这p实了(jin)原来的估计是没有错的。我实在是不知道问题出现在哪里,所以希望哪位高手看出问题来的话Q请告诉我,多谢?jin)?/font>



Bourne 2006-06-19 16:56 发表评论
]]>
微YVC++对友元类和模板的支持真的q么差吗Q?/title><link>http://www.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://www.shnenglu.com/bourne/archive/2006/06/17/8678.html</guid><wfw:comment>http://www.shnenglu.com/bourne/comments/8678.html</wfw:comment><comments>http://www.shnenglu.com/bourne/archive/2006/06/17/8678.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/bourne/comments/commentRss/8678.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/bourne/services/trackbacks/8678.html</trackback:ping><description><![CDATA[ <p>以前写代码的时候就遇到VC++对友元支持得不太好的问题Q同时也看过侯捷老师对gnu c++, VC++, BCB 三种~译器的比较Q其中VC++Ҏ(gu)板友元的支持׃是很好?br />今天晚上写了(jin)一个比较简单的链表的模板类Q其中头文gChain.h原来的代码如下:(x)<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 (tng)ChainNode<br />{<br /> (tng)friend class Chain<T>;<br />private:<br /> (tng)T data;<br /> (tng)ChainNode<T> *link;<br />};</font> </p> <p> <font color="#0000ff" size="2">template<class T><br />class Chain{<br />public:<br /> (tng)Chain() <br /> (tng){<br /> (tng) (tng)first = 0;<br /> (tng)};<br /> (tng)~Chain();<br /> (tng)bool IsEmpty() const {return first == 0;}<br /> (tng)int Length() const;<br /> (tng)bool Find(int k, T& x) const;<br /> (tng)int Search(const T& x) const;<br /> (tng)//Chain<T>& Delete(int k, T& x);<br /> (tng)Chain<T>& Insert(int k, const T& x);<br /> (tng)void Output(ostream& out = cout) const;<br />private:<br /> (tng)ChainNode<T> *first; // 指向W一个节点的指针<br />};</font> </p> <p> <font color="#0000ff" size="2">#endif (tng) // _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 /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 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 /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 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 /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 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">感觉从代码来看应该是没有问题的,如果哪个高手看出问题来了(jin)请一定告诉我啊,如果知道~译不通过的原因也请一定要告诉我啊。没办法Q最后采用解决的办法是修改ChainNode的定义了(jin)Q定义ؓ(f)l构?)<br /><font color="#0000ff" size="2">template<class T><br />struct ChainNode<br />{<br /> (tng) T data;<br /> (tng) ChainNode<T> *link;<br />};</font><br />反正l构体中的数据成员都是public的,至于讉K限制的实现就依靠q代器来实现?jin),g++的STL中的?wi)结点不也是l构体吗Q?)<br /></font></font></font> </p> <img src ="http://www.shnenglu.com/bourne/aggbug/8678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/bourne/" target="_blank">Bourne</a> 2006-06-17 23:39 <a href="http://www.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://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.kqtao.cn" target="_blank">ղþǿѵĿ</a>| <a href="http://www.kt813.cn" target="_blank">˾þۺϳ</a>| <a href="http://www.qeckf.cn" target="_blank">vĻþ 뾫ƷþɪӰ </a>| <a href="http://www.pc168.com.cn" target="_blank">91ƷɫۺϾþ</a>| <a href="http://www.lebow01.cn" target="_blank">þþƷav</a>| <a href="http://www.jiudexn.cn" target="_blank">ƷþþӰ</a>| <a href="http://www.2008qb.cn" target="_blank">69ƷþþþAPP </a>| <a href="http://www.znhongsheng.com.cn" target="_blank">þþþžоƷ</a>| <a href="http://www.941ad.cn" target="_blank">þsmȤ</a>| <a href="http://www.yonganwl.cn" target="_blank">Ʒ99þþþþö</a>| <a href="http://www.176zfblp.cn" target="_blank">ަvþþ</a>| <a href="http://www.club-biz.cn" target="_blank">þþþþëƬѿ</a>| <a href="http://www.hm661.cn" target="_blank">þ99Ʒһ</a>| <a href="http://www.gwvv.cn" target="_blank">˾þۺϾƷAVר</a>| <a href="http://www.jumeiba.cn" target="_blank">ɫþˬˬƬaV</a>| <a href="http://www.zurpd.cn" target="_blank">þþƷһ</a>| <a href="http://www.366509.cn" target="_blank">պƷþþþþþõӰ</a>| <a href="http://www.qwkhd.cn" target="_blank">þ̳</a>| <a href="http://www.auto-insurance.cn" target="_blank">þþƷh</a>| <a href="http://www.287853x.cn" target="_blank">þþƷ˘AV</a>| <a href="http://www.itkuo.cn" target="_blank">ƯޱгĻþ</a>| <a href="http://www.szbomeidisplays.cn" target="_blank">þù׾Ʒҹ</a>| <a href="http://www.jtuw.cn" target="_blank">þerƵᆱƷ</a>| <a href="http://www.caoguowan.cn" target="_blank">޹ƷƬþ</a>| <a href="http://www.400bxg.cn" target="_blank">þֻоƷ4</a>| <a href="http://www.nicemom.cn" target="_blank">þþþ</a>| <a href="http://www.s9459.cn" target="_blank">ҹƷþ</a>| <a href="http://www.csffh.cn" target="_blank">þøݾƷԴվ</a>| <a href="http://www.sijishi.cn" target="_blank">ݺɫþۺ</a>| <a href="http://www.hbxstech.cn" target="_blank">޺ݺۺϾþѿ</a>| <a href="http://www.delannahotel.com.cn" target="_blank">þþƷŷպ99</a>| <a href="http://www.jdjx168.cn" target="_blank">Ʒþþþþþapp</a>| <a href="http://www.jrlxcc.cn" target="_blank">ŷѹۿþ</a>| <a href="http://www.lzhoufugen.cn" target="_blank">Ů˸߳þþýˮ</a>| <a href="http://www.bandetek.cn" target="_blank">þþҹƷ</a>| <a href="http://www.abcdds.cn" target="_blank">þĻƷһ</a>| <a href="http://www.bqb2.cn" target="_blank">99ƷþþƷһ</a>| <a href="http://www.vanblog.cn" target="_blank">99þɫĻ</a>| <a href="http://www.mycqh.cn" target="_blank">޾Ʒרþþ</a>| <a href="http://www.hilxb.cn" target="_blank">AVþüįٸ</a>| <a href="http://www.8x8z.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>