??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品在线免费观看视频,亚洲JIZZJIZZ妇女,亚洲精品无码不卡在线播HEhttp://www.tkk7.com/coolfiry/category/14261.html认认真真做h,兢兢业业做事!zh-cnTue, 25 Sep 2007 09:27:20 GMTTue, 25 Sep 2007 09:27:20 GMT60转Windows快速创建大文g的三U方?/title><link>http://www.tkk7.com/coolfiry/archive/2007/09/25/148051.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Tue, 25 Sep 2007 06:30:00 GMT</pubDate><guid>http://www.tkk7.com/coolfiry/archive/2007/09/25/148051.html</guid><wfw:comment>http://www.tkk7.com/coolfiry/comments/148051.html</wfw:comment><comments>http://www.tkk7.com/coolfiry/archive/2007/09/25/148051.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/coolfiry/comments/commentRss/148051.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/coolfiry/services/trackbacks/148051.html</trackback:ping><description><![CDATA[ <img src ="http://www.tkk7.com/coolfiry/aggbug/148051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/coolfiry/" target="_blank">Coolfiry</a> 2007-09-25 14:30 <a href="http://www.tkk7.com/coolfiry/archive/2007/09/25/148051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web搜烦引擎设计和实现分析[转蝲]http://www.tkk7.com/coolfiry/archive/2006/11/11/80621.htmlCoolfiryCoolfirySat, 11 Nov 2006 13:37:00 GMThttp://www.tkk7.com/coolfiry/archive/2006/11/11/80621.htmlhttp://www.tkk7.com/coolfiry/comments/80621.htmlhttp://www.tkk7.com/coolfiry/archive/2006/11/11/80621.html#Feedback0http://www.tkk7.com/coolfiry/comments/commentRss/80621.htmlhttp://www.tkk7.com/coolfiry/services/trackbacks/80621.html一、引a

  随着Internet的飞速发展,Z来依靠网l来 查找他们所需要的信息Q但是,׃|上的信息源多不胜数Q也是我们l常所说的"Rich Data, Poor Information"。所以如何有效的d现我们所需要的信息Q就成了一个很关键的问题。ؓ了解册个问题,搜烦引擎随之诞生?

   现在在网上的搜烦引擎也已l有很多Q比较著名的有AltaVista, Yahoo, InfoSeek, Metacrawler, SavvySearch{等。国内也建立了很多的搜烦引擎Q比如:搜狐、新、北极星{等,当然׃它们建立的时间不长,在信息搜索的取全率和取准率上? 有待于改q和提高?

  Alta Vista是一个速度很快的搜索引擎,׃它强大的g配置Q它能够做及其复杂的查询。它主要是基于关键字q行查询Q它漫游的领域有Web? Usenet。支持布查询的"AND"Q?OR"?NOT"Q同时还加上最相近定位"NEAR"Q允讔R配W和"向后"搜烦Q比如:你可以查N接到 某一늚所有Web站点Q。你可以军_是否Ҏ索的短语加上权|在文档的什么部位去查找它们。能够进行短语查询而不是简单的单词查询的优Ҏ很明昄Q? 比如Q我们想要查找一个短?to be or not to be"Q如果只是把它们分解成单词的话,q些单词都是属于Stop WordQ这栯个查询就不会有Q何结果,但是把它当作一个整体来查询Q就很容易返回一些结果,比如关于哈姆L或者是莎士比亚{等的信息。系l对查询l? 果所得到的网늚打分是根据在|页中所包含的你的搜索短语的多少Q它们在文档的什么位|以及搜索短语在文档内部之间的距L军_的。同时可以把得到的搜? l果译成其他的语言?

  Exite是称为具?"的搜索引擎,因ؓ它徏立了一个基于概늚索引。当Ӟ它所谓的""是基 于对概率l计的灵zd用。它能够同时q行Z概念和关键字的烦引。它能够索引Web,Usenet和分cȝq告。支?AND"Q?OR"Q?NOT"{? 布尔操作Q同时也可以使用W号"+"?-"。缺Ҏ在返回的查询l果中没有指定网늚寸和格式?

  InfoSeek是一个简? 但是功能强大的烦引,它的一个优Ҏ有一个面向主题搜索的可扩展的分类。你可以把你的搜索短语和怼的分cȝ录的主题短语怺参照Q而那些主题短语会自动 加到你的查询中去。你的搜烦有更好的主题相关性。同时它也支持对图象的查询。它能够漫游Web,Usenet,Usenet FAQs{等。不支持布尔操作Q但是可以用符?+"?-"Q相当于"AND"?NOT"Q?

  Yahoo实际上不能称为是一 个搜索引擎站点,但是它提供了一个分层的主题索引Q你能够从一个通常的主题进入到一个特定的主题QYahoo对Webq行了有效的l织和分cR比如你? 要徏立一个网,但是你不知道如何操作Qؓ了在Yahoo上找到关于徏立网늚信息Q你可以先在Yahoo上选择一个主题:计算机和InternetQ然 后在q个主题下,你可以发C些子主题Q比如:Web|页制作QCGI~程QJAVAQHTMLQ网设计等Q选择一个和你要扄相关的子主题Q最l你? 可以得到和该子主题相关的所有的|页的链接。也是_如果你对要查扄内容属于哪个主题十分清楚的话Q通过目录查询的方法要比一般的使用搜烦引擎有更? 的准率。你可以搜烦Yahoo的烦引,但是事实上,你ƈ没有在搜索整个Web。但是Yahoo提供了选项使你可以同时搜烦其他的搜索引擎,比如Q? Alta Vista。但是要注意的是Yahoo实际上只是对Web的一部分进行了分类和组l,而且它的实效性也不是很好?

  搜烦引擎的基本原理是通过|络机器人定期在web|页上爬行,然后发现新的|页Q把它们取回来放到本地的数据库中Q用L查询h可以通过查询本地的数据库来得到。如yahoo每天会找到大U?00万个新的|页?

   搜烦引擎的实现机制一般有两种Q一U是通过手工方式对网进行烦引,比如yahoo的网|通过手工分类的方式实现的Q它的缺ҎWeb的覆盖率比较 低,同时不能保证最新的信息。查询匹配是通过用户写入的关键字和网늚描述和标题来q行匚wQ而不是通过全文的匹配进行的。第二种是对|页q行自动的烦 引,象AltaVista则是完全通过自动索引实现的。这U能实现自动的文档分c,实际上采用了信息提取的技术。但是在分类准确性上可能不如手工分类?

  搜烦引擎一般都有一个Robot定期的访问一些站点,来检查这些站点的变化Q同时查找新的站炏V一般站Ҏ一个robot.txt? 件用来说明服务器不希望Robot讉K的区域,Robot 都必遵守这个规定。如果是自动索引的话QRobot在得到页面以后,需要对该页面根据其内容q行索引Q根据它的关键字的情冉|它归到某一cM。页面的? 息是通过元数据的形式保存的,典型的元数据包括标题、IP地址、一个该面的简要的介绍Q关键字或者是索引短语、文件的大小和最后的更新的日期。尽元? 据有一定的标准Q但是很多站炚w采用自己的模ѝ文档提取机制和索引{略对Web搜烦引擎的有效性有很大的关pR高U的搜烦选项一般包括:布尔Ҏ或者是 短语匚w和自然语a处理。一个查询所产生的结果按照提取机制被分成不同的等U提交给用户。最相关的放在最前面。每一个提取出来的文档的元数据被显C给? 戗同时包括该文档所在的URL地址?

  另外有一些关于某一个主题的专门的引擎,它们只对某一个主题的内容q行搜烦和处理,q样信息的取全率和精度相对就比较高?

   同时Q有一cL索引擎,它本w不用Robotd期的采集|页。象SavvySearch ? MetaCrawler是通过向多个搜索引擎同时发问ƈ对结果进行综合返回给用户实现搜烦功能。当然实际上象SavvySearch能够对各个搜索引 擎的功能q行分析和比较,Ҏ不同的用h询提交给不同的搜索引擎进行处理,当然用户自己也可以指定利用哪一个搜索引擎?

  一个优U的搜索引擎必d理以下几个问题:1 |页的分c? 自然语言的处? 搜烦{略的调度和协作 4 面向特定用户的搜索。所以很多搜索引擎不同程度的使用了一些h工智能的技术来解决q些斚w的问题?

  二、网lSpider的实现描q?

   现在有很多文章对Web引擎做了大量的介l和分析Q但是很有对它们的实现做一个详l的描述Q这里我们主要来介绍一个具有基本功能的Web引擎的实现? 本文Q我们以cC++语言的Ş式来描述Web引擎如何采集|页q存攑ֈ数据库中的过E。同时描qC如何Ҏ用户输入的关键字查询数据库ƈ得到相关|页的过 E?

  2.1数据库结?

  首先Q我们要建立一个数据库表用来存放我们得到的|页。这里一般需要徏立如下的表:

  1.字典表的建立Q事实上q里是用文档中有意义的单词和它们的出现频率来代表一个文档?

  该表QWordDictionaryTblQ主要要包括三个字段Q主要是用来存放和一个网늛关的单词的情?

    url_id    Ҏ一个URL的唯一的ID?br />    word      该URL中的l过stem的单?br />    intag    该单词在该网中的出现的ơ数

  2.存储每一个URL信息的表

  该表(URLTbl)中主要的关键字段有:

  rec_id        每一条记录的唯一的ID?br />  status    得到该URL内容的状态,比如HTTP_STATUS_TIMEOUT表示
            下蝲|页的最大允许超?br />  url        URL的字W串名称
  content_type      内容的类?br />  last_modified    最新的更改旉
  title            该URL的标?br />  docsize          该URL的文件的寸
  last_index_time  最q一ơ烦引的旉
  next_index_time  下一ơ烦引的旉
  tag    对于|页Q用来表C它的类型,比如Q是textQ或者是htmlQ?br />                    或者是囄{等
  hops              得到文g时候的曄p|的次?br />  keywords          对于|页Q和该网늛关的关键?br />  description      对于|页Q指|页的内容的描述
  lang              文档所使用的语a

   3.因ؓ|页中有很多单词是一些介词和语气助词或者是非常常用的常用词Q它们本w没有多意义。比如:p中的about,in,at,we,this {等。中文中的如"?Q?一?Q?关于"{等。我们统一的把它们UCؓ停止词(stop wordQ。所以我们要建立一个表Q来包括所有这些停止词。该?StopWordTbl)主要有两个字Dc?
word char(32)    表示那些停止?br />lang char(2)      表示所使用的语a

  4.我们要徏立一个关于robot的表Q我们在前面说过Q所有的|站一般都有一个robot.txt文g用来表示|络上的robot可以讉K的权限。该?RobotTbl)主要有以下字Dc?
    hostinfo          Web站点L的信?br />    path              不允许robot讉K的目?br />
  5.建立我们需要屏蔽的那些|页(比如一些内容不健康的或者没有必要去搜烦的站?的一张表(ForbiddenWWWTbl)Q主要的字段是|页的URL?

   6.另外我们需要徏立一个我们所要得到的文gcd的表(FileTypeTbl)Q比如,对于一个简单的Web搜烦引擎Q我们可能只需要得到后~? htmlQhtmQ?shtml和txt的类型文件。其他的我们只是单的忽略它们。主要的字段是文g的类型和说明?

  其中关于停止词的表的内容是我们要实现要根据各U语a的统计结果,把那些意义不大的单词放进厅R关于文档单词、URL和Robot的表的内定w是在获取Web|页的时候动态增加记录的?

  2.2 具体|页获取法描述

  具体的网늚获取步骤是这LQ?

   我们可以讑֮我们的搜索程序最大可以开的线E的数目Q然后这些线E可以同时在|上q行搜烦Q它们根据数据库中已有的关于|页的信息,扑և那些需要更新的 |页Q如何判断哪些网需要更新是一个值得研究的过E,现在有很多启发式和智能的法Q基本上是基于统计规律进行徏模。最单的当然是设定一个时间范_ 在某个时间范围以前的|页被重新去搜烦一遍)Q然后判断那些网|否在屏蔽表中Q如果是的话Q就从关于URL的表中删除该条记录。否则,我们到相应? WWW站点d到URL指定的文?q里需要注意的是根据不同的URL的特点,需要用不同的协议Q比如对于FTP站点要采用FTP协议Q对于HTTP? 点要采用HTTP协议Q新ȝ点要采用NNTP协议{等)事实上,我们先得到关于该|页的头信息Q如果该|页的最CҎ间和我们最q提取的旉是一L 话,表示该网内Ҏ有Q何更斎ͼ则我们就不必d到它的内容,只需要修Ҏq一ơ更新它的时间ؓ当前的时间就可以了。如果该|页最q做了修改,我们p 得到该网,q对它的内容q行分析Q主要要包括和它相关的链接,把它们加到相应的数据库中Q同时判断网|包含的各U其他的文gQ如文本文g、图形文件? 声音文g和其他多媒体文g是否是我们所需要的文gQ如果是的话Q就把它加到我们响应的数据库中。同时要Ҏ|页的内Ҏ取所有的有意义的单词和它们的出现 的次敎ͼ攑ֈ相应的数据库中。ؓ了更好的描述q个q程Q我们来看跟q个q程相关的主要的几个对象和数据结构。对象主要是针对三个层次来讲的。第一层是针对 WWW服务器,W二层是针对每一个页面,W三层是针对每一个页面的全文的烦引?

  2.3 和实现相关的主要cd象和功能描述下面的结构是针对一个站Ҏ说的?

    Class  CServer {
    主要的属性有Q?br />    char *url;            //WWW站点的URL名称
    char *proxy;          //使用的代理的名称
    char *basic_auth;      //q行基本的HTTP认证
    int  proxy_port;      //代理的端口号
    int  period;          //再次索引的周?br />    int  net_errors;      //|络q接不通的ơ数
    int  max_net_errors;  //可以允许的最大的|络错误
    int  read_timeout;    //下蝲文g允许的最大的延迟
    int  maxhops;          //表示URL可以最大蟩转的深度
    int  userobots;        //是否遵守robot.txt中的U定
    int  bodyweight;  // ?lt; body >....< /body >之间的单词的权重
    int  titleweight; // ?lt; title >....< /title >之间的单词的权重
    int  urlweight;  // 在文档的URL中的单词的权?br />    int descweight;//在?  < META
NAME="Description"        Content="..." >之间单词的权?br />    int  keywordweight; //?lt; META NAME="Keywords" Content="..." >
  之间的单词的权重

  主要Ҏ有:
FindServer();//用来查找该服务器是否存在q可以连?br />FillDefaultAttribute() //用来针对所有的WWW服务器填写默认的属}Q?

以上的对象中的成员变量是和一个站点相关的参数的设|,我们Ҏ有的站点有一个默认的讄Q但是可以对某些站点做一些特D的讄。这些设|可以在配置文g中设定?
  下面是关于文档的l构的主要的数据成员Q?

Class CNetDocument
    主要属性有Q?br />    int    url_id; //该URL的ID?br />    int    status;  //获取该文档时候的状?br />    int    size;  //文档的尺?br />int    tag;  //和该文档相关的标{,表示该文档是
HTMLQTEXT或者是其他cd
    int    hops;    //URL跌{的次?br />    char    *url; //和该文档相关的URL的名U?br />    char    *content_type;      //该内容的cd
    char    *last_modified;    //最q一ơ的更新旉
    char    *title;            //该文档的标题
    char    *last_index_time;  //上次索引的时?br />    char    *next_index_time;  //下次索引的时?br />    char    *keywords;          //该文档中的关键字
    char    *description;      //该文档的描述

  主要Ҏ有:
  FillDocInfo(? //Ҏ数据库,得到该文档相关信?br />  AddHerf(?    //加入|页中存在的新的链接的网址
  DeleteURL(?  //删除一个存在的|址
  CanGetThisURL(? //Ҏ配置军_是否d到该|页
  //下面三个Ҏ是根据不同的URLQ用不同的协议去获得文档
  NNTPGet(?     
  FTPGet(?)
  HTTPGet(?)
  ParseHead(?  //如果是HTTP协议得到的话Q分析头信息
  ParseMainBody(?    //对获得的文档的主体进行分?br />  ServerResponseType (?)  //得到服务器端的响应消?br />  UpdateURLDB(?)  //更新的数据入?br />} Q?br />
  事实上,我们在要提取一个网늚时候,都要建立一个CNetDocument对象Q然后再对这个网进行分析的时候,把相关的内容攑ֈq个CNetDocument的成员变量里面。下面是关于面全文索引的结构的主要数据成员Q?
Class CIndexer {
主要属性有Q?br />  char    *url;      //我们要处理的文档相关的URL的名U?br />  int mwords;      //  我们事先讑֮的一个网늚最大的单词数目
    int nwords;          // 实际的得到的单词的数?br />    int swords;          // 我们已经排序的单词的数目
    WORD *Word;      //所有单词的内容
    char *buf;      //我们为文档所分配的空?br />主要Ҏ有:
  InitIndexer(?    //q行初始讄和分?br />  ParseGetFile(?  //对得到的|页q行全文索引
  AddWord(?    //把网늚可以索引的单词加到Word数组中去
  InToDB(?)    //关于|页全文索引的信息入?br />}Q?br />
  q行|页提取前,我们要徏立一个CIndexer对象Q它主要是用来对|页q行全文的烦引。一般来说我们只对两U类型的URLq行全文索引Q一个是text/htmlQ另外一个是text/plain。其中WORD的数据结构如下:
        typedef struct word_struct {
    int count;  //该单词出现的ơ数
    int code;  //该单词的正常的Ş式,
比如单词可能?encouraging,它的正常的Ş式应该ؓ
encourage,q其实是一U对单词的stem?br />x们只取单词的d部分?br />    char *word;  //该单词的内容
} WORD;

  以下的结构是和网中的一些链接的对象相关的一个数据结?
    typedef struct href_struct {
    char *href;    //该链接的名称
    int hops;      //发生的蟩转次?br />    int stored;    //是否已经存储到数据库?br />} HREF;
 

  所有需要更新的和新产生的URL都被攑ֈq个l构中,当它的数量超q一定的范围以后Q被一ơ性的存入数据库?
  关于URL的一个数据结构如下:

typedef struct url {
char *schema; //表示该URL是通过什么协议得到的Q比如HTTPQ?
              FTPQNNTP{?br />char *specific;    //L的名U加上\?br />char *hostinfo;    //L的名U加上相关的协议端口
char *hostname;    //L的名U?br />char *path;        //在主机的具体的\?br />char *filename;    //文g的名U?br />char *anchor;      //相关的anchor
int  port;        //协议相关的端?br />} URL;

  q是针对URL的一些相关的属性的描述的一个数据结构。事实上在数据库中,我们存储的只是对|页的描q和对一些文本和HTML面的关键词的烦引信息。我们ƈ不存储网늚实际的内宏V?

  三、用h询实现描q?

  关于对用h交的查询h的实现分析:

  用户惌查询某一斚w的信息一般都是通过提供和该领域相关的几个关键字来进行的?

  我们来看一下关于用h询的相关的数据结构和c:

  下面是一个关于单词和它的权值的基本l构Q?

  typedef struct word_weight_pair
    {
      char word[WORD_LEN];
      int weight;
    }word_weight_pair;
   

  下面的类主要是用来对用户的查询进行处理和分析Q?
    Class CUserQuery
    {
char m_UserQuery[MAX_QUERYLEN];  //用户的查询表辑ּ
CPtrArray word_weight_col;
//是关于结构word_weight_pair的动态数l?br />int m_maxReturnSum;  //用户希望q回的最多的|页?br />int search_mode;
CObArray m_returnDoc;  //是关于CNetDocument对象的一个动态数l?br />NormalizeWordQchar* OneWordQ?  //对单词进行归整化Q即Stem.
Find(char* odbcName);  //q行数据库查扑֒匚w
}Q?br />
  pȝ实现的基本的步骤如下Q?

  1.对用戯入的查询表达式进行分析。事实上Q我们在前面的Spider搜烦q程中对文档的表C是通过关键字Ş式描q的Q每一个文档可以表CZؓq样的一个集?

    其中 ::=< 单词或短语名U?>< 单词或短语的权?>

  实际上就是采用矢量空间的表示Ҏ来表C的文档?

   我们对用戯入的查询表达式也采用矢量I间的表C方法。我们认为用戯入的关键字的序代表了它的重要性的E度Q所以对于位|靠前的单词有相Ҏ较高? 优先U,同时我们Ҏ有的内容以短语或者是单词为最原子,q行Stem操作Q即象前面所提到的:比如单词Encouragingp{化成 Encourage的格式。然后去掉那些Stop WordQ比如is ,as{等的单词,q些单词存放在StopWordTbl表中? 然后把所有归整化后的内容攑օ动态数lword_weight_col中去?

  2.对于动态数lword_weight_col? 的每一个元素,即结构word_weight_pairQ包括单词和该单词的权重Q,我们从表WordDictionaryTbl中可以找到和q些单词? 关的记录Q这些记录应该是包括了所有的在word_weight_col中的单词?

  q行|页是否和查询相匚w的计。匹配计的 q程如下Q首先我们对所有的记录按URL地址q行排序。因为可能好几条记录对应的是一个URLQ然后对每一个网进行打分,每一条记录的单词权gؓ INITSCORE*WEIGHT+QTOTALTIMES-1Q?WEIGHT* INCREMENT。其中INITSCORE为每一个单词的基准分数QTOTALTIMES单词在网中的出现的ơ数QWEIGHT是该单词在不同的 内容D出现有不同的权|比如在KEYWORDD,或者是标题D,或者是内容D늭{)。INCREMENT是该单词每多出现一ơ所增加的分数?

  3.Ҏ用户指定的m_maxReturnSumQ显C匹配程度最高的前m_maxReturnSumc?

  四、结束语

   我们利用上面所讨论的机Ӟ在WINDOWS NT操作pȝ下,用VC++和SQL SERVER实现了一个Web搜烦引擎的网|集过E。在建立了一个基本的搜烦引擎的框架以后,我们可以Zq个框架Q实C些我们自p计的法Q比? 如何更好的进行Spider的调度,如何更好的进行文档的归类Q如何更好的理解用户的查询,用来使Web搜烦引擎h更好的智能性和个性化的特炏V?/p>

Coolfiry 2006-11-11 21:37 发表评论
]]>
c++中char * ?char []的区?http://www.tkk7.com/coolfiry/archive/2006/10/16/75467.htmlCoolfiryCoolfiryMon, 16 Oct 2006 11:06:00 GMThttp://www.tkk7.com/coolfiry/archive/2006/10/16/75467.htmlhttp://www.tkk7.com/coolfiry/comments/75467.htmlhttp://www.tkk7.com/coolfiry/archive/2006/10/16/75467.html#Feedback0http://www.tkk7.com/coolfiry/comments/commentRss/75467.htmlhttp://www.tkk7.com/coolfiry/services/trackbacks/75467.html  c++中char * ?char []的区?/a>

问题引入Q?br />在实习过E中发现了一个以前一直默认的错误Q同样char *c = "abc"和char c[]="abc",前者改变其?/p>

容程序是会崩溃的Q而后者完全正?br />E序演示Q?br />试环境Devc++
代码
#include <iostream>
using namespace std;

main()
{
   char *c1 = "abc";
   char c2[] = "abc";
   char *c3 = ( char* )malloc(3);
   c3 = "abc";
   printf("%d %d %s\n",&c1,c1,c1);
   printf("%d %d %s\n",&c2,c2,c2);
   printf("%d %d %s\n",&c3,c3,c3);
   getchar();
}  
q行l果
2293628 4199056 abc
2293624 2293624 abc
2293620 4199056 abc

参考资料:
首先要搞清楚~译E序占用的内存的分区形式Q?br />一、预备知识—程序的内存分配
一个由c/C++~译的程序占用的内存分ؓ以下几个部分
1、栈区(stackQ—由~译器自动分配释放,存放函数的参数|局部变量的值等。其操作方式cM?/p>

数据l构中的栈?br />2、堆区(heapQ—一般由E序员分配释放,若程序员不释放,E序l束时可能由OS回收。注意它与数?/p>

l构中的堆是两回事,分配方式倒是cM于链表,呵呵?br />3、全局区(静态区Q(staticQ—全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静?/p>

变量在一块区域,未初始化的全局变量和未初始化的静态变量在盔R的另一块区域。程序结束后ql?/p>

释放?br />4、文字常量区—常量字W串是攑֜q里的。程序结束后ql释放?br />5、程序代码区
q是一个前辈写的,非常详细
//main.cpp
  int a=0;    //全局初始化区
  char *p1;   //全局未初始化?br />  main()
  {
   int b;?br />   char s[]="abc";   //?br />   char *p2;         //?br />   char *p3="123456";   //123456\0在常量区Qp3在栈上?br />   static int c=0Q ?//全局Q静态)初始化区
   p1 = (char*)malloc(10);
   p2 = (char*)malloc(20);   //分配得来?0?0字节的区域就在堆区?br />   strcpy(p1,"123456");   //123456\0攑֜帔R区,~译器可能会它与p3所?123456"优化成一?/p>

地方?br />}
二、堆和栈的理论知?br />2.1甌方式
stack:
ql自动分配。例如,声明在函C一个局部变量int b;pȝ自动在栈中ؓb开辟空?br />heap:
需要程序员自己甌Qƈ指明大小Q在c中malloc函数
如p1=(char*)malloc(10);
在C++中用newq算W?br />如p2=(char*)malloc(10);
但是注意p1、p2本n是在栈中的?br />2.2
甌后系l的响应
栈:只要栈的剩余I间大于所甌I间Q系l将为程序提供内存,否则报异常提示栈溢出?br />堆:首先应该知道操作pȝ有一个记录空闲内存地址的链表,当系l收到程序的甌Ӟ
会遍历该链表Q寻扄一个空间大于所甌I间的堆l点Q然后将该结点从I闲l点链表中删除,q将

该结点的I间分配l程序,另外Q对于大多数pȝQ会在这块内存空间中的首地址处记录本ơ分配的?/p>

,q样Q代码中的delete语句才能正确的释放本内存I间。另外,׃扑ֈ的堆l点的大不一定正

好等于申L大小Q系l会自动的将多余的那部分重新攑օI闲链表中?br />2.3甌大小的限?br />栈:在Windows?栈是向低地址扩展的数据结构,是一块连l的内存的区域。这句话的意思是栈顶的地

址和栈的最大容量是pȝ预先规定好的Q在WINDOWS下,栈的大小?MQ也有的说是1MQM是一个编?/p>

时就定的常敎ͼQ如果申LI间过栈的剩余I间Ӟ提Coverflow。因此,能从栈获得的I间

较小?br />堆:堆是向高地址扩展的数据结构,是不q箋的内存区域。这是由于系l是用链表来存储的空闲内存地

址的,自然是不q箋的,而链表的遍历方向是由低地址向高地址。堆的大受限于计算机系l中有效?/p>

虚拟内存。由此可见,堆获得的I间比较灉|Q也比较大?br />2.4甌效率的比较:
?ql自动分配,速度较快。但E序员是无法控制的?br />?是由new分配的内存,一般速度比较慢,而且Ҏ产生内存片,不过用v来最方便.
另外Q在WINDOWS下,最好的方式是用Virtual Alloc分配内存Q他不是在堆Q也不是在栈,而是直接在进

E的地址I间中保留一块内存,虽然用v来最不方ѝ但是速度快,也最灉|?br />2.5堆和栈中的存储内?br />栈:在函数调用时Q第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句Q的

地址Q然后是函数的各个参敎ͼ在大多数的C~译器中Q参数是由右往左入栈的Q然后是函数中的局部变

量。注意静态变量是不入栈的?br />当本ơ函数调用结束后Q局部变量先出栈Q然后是参数Q最后栈指针指向最开始存的地址Q也是?/p>

函数中的下一条指令,E序p点l运行?br />堆:一般是在堆的头部用一个字节存攑֠的大。堆中的具体内容q序员安排?br />2.6存取效率的比?br />char s1[]="aaaaaaaaaaaaaaa";
char *s2="bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在q行时刻赋值的Q?br />而bbbbbbbbbbb是在~译时就定的;
但是Q在以后的存取中Q在栈上的数l比指针所指向的字W串(例如?快?br />比如Q?br />#include
voidmain()
{
char a=1;
char c[]="1234567890";
char *p="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇~代?br />10:a=c[1];
004010678A4DF1movcl,byteptr[ebp-0Fh]
0040106A884DFCmovbyteptr[ebp-4],cl
11:a=p[1];
0040106D8B55ECmovedx,dwordptr[ebp-14h]
004010708A4201moval,byteptr[edx+1]
004010738845FCmovbyteptr[ebp-4],al
W一U在d时直接就把字W串中的元素d寄存器cl中,而第二种则要先把指针D到edx中,在根?/p>

edxd字符Q显然慢了?br />2.7结Q?br />堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜Q发出申P、付钱、和吃(使用Q,吃饱了就赎ͼ不必理会

切菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自由度?br />使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由度大?/p>

自我ȝQ?br />char *c1 = "abc";实际上先是在文字帔R区分配了一块内存放"abc",然后在栈上分配一地址lc1q指?/p>

q块地址Q然后改变常?abc"自然会崩?/p>

然而char c2[] = "abc",实际上abc分配内存的地方和上者ƈ不一P可以?br />4199056
2293624 看出Q完全是两块地方Q推?199056处于帔R区,?293624处于栈区

2293628
2293624
2293620 q段输出看出三个指针分配的区域ؓ栈区Q而且是从高地址C地址

2293620 4199056 abc 看出~译器将c3优化指向帔R区的"abc"


l箋思考:
代码Q?br />#include <iostream>
using namespace std;

main()
{
   char *c1 = "abc";
   char c2[] = "abc";
   char *c3 = ( char* )malloc(3);
   //  *c3 = "abc" //error
   strcpy(c3,"abc");
   c3[0] = 'g';
   printf("%d %d %s\n",&c1,c1,c1);
   printf("%d %d %s\n",&c2,c2,c2);
   printf("%d %d %s\n",&c3,c3,c3);
   getchar();
}  
输出Q?br />2293628 4199056 abc
2293624 2293624 abc
2293620 4012976 gbc
写成注释那样Q后面改动就会崩?br />可见strcpy(c3,"abc");abc是另一块地方分配的Q而且可以改变Q和上面的参考文档说法有些不一定,

而且我不能断?012976是哪个区的,可能要通过区的长度,希望高hl箋深入解释Q谢?br /> 



Coolfiry 2006-10-16 19:06 发表评论
]]>
VC++内部COM插g的编E实?/title><link>http://www.tkk7.com/coolfiry/archive/2006/09/30/73101.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Sat, 30 Sep 2006 14:58:00 GMT</pubDate><guid>http://www.tkk7.com/coolfiry/archive/2006/09/30/73101.html</guid><wfw:comment>http://www.tkk7.com/coolfiry/comments/73101.html</wfw:comment><comments>http://www.tkk7.com/coolfiry/archive/2006/09/30/73101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/coolfiry/comments/commentRss/73101.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/coolfiry/services/trackbacks/73101.html</trackback:ping><description><![CDATA[ <strong>一、闲?br /><br /></strong>  今天要谈的话题是COMQ稍微深入一点,不知道大家用qC++Test或者Visual Assistant之类的Y件没有,它们都有个非常引人注目的功能Q那是把它们自w嵌入到VC开发环境中厅R这个功能让我痴q不Ԍ原因只有一个:我想做一个可以嵌入VC开发环境的VC工程解析器,q样用户在VC开发环境中可以直接对当前或所有工E进行各U分析,l计。那么实现它单吗Q简单,Next和Copy卛_L完成Q仅仅这些吗Q不是,它的背后q有博大_深的COM做支撑。不困难与否,q是让我们先试ؓ快?<br /><br />  <b>二、效果图</b><br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img height="121" alt="" src="http://dev.yesky.com/imagelist/06/04/081714w5577v.gif" width="671" /> </div></td></tr></tbody></table><br />  <b>三、实现步骤:</b><br /><br />  <3.1>新徏一?lt;DevStudio Add-in Wizard>cd工程,输入工程名称"CodeAnalyser". <br /><br />  <3.2>q入W二个画面,pȝ要求用户输入插g的名U和描述信息。ƈ且要求用户选择是否需要生成工h以及是否自动dVC事g响应代码?br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img height="357" alt="" src="http://dev.yesky.com/imagelist/06/04/zx439ozgkc13.gif" width="609" /></div></td></tr></tbody></table><br />  <3.3>点击"Finish"l束向导Q进入代码编辑窗口?br /><br />  在这里我们要说的一ҎQ该工程引用了ICommands接口Qƈ从该接口上派生出 CCommandscR该cd成了所有用戯定义函数接口QVC应用E序消息响应和VC调试动作的消息响应工作。当我们真正为CCommandscL加成员函C前我们必d为ICommands接口d相应的函数接口声明。在本工E中我d为ICommands接口d了两个函数接口,它们名字分别为:GetCurDirCommandMethod和QuitCommandMethod声明如下Q?在CodeAnalyer.odl文g?<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>interface ICommands : IDispatch<br />{<br /> // methods<br /> [id(1)] //在Vtable中的函数索引?br /> HRESULT GetCurDirCommandMethod(); //得到VC当前工作目录<br /><br /> [id(2)] //在Vtable中的函数索引?<br /> HRESULT QuitCommandMethod (); //退出VC~辑?br />};</td></tr></tbody></table><br />  在接口ICommandsd接口函数Q那么相应的我们也要在类CCommands中声明和实现ICommands接口函数Q函数的内部代码和普通工E代码没什么区别?br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>//Implement(CCommandscd部接口函数的声明)<br />public:<br />STDMETHOD(GetCurDirCommandMethod)(THIS);<br />STDMETHOD(QuitCommandMethod)(THIS);<br /><br />//Function Code(Ccommandscd部接口函数的实现)<br />//得到当前VC开发环境的工作目录[您也可以让它成ؓ你想要实现的功能代码]<br />STDMETHODIMP CCommands::GetCurDirCommandMethod() <br />{<br /> AFX_MANAGE_STATE(AfxGetStaticModuleState());<br /> VERIFY_OK(m_pApplication->EnableModeless(VARIANT_FALSE));<br /> BSTR bstrCurDir;<br /> m_pApplication->get_CurrentDirectory(&bstrCurDir);<br /> CString str(bstrCurDir);<br /> ::MessageBox(NULL, str, "VC工作目录", MB_OK | MB_ICONINFORMATION);<br /> VERIFY_OK(m_pApplication->EnableModeless(VARIANT_TRUE));<br /> return S_OK;<br />}<br /><br />//退出VC开发环?br /><br />STDMETHODIMP CCommands::QuitCommandMethod()<br />{<br /> AFX_MANAGE_STATE(AfxGetStaticModuleState());<br /> VERIFY_OK(m_pApplication->EnableModeless(VARIANT_FALSE));<br /> if(::MessageBox(NULL,"您想退出VC++~辑器吗(Y/N)?","询问信息...", MB_YESNO | MB_ICONQUESTION) == IDYES)<br />  m_pApplication->Quit();<br />  VERIFY_OK(m_pApplication->EnableModeless(VARIANT_TRUE));<br /> return S_OK;<br />}</td></tr></tbody></table><br />  <3.4> 创徏工具栏,q接工具栏按钮事?br /><br />  所有的q后工作已经准备qAQ只差个工具栏界面就一切OK了。打开cCDSAddIn,它里面有三个成员函数Q其中OnConnection和OnDisconnection成员函数的意义非帔R要。它们的意义如下Q?br /><br />  <1>OnConnectionQ插件的初始化Q务都在这里完成。如COM服务的启动,工具?菜单栏的创徏Q工h按钮/菜单的d与修改等{?br /><br />  <2>OnDisconnectionQ插件的卸蝲工作都在q里完成。如COM服务的卸载,工具?菜单栏的销毁,释放{等?<br /><br />  了解了它们各自的用途之后我们就可以在相应的消息事g中添加代码了。很昄工具栏的初始化应该在OnConnection事g中完成?br /><br />  在OnConnection事g中系l首先获得了VC应用E序接口Q然后调用一个接口函?AddCommand来ؓ插gd命o和命令媄函数。然后再使用另外一个接口函数AddCommandBarButton向工h中添加工h按钮Q其中每个工h按钮会和一个命令标志符Lq接Q这样就能实现按钮和命oQ消息)之间的一一对应。下面是d一个命令和一个工h按钮的代码(如果你要d多个工具栏按钮只要重复此步骤卛_Q: <br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1"><tbody><tr><td>LPCTSTR szCommand = _T("GetCurDirCommand"); <br />VARIANT_BOOL bRet;<br />CString strCmdString;<br />strCmdString.LoadString(IDS_CMD_STRING);<br />strCmdString = szCommand + strCmdString;<br />CComBSTR bszCmdString(strCmdString);<br />CComBSTR bszMethod(_T("GetCurDirCommandMethod"));<br /><br />CComBSTR bszCmdName(szCommand); //和下面添加工h按钮对应<br /><br />VERIFY_OK(pApplication->AddCommand(bszCmdString,bszMethod,0,dwCookie,&bRet));<br />//AddCommand 参数含义Q?br />//bszCmdStringQ命令字W串?br />//bszMethodQIcommands接口函数名?br />//W三个参C表位囑ցU量?br />//W四和第五个参数分贝为系l参数和q回|参照MSDN的IApplication介绍Q?<br /><br />if (bRet == VARIANT_FALSE)<br />{<br /> *OnConnection = VARIANT_FALSE;<br /> return S_OK;<br />}<br /><br />//d工具栏按?br />if (bFirstTime == VARIANT_TRUE)<br />{<br /> VERIFY_OK(pApplication->AddCommandBarButton(dsGlyph, bszCmdName, m_dwCookie));<br />}</td></tr></tbody></table><br />  <3.5> ~译Q连接及在VC中引入插?br /><br />  以上是我们所有的代码工作Q接下来赶快Build以下吧。编译通过的话Q在你的工程Debug目录下会有个dll文g。然后打开VC~辑器,在VCM一个工h上点击鼠标右键,弹出如下图所C单。然后选择”Customize”子菜单,打开如下图所C的工具栏定制窗口:<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img height="345" alt="" src="http://dev.yesky.com/imagelist/06/04/nf483785wv6z.gif" width="118" /><img height="357" alt="" src="http://dev.yesky.com/imagelist/06/04/fna9ccqwmu5a.gif" width="581" /></div></td></tr></tbody></table><br />  接着选择该窗口的最后一?Add-Ins and Macro Files"出现下图所C窗口?br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img height="357" alt="" src="http://dev.yesky.com/imagelist/06/04/u19m0a685dxl.gif" width="582" /></div></td></tr></tbody></table><br />  然后点击”Browse...”按钮,q时打开你工E下的Debug目录中的DLL文gQ这样你可以看C制作的工h了。同样你再次打开上面的菜单,q次可以看到多了一个工hQƈ且名字ؕ七八p的Q怎么改变工具栏的名字呢?Ҏ很简单:打开上面H口中的”Toolbars”选项,在工h列表框中扑ֈ你的工具栏,然后在”Toolbar name”编辑框中输入你惌的名字即可。再打开上面的菜单看看名字是不是变了Q哈哈! <br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img height="322" alt="" src="http://dev.yesky.com/imagelist/06/04/h9ar3t98rs66.gif" width="581" /></div></td></tr></tbody></table><br />  OKQ今天的话题p到这里?<img src ="http://www.tkk7.com/coolfiry/aggbug/73101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/coolfiry/" target="_blank">Coolfiry</a> 2006-09-30 22:58 <a href="http://www.tkk7.com/coolfiry/archive/2006/09/30/73101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google Desktop插g开发之建立开发环?/title><link>http://www.tkk7.com/coolfiry/archive/2006/09/30/73098.html</link><dc:creator>Coolfiry</dc:creator><author>Coolfiry</author><pubDate>Sat, 30 Sep 2006 14:55:00 GMT</pubDate><guid>http://www.tkk7.com/coolfiry/archive/2006/09/30/73098.html</guid><wfw:comment>http://www.tkk7.com/coolfiry/comments/73098.html</wfw:comment><comments>http://www.tkk7.com/coolfiry/archive/2006/09/30/73098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/coolfiry/comments/commentRss/73098.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/coolfiry/services/trackbacks/73098.html</trackback:ping><description><![CDATA[ <div id="hzrdlzb" class="guanggao"> <span id="ad3"> </span> </div> <div id="tr3x5f5" class="guanggao"> <span id="contentAdv"> </span> </div>  Google推荐的开发环境是VS 2003QGoogleDesktop的插件是ZCOM的,而COM是语a无关的,所以你可以用Q何能开发COM的工P语言Q开发?<br /><br />  如果你用的VS 2003或者VS 2005Q徏立开发环境非常容易。不q,如果你像我一h旧,q是喜爱VC6的简z快速,排斥庞大~慢的VS 2003或者VS 2005Q可能就要费一点周折了?br /><br />  q里只讨论VC6的环境设|?br /><br />  Google没有为VC6 提供开发向|也就是说Q所有代码你都得手工q写。如果是Z学习的目的,手工dq些代码Q付出的力_会有所回报的。另外,VC6所带的ATL版本也有点老,一些类只有在新版本中才有,在VC6中无法用,所以有时你不得不面对一些COM的细节问题。同P同样如果Z学习的目的,所p的时间也是值得的?br /><br />  建立开发环境的W一步就是下载GoogleDesktop的SDKQ下载地址为http://desktop.google.com/?br /><br />  解开之后QGD_SDK\api目录下有下面几个目录Q?br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e1e1e1" border="1"><tbody><tr><td>documentation<br />samples<br />tools<br />wizards</td></tr></tbody></table><br />  先大概看一下documentation中的文档Q然后阅读samples中的部分代码Q找一下感觉?br /><br />  GoogleDesktop提供全部接口都在三个IDL文g中声明:<br /><br /><table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e1e1e1" border="1"><tbody><tr><td>GoogleDesktopActionAPI.idl<br />GoogleDesktopAPI.idl<br />GoogleDesktopDisplayAPI.idl</td></tr></tbody></table><br />  开发GoogleDesktop的插Ӟ有以上文件已l够(当然你要安装GoogleDesktop本nQ了。但是C++中不能直接用idl文gQ要通过midl.exe~译成头文gQ才能用。其实不用这么麻烦,GD_SDK\api\samples\common目录中已l有相关头文件了Q?br /><br />GoogleDesktopDisplayAPI.h<br /><br />GoogleDesktopComponentRegistration.h<br /><br />GoogleDesktopAPI.h<br /><br />GoogleDesktopActionAPI.h<br /><br />  直接使用q几个头文gQ可以省ȝmidl~译步骤。只要修改VC6的设|,让它可以扑ֈ上述头文件就行了。有两种方式可以做到q一炏V一U方式是针对当前目的:<br /><br />  1. 打开菜单Project->Settings<br /><br />  2. 打开属性页的C/C++标签<br /><br />  3. 选择Categary的Preprocessor?br /><br />  4. 在Additional Include directories一栏加入上q文件所在的目录<br /><br />  另一U方式是针对VC6所有的目的:<br /><br />  1. 打开菜单Tool->Options?br /><br />  2. 打开属性页的Directories标签<br /><br />  3. 选择Show directories for中的include files?br /><br />  4. 在Directories中加上述文g所在的目录<br /><br />  至于选择哪一U方式,完全看你个h爱好Q后者会方便一点,Ҏ人比较适用Q但它会影响所有的VC6目Q或怼有某些副作用?br /><img src ="http://www.tkk7.com/coolfiry/aggbug/73098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/coolfiry/" target="_blank">Coolfiry</a> 2006-09-30 22:55 <a href="http://www.tkk7.com/coolfiry/archive/2006/09/30/73098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>N皇后问题 http://www.tkk7.com/coolfiry/archive/2006/09/27/72397.htmlCoolfiryCoolfiryWed, 27 Sep 2006 14:20:00 GMThttp://www.tkk7.com/coolfiry/archive/2006/09/27/72397.htmlhttp://www.tkk7.com/coolfiry/comments/72397.htmlhttp://www.tkk7.com/coolfiry/archive/2006/09/27/72397.html#Feedback0http://www.tkk7.com/coolfiry/comments/commentRss/72397.htmlhttp://www.tkk7.com/coolfiry/services/trackbacks/72397.html阅读全文

Coolfiry 2006-09-27 22:20 发表评论
]]>
多线E与一个端口的问题http://www.tkk7.com/coolfiry/archive/2006/08/19/64568.htmlCoolfiryCoolfirySat, 19 Aug 2006 14:49:00 GMThttp://www.tkk7.com/coolfiry/archive/2006/08/19/64568.htmlhttp://www.tkk7.com/coolfiry/comments/64568.htmlhttp://www.tkk7.com/coolfiry/archive/2006/08/19/64568.html#Feedback1http://www.tkk7.com/coolfiry/comments/commentRss/64568.htmlhttp://www.tkk7.com/coolfiry/services/trackbacks/64568.html不知道在一个进E中的多U程同时q行,使用同一端口会出C么样的情?

比如:开5个线E下?下蝲的时?每一个线E是否是能正的接收到数?如果?那么Socket是针对线E?但那L?q几个线E就不能同时使用一个端口了,应该是会报差的哈.

q有一?在下的时候好像可不指明接入的端口号哈?



Coolfiry 2006-08-19 22:49 发表评论
]]>
վ֩ģ壺 þóѲ| ŮƵվ| þþžѸƵ| պƬѿ| Ůۺһ| ëƬƵ| ޾Ʒbv߹ۿ| ҳƵ߹ۿ| ޳ߵӰɫ| ۺƵ| ޶·Ļ߿| 91Ƶ| ɫͼѧ| ƷۺһƵ| ѿƷþ| ޹˾þһҳ| ĻƵѹۿ| avƬ߹ۿ16Ů | 99ƷƵƵѹۿ| AVպƷþþþþþ| þþþþþþþùƷ| վƵ߹ۿ| ȫëƬ߲| Ƭ߹ۿ| һþۺ³³| ɫҹƵѲ| þƷAV鶹Ƭ| þþþþƵ| ɫַȫ| ޸Ʒһ| ƵƷѹۿ99| 337Pձŷ޴ͼ| ޾Ʒ߹ۿ | ޳ɫӰԺ| ƷһVR| ޾ƷĻ| 2020| 99ѹۿƵ| avһۿ| רһvav| 2022ĻƵ |