用VS.Net编写扩展存储过程(三,完)

来源:互联网 发布:linux改文件名命令 编辑:程序博客网 时间:2024/06/06 01:28
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

昨天忙着写这个,没看奥运会,刚知道老郭和小吴又让外国人郁闷了一把。不知道奥委会是不是又要对跳水改变规则哪?

在上一节,我们把含有两车站的所有火车ID和路线信息分别读入了int*TrainID和CHAR**ppcStations,完成了最后一次读入数据的过程,下面就要处理这些数据以获得结果……就要结束了,前途是光明的,道路是平坦的……风是背后吹来的……有MM在身边陪着的……晕,忘了告诉各位兄弟,小弟现在不吃西红柿了,改吃鸡蛋,请多多关照积极配合,谢谢~~~

第三步,寻找最短的路线

显然,首先要对路线信息的字符串做分词处理,知道了从一站到下一站需要多长时间,才可能计算最短路线。本文中将用.Net类库中提供的正则式类来分割这些字符串……当然用普通方法也完全可以处理。

要使用正则式类,就要用到托管代码,我还是只讲应用,不讲原理。对托管代码工作机制感兴趣的朋友,请参阅MSDN中的托管部分。

先选择xsTrainQuery项目的属性,将“配置属性”下“常规”中的“使用托管扩展”改为“是”,随后在proc.cpp中加入如下预编译头:

#using
#using
usingnamespaceSystem;
usingnamespaceSystem::Text::RegularExpressions;
对于char*字符串,必须转化为托展字符串类型,即System::String*指针,才能用正则式类处理。我是用这样的方式把char*转化为System::String*:
System::String*newStr=System::Text::Encoding::Unicode->GetString(System::Text::Encoding::Unicode->GetBytes(oldStr));
现在就到了这一步的重头戏——正则式分词。不知道大家有没有掌握.Net的正则式,如果象我一样是菜鸟,还是让MSDN随时待命吧~
{
   //把起点和终点站由PBYTE转化为System::String*
   System::String*strStart=System::Text::Encoding::Unicode->GetString(System::Text::Encoding::Unicode->GetBytes((PCHAR)pbStart));
   System::String*strEnd=System::Text::Encoding::Unicode->GetString(System::Text::Encoding::Unicode->GetBytes((PCHAR)pbEnd));

   //定义正则式模式
   //用两个//,是因为|在正则式中有特定含义,必须在|前加上/转义,而//代表了/
   Regex*r=newRegex(S"(?://|(.+?),(.+?)小时)+//|");

   //定义循环中将用到的变量
   intiOldTime=INT_MAX;
   intnFastest=0;

   //万事俱备,开始处理ppcStations指针数组
   for(inti=0;i   {
       //用r来匹配ppcStations[i]
       Match*m=r->Match(ppcStations[i]);
       //所有站点的匹配组
       System::Text::RegularExpressions::Group*gStation=m->Groups->get_Item(1);
       //所有时间的匹配组,与站点匹配组按顺序一一对应
       System::Text::RegularExpressions::Group*gTime=m->Groups->get_Item(2);

       //定义ppcStations[i]所代表的路线所需时间
       intiNewTime=0;
       //定义是否已经找到起点站的BOOL变量
       BOOLbStartFound=FALSE;

       //j从0到gStation中捕获的个数,即总共捕获到多少个站点1<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击