codeblocks怎么用加完/* */在删除看作业字不认识了怎么回事

简介:本文档为《codeblocks安装说明,介绍.docdoc》,可适用于综合领域,主题内容包含codeblocks安装说明,介绍doc目录封皮………………………………………………………………………………………………………………目录………………符等。

codeblocks安装说明,介绍doc目录封皮………………………………………………………………………………………………………………目录………………………………………………………………………………………………………………前言…………………………………………………………………………………………………………安装Code::Blocks……………………………………………………………………………………………下载……………………………………………………………………………………………………安装……………………………………………………………………………………………………Code::Blocks的编程环境配置………………………………………………………………………………环境……………………………………………………………………………………………………编辑器………………………………………………………………………………………………编译器和调试器………………………………………………………………………………………编写程序………………………………………………………………………………………………创建一个工程…………………………………………………………………………………………添加和删除文件………………………………………………………………………………………编辑文件………………………………………………………………………………………………编译程序……………………………………………………………………………………………调试程序………………………………………………………………………………………………阅读别人编写的程序…………………………………………………………………………………附录………………………………………………………………………………………………………Linux下安装Code::Blocks………………………………………………………………………………MacOSX下安装Code::Blocks…………………………………………………………………………Code::Blocks搭配高版本gcc编译器……………………………………………………………………安装配置boost…………………………………………………………………………安装配置Qt……………………………………………………………………………………………特别说明对该文件进行测试。一般而言debug版本的目标文件通常较大因为它包含了一些用于测试的额外信息release版本的目标文件一般较小因为它不包含调试信息。当您的程序编译完毕应该交付release目标文件。删除文件我们前面创建的文件samplehpp仅仅是为了示例说明如何创建文件因此并不是project所必须的需要把它从project中删除。删除这个文件方法很多这里简要说明两种一种方法是用鼠标点击图标上的这样Headers就会展开选择samplehpp按下鼠标右键弹出的菜单中选择按钮Removefilefromproject则samplehpp就不在隶属于project了见右图。我们还可以从主菜单选择Project的下拉菜单中选择Removefiles…按钮这样会弹出一个对话框对话框中是当前处于激活状态工程project的所有文件需要把哪个文件从该工程中删除则选中那个文件然后选择OK。见右图。当用鼠标点击OK按钮后还会弹出一个对话框让您确认选择Yes则此文件samplehpp就不再隶属于当前工程project了见右下图。编辑文件编辑已经存在的文件前需要首先打开这个文件。打开文件的方法很多由于Code::Blocks会默认记住打开的文件路径进入Code::Blocks主界面后可以看到最近用Code::Blocks打开过的工程以及最近打开过的文件。见右下图中图标右侧用红色方框框起来的部分Recentprojects以及Recentfiles。用鼠标选择之即可打开对应的工程或文件。见右图中用粉红色方框框起来的部分用也可以选择带有标签Openanexistingproject的图标鼠标点击它则会弹出一个对话框见右下图让您选择要打开的工程选中对应文件名点击Open按钮。还可以从主界面Edit主菜单下面的图标见左下图。点击该图标会弹出一个对话框对话框见右图然后找到要打开的文件选中它点击Open按钮也可以打开相应的工程或者文件。打开一个工程后再打开工程中的某个文件则显示该文件的源代码见下图。假设我们想修改此文件的源代码让它求出三个整数中的最小值则可以这样做。首先我们修改maincpp的源代码修改完毕后我们保存当前文件。保存当前文件方法很多常见的有两种一种是用鼠标点击一下按钮见下图。另外一种方法是在主菜单File的下拉菜单中选择按钮见下图。假如我们想保存project中的所有文件可以找到图标用鼠标点击它一下即可或者从File的下拉菜单中找到按钮用鼠标点击一下也可。如果我们想保存整个project工程也可以从File的下拉菜单中找到按钮点击一下则就保存了project。此外File的下拉菜单中还有按钮用来保存当前工作空间中的所有工程按钮用来保存当前工作空间按钮用来保存Code::Blocks已经打开的所有内容。如果我们想给当前文件创建一个副本改成其它名字则在File的下拉菜单中选择按钮取一个新名字保存之如果我们想给当前工程创建一个副本改成其它名字则在File的下拉菜单中选择按钮取一个新名字保存之。此外还有等。如果想关闭当前文件选择File下拉菜单中的按钮关闭当前工程选择按钮。关闭所有文件就选择按钮关闭所有工程选择按钮。注意到编辑后的main函数源代码中添加了一行#include“maxminhpp”maxminhpp是一个头文件该头文件包含了两个函数一个是max一个是min分别用来求出两个整数的较大和较小者。现在我们需要建立这个头文件并把它添加到project中。添加文件到工程的方法前面已经有所论述在此不再重复假设我们已经编辑完毕maxminhpp头文件并添加到project中如上图。如果编写的源代码较多有时候可能需要查找和替换某个字符窜。Search主菜单的下拉菜单中有几个按钮用来对文件内容进行操作可以查找和替换等见右上图。此外还有一些快捷按钮可以完成查找(Find)或替换操作(Replace)见上图用红色方框框起来的两个按钮。该快捷菜单上还有其它功能按钮Undo(向前反悔),Redo(向后反悔),Cut(剪切),Copy(复制),Paste(粘贴)等操作简单实用。Edit下拉菜单提供了更加丰富的功能按钮除了上述这些外还有Comment(注释)去掉注释(Uncomment)Folding(折叠)Fileencoding(文件编码选项)等等见左下图。此外编辑模式下按下鼠标右键弹出的快捷菜单中也有很多编辑选项见右下图。编译程序编译一个工程前先从Project的下拉菜单中找到Buildoptions…选项见右图。用鼠标点击Buildoptions…按钮会弹出一个关于project的对话框有两个类别debug和release首先配置debug选项一般而言只关注CompilerFlags菜单下的两项Producingdebuggingsymbolsg和EnablestandardcompilerwarningsW。前者表示产生调试信息后者意味着给出标准的编译警告信息分别打勾见上图。然后配置Release选择子菜单CompilerFlags下的Optimization选项对于普通的应用选择两项足矣分别是Stripallsymbolsfrombinary(minimizessize)s和Optimizefully(forspeed)O这两项前面打勾见下图。从debug切换到Release会弹出一个对话框选择Yes。见上图。编译一个工程或者文件的功能按钮都在Build下拉菜单见左图。此外编译程序还有快捷菜单见下图。两个菜单中按钮图标相同的功能也相同。表示编译当前工程表示运行编译成功的文件表示编译并运行。如果编译当前文件可以使用Build下拉菜单中的按钮也可以展开左侧的工程目录树移动鼠标到需要单独编译的文件上面利用鼠标右键弹出菜单中选择Buildfile按钮见右图。如果一次编译不成功修改后重新编译可以使用按钮Rebuild它代表重新编译如果想清楚上次编译的目标文件可以使用Build的下拉菜单中的Clean按钮。根据客观需要我们可以把目标文件编译成debug或者release版本用鼠标从快捷菜单上的Buildtarget小窗口进行选择即可见下图。作为例子我们用C语言编写一个求一个随机整数集合中最小值的程序。首先建立工程findmin编写程序(程序源代码见本章的下一小节)然后编译。首先选择编译目标文件为debug版本用鼠标点击快捷菜单上的按钮则开始编译编译完毕后日志窗口有一些提示信息见下图。我们选择目标文件为release版本再编译编译完毕后日志窗口有一些提示信息见下图。如下图。运行该目标文件(debug或者release版本)可以用鼠标点击快捷菜单上的按钮则一种可能的运行结果(由于使用的随机数因此每次运行结果可能都不相同)见下图。生成debug和release版本的二进制文件运行结果相同但它们二进制文件大小不同此处findmin的debug版本二进制文件大小KBrelease版本的二进制文件大小KB。由于前者包含了一些测试信息所以它的二进制文件较大。一次编译成功当然最好但是很多时候不能一次编译成功这时需要根据给出的出错信息修改源程序然后重现编译可能需要反复这个过程直到编译成功。编译成功说明没有语法错误但未必没有逻辑错误程序中的逻辑错误需要您自己检查当然了您可以使用调试工具帮助检查逻辑错误。再看一个例子下面这个例子用来查看当前编译器的补白(padding)也有很多人称补白为对齐(alignment)补白是编译器为了提升程序执行速度让不同数据类型占用同样的长度一起处理从而减少CPU取指令次数提升运算速度。下面给出的代码不能一次编译成功需要我们找到问题所在并改正其中的语法错误。编译提示信息见如下贴图。上面的提示大致意思是:“出错:在返回类型后新类型必须定义”“注意:可能padding定义后少了一个分号”“出错:main中声明了两个或者更多个类型”修改源程序中的错误技巧性非常强如果程序不能通过编译那么根据出错的提示信息修改源程序时能看懂哪些错误信息就先修改哪里的错误有时可能源程序仅一两个错误但编译器提示错误信息给出很多这些错误信息中很大一部分可能没有任何帮助价值我们需要找出对我们有意义的错误信息。有时我们发现修改完一个错误重新编译后原来给出的很多错误信息突然变得少多了。此外如果您经常编程最好能读懂编译器给出的提示信息。如果您的计算机专业英语非常好那将对您的编程有很大作用不仅仅是看编译器给出的提示信息方便了修改程序中的语法错误而且编程过程中经常需要查阅函数的说明文档计算机专业英语对于编程有很大帮助。现在开始修改错误。我们首先去找padding的定义看看是否忘记了一个分号。查找padding的声明或者实现很简单选中padding则padding变成了灰色所有和padding相同的字符窜都变成了红色(注:笔者使用了比较新的Code::Blocks版本如果您用的版本比较旧则可能没有这样的功能颜色可以设置不一定是红色)按下用鼠标右键在弹出的快捷菜单中选择按钮见下图。选中它后屏幕会自动切换到padding的实现我们发现padding类最后果然少了一个分号见下图。加上这个分号后点击按钮保存当前文件paddinghpp然后点击按钮编译。结果又有出错信息见下图。我们想修改哪行出错的代码就用鼠标在下面的提示信息栏选中它然后双击鼠标左键则屏幕自动切换到那行处。我们先不管第行看看第行提示说char前本应该有第行是个空行不要忘记编译器会忽略掉空行和注释因此我们查看前一行第行发现果然丢了一个分号。补上一个分号保存然后继续编译。这下编译成功了提示信息见下图。再编译一个release版本(Buildtarget:栏目选择Release然后编译)运行之结果见下图。注意:编译以上程序需要事先建立工程padding并设置好相应编译选项(Buildoptions…)跟前面建立Project时设置编译选项类似为了节约篇幅这里就没有赘述。因为系统默认一些选项所以大多数情况下不用理会编译选项的设置也能正常编译程序但是编译程序时产生的提示信息未必就是您感兴趣和期望的例如有人可能希望产生标准的出错和警告信息有人则可能希望产生任何可能的出错和警告信息个别人则希望什么提示信息都没有从而省得心烦再者期望产生目标代码的类型可能也不同有人可能希望最高级优化有人则可能希望专门针对某种CPU优化还有人可能认为是否优化无所谓。鉴于此最好根据个人喜好和实际情况设置这些编译选项。我们接下来再看一个例子。以下程序用来交换两个不同的值由于我们并不知道要交换的值的类型所以就使用模板参数类型用指针当交换的两个值是整数的时候进行特化参数类型用引用。为了知道调用了那个swap函数进行交换在swap函数体里面我们附加输出一点信息。跟往常一样我们先建立一个工程工程名取undefined然后配置该工程的调试和编译参数。配置这些选项:以便让编译器给出标准的提示信息当生成debug版本的二进制文件时产生调试信息当需要生成release版本的二进制文件时进行三级优化让生成的二进制文件占用空间比较小。建议读者自行配置以上几个编译参数选项作为练习。编译以上程序产生如下提示信息。如此简单的一个小程序居然产生了个警告信息而且编译器还报告个错误。首先我们看警告信息警告说第,,,行多个字符字符常量第行不建议把字符窜常量转换成char*。用鼠标双击第一行编译信息则自动跳到了main函数的第行前面出现一个红色的方框见下图。果然把两个换行符冠以单引号了两个字符组成了一个字符窜应该冠以双引号再看其它行上的几个出现同样的问题了。用Replace一次性全部取代改正过来并保存当前文件。再看第行我们使用的是C语言风格定义了字符窜语法上没有问题暂且不用管它。接下来看看编译错误信息。第行把constchar*类型转换成char类型。仔细看一看发现第二个字符窜定义少些了一个*结果编译器认为是把”string”这个常量字符窜赋值给一个字符变量str了见下图。加上*保存当前文件然后再编译这次的编译提示信息如下。只有警告不建议的C风格字符窜常量转换了。暂且不用理会先运行看一下结果再说。结果并不理想疑点很多见下图中红色文字标示。值假设a=,d=保存当前文件。然后看看第行到底先改正容易修改的错误给a和d赋初调用了哪个swap因为我们的swaphpp没有跟这个调用相匹配的函数去能编译不出现语法错误实在蹊跷那我们就看看到底调用了哪个swap。选中swap(显示灰色)按下鼠标右键在弹出的快捷菜单中选择见下图。弹出一个对话框显示了所有可能的swap函数头见下图。居然有这么多的swap前两个是我们自己定义的后面的是系统自带的。不要忘记前面的usingnamespacestd这会污染整个std命名空间这样使用是OOP的大忌~注释掉usingnamespacestd加一行usingstd::cout然后重新编译看看结果如何。最可能的匹配是voidswap(int,int)但是参数类型却不合适因此编译器报错。知道原因就好改正方法非常简单改成swap(c,d)就可以了。接下来我们看看为何两个字符窜的值不能交换吧。从输出信息可知调用voidswap(T*,T*)但是这个函数实现中有个判断是否相等的比较if(*x!=*y)而此刻的*x和*y都是字符’s’(两个字符窜的首个字符相等)自然后面的三个语句根本就不执行不要忘记判断字符窜是否相等的C语言库函数是strcmp而绝非直接判断是否相等。那怎么修改呢,最简单的办法是用C的string处理这个问题把字符窜当成对象来处理。main函数前加一行#include<string>然后用std::string定义字符窜即std::stringstr(“string”),str(“string”)交换两个字符窜最好的办法是用std::string的成员函数swap这样不需要复制字符窜内容仅仅交换指针就可以了也就是strswap(str)。讲过上述这些修改后保存重新编译并运行得到的结果如下图。调试程序伴随着编写的程序愈来愈复杂我们往往很难一次性编译成功并运行得到我们期望的结果(虽无语法错误但可能有逻辑错误)这时需要对程序进行调试以便定位错误。调试程序有时需要在程序中的某些地方设置一些特殊“点”让程序运行到该位置停下来有时需要检查某些变量的值以帮助我们检查程序中的逻辑错误。调试程序之前首先要确认已经设置了Producedebuggingsymbolsg选项按照如下顺序去找(>表示下一步):Project>Buildoptions…>findmin>Debug>CompilerFlags>Producedebuggingsymbolsg如果该项已经配置则可以调试程序了否则前面打勾点击OK按钮设置好。下面将会通过具体的例子简要讲述调试器的使用。面向过程风格的程序假设我们有一个随机数集合该集合内随机数个数随机(为了便于观察结果是否正确我们假设该集合中随机数少于个)要求找出最小的那个随机数。从一批数据中找到我们需要的某一个方法很多为了简单起见我们使用顺序搜索算法。用C语言编写程序实现以上题目要求写了三个文件一个源文件(mainc)两个头文件其中一个头文件(findminh)用来找出最小的随机数一个头文件(outputallh)用来输出这个随机数集合中的所有随机数代码见下贴图。上面贴图中右图是工程findmin的展开图。为了节约篇幅这里不讲述findmin怎么建立的(前面已经讲述了怎么建立工程)也不详细解释代码(代码中有注释)仅仅讲调试过程。首先要在程序中设置一个点让程序运行到这个位置暂停把光标置于您想启动跟踪程序运行过程的这行代码的前一行再用Debug下拉菜单中或者调试程序快捷菜单上的RuntoCursor按钮启动调试器。(启动调试器的另一种方法是用Debug下拉菜单中的Togglebreakpoint按钮先设置断点然后点击Start开始按钮来启动调试器。)接下来就要告诉跟踪程序运行到哪里再次停下来以便我们检查此刻的运行结果我们可以把光标置于该行代码前然后再次点击RuntoCursor按钮则程序运行到此处就停下来此处称谓断点可以用Debug下拉菜单中的Togglebreakpoint按钮设置断点在一个断点前再次Togglebreakpoint则该段点就被删除如果想删除所有断点可以用Debug下拉菜单中的Removeallbreakpoints按钮。如果我们希望每次总是运行到程序下一行前面则可以点击Debug下拉菜单中或者调试程序的快捷菜单上按钮Nextline如果我们不想每次执行一行代码希望执行的单位更小可以逐条执行指令(Nextinstruction)如果运行到某个程序块(例如调用某个函数)还可以选择按钮Stepinto则运行到该代码块内如果希望跳出该代码块则可以选择按钮Stepout。如果希望终止调试器可以选择Continue按钮则调试器会自然运行到结束也可以用Stopdebugger则调试器就会被强行终止调试过程结束。在程序执行到输出语句前屏幕始终不显示任何信息。如果我们希望查看程序中变量的值则可以从Debug下拉菜单中选择Debuggingwindows子菜单的Watches按钮也可以从快捷菜单按钮下找到Watches按钮。下面用示意图说明调试findmin的过程。()启动调试器把光标置于intmain之前点击Runtocursor按钮则可以看到{前面有个黄色的箭头而且还会出现了一个没有任何输出信息的对话框如下图。()打开观察窗口为了查看程序运行中变量值的变化情况需要打开观察变量的窗口用快捷菜单上按钮的下拉菜单中Watches打开即可(也可以用Debug>Debuggingwindows>Watches打开)。Watches窗口见右图。为了方便观察整个调试过程布局拖动Watches窗口到左下角并展开各个变量如下图。此时从Watches窗口中可以看到定义的局部变量都是随机值因为程序尚未执行到给这些变量赋值的语句。()执行到下一行(第行代码)见下面的截图输出信息窗口仍然什么都不显示观察变量值的窗口局部变量的值都是系统赋予的随机值(左下角红色文字部分)。()执行到第行把光标放到第行代码前面点击RuntoCursor按钮见下图。由于第行语句已经被执行从观察窗口可以看到局部变量MOD=,SZ=(观察窗口红色文字部分)此外日志窗口的调试器Debugger栏目也出现了一些文字显示了mainc被执行的代码。()执行到第行把光标放到第行代码前面点击RuntoCursor按钮见下图。()执行到outputall函数把光标置于第行前执行到此行然后用鼠标点击Stepinto则出现如下界面。从上图可以看出由于执行到函数outputall的第行函数参数v和n已经被赋值但是NL,M,i三个局部变量都是系统赋予的随机值但是执行到第行前的时候三个局部变量都已被正常赋值见下图。点击Stepout按钮则跳出outputall函数体此时outputall函数已经执行完毕见下图。从上图日志Debugger栏目的信息可以看出outputall函数已经执行完毕重新进入mainc函数体并已经执行完第行代码并且屏幕显示了一些信息(outputall函数刚执行完毕后的结果)见下图。()执行到findmin函数把光标置于main函数第行前然后点击RuntoCursor按钮再点击Stepinto按钮则进入findmin函数体见下图。从上图可以看出已经执行到findmin函数的第行代码前此时findmin函数的参数已经被赋值但是局部变量j和i仍然是系统赋予的随机值(因为第行代码尚未执行)。把光标置于第行代码前点击RuntoCursor按钮此时局部变量j已经得到确定值(最小值下标)由于循环体已经执行完毕因此i得到(跟传递进来的数组大小值相同等于该次n的值)见右边Watches窗口的截图。点击Stepout按钮则跳出findmin函数体重新进入main函数见下图。()输出最小值把光标置于第行代码前面点击RuntoCursor按钮可以看到Watches窗口已经显示局部变量min的值为见下图。由于main函数同时输出信息窗口也显示了最小值见下图。用鼠标点击Continue按钮继续运行则输出如下信息见下图(如果您使用的中文版操作系统最下一行信息可能是:按任意键继续((()。程序运行完毕用鼠标点击Stopdebugger按钮关闭调试器即可。以上程序中也可以不用在堆上动态分配空间(见main函数第行代码)由于需要的空间不太大可以使用数组在栈上分配空间即可。本小结例子中的程序编译运行结果正确没有逻辑错误这样的程序无需调试只不过为了说明怎么使用gdb调试器而进行调试的。面向对象风格的程序以下有一个cstrwrapper的类用来封装C风格的字符窜仅仅对C风格的字符窜进行引用(不做深层复制)提供了一些必要的成员函数。本程序中不止一处有逻辑错误现在使用gdb调试器来找出错误的位置和原因。建立一个工程取名为uglystr(取这个名字的原因很简单因为这样设计封装C风格字符窜很愚蠢)该工程中有四个文件maincpp,cstrhpp,refhh,copyhh。其中cstrhpp定义了cstrwrapper,对C风格字符窜进行封装refhh和copyhh是两个测试函数分别测试引用和复制字符窜时是否工作正常。建立的这个工程跟上小节中共用一个Workspace(工作空间名字随便取)编译或者调试这个工程前需要激活它(让系统知道你对它操作而不是对原来的findmin工程操作)激活的方法很简单选中工程名uglystr按下鼠标右键弹出的菜单中选择Activateproject则该工程此时就处于激活状态原来激活状态的findmin工程进入休眠。编译并运行之见下面弹出的窗口居然没有显示任何信息~按钮运行之打开Watches窗口见下图。设置一个断点点击从上图中可以看出已经建立对象s但是它的值(指针)为不指向字符窜。在位Windows系统上操作系统占用低地址地址为的内存禁止用户程序访问访问系统占用内存是非法操作如果您懂gcc汇编的话打开汇编窗口或者用鼠标点击Nextinstruction按钮就可以看到汇编代码更容易看出问题。查看cstrwrapper的构造函数发现有这样一个函数头cstrwrapper(constchar*str=)显然这里有问题空窜应该是””而不是改正过来重新编译运行结果如下。从上图可以看出refhh函数测试已经通过但是copyhh测试输出的第一个字符窜就错了结合源代码先注释掉testref()再对testcopy()进行跟踪。程序代码见下面的贴图。设置好断点点击按钮启动调试器见上图打开Watches窗口进行跟踪。点击Stepinto按钮进入testcopy的函数体见下图。继续Stepinto跟踪对象的创建过程见下图。从上面的截图可以看出调用cstrwrapper(constchar*)创建对象再结合testcopy函数的代码可以发现虽然返回一个临时对象的拷贝没有任何问题但cstrwrapper的定义中构造函数仅仅拷贝了指针待testcopy函数体内的str过期被销毁的时候新创建的对象(仅仅一个指针)将指向何处,继续跟踪到调用重载operator<<的友元函数输出时从Watches可以发现此时创建的对象值(指针)已经指向一个莫名其妙的字符窜”F”(在您的电脑上可能是其他字符窜内容)。由于cstrwrapper本身定义就是复制一个指针没有办法对它进行大的改动(除非重新设计和编码)只能遗弃不用cstrwrapper。也许有的读者还想不明白为什么testcopy函数能正常工作。虽然这个函数也是返回一个拷贝的对象(指针)但是它的函数体内有一条语句char*str=“copyachar*string”由于C本身设计为了兼容C的语法而C语言使用这种格式定义字符窜在程序停止运行前不会被销毁程序运行结束后由操作系统回收占用的资源因此拷贝指向这个字符窜的指针在程序运行的生命周期内始终不会成为野指针自然就能正常输出了。泛型程序泛型程序调试更复杂一点因为一个函数或者类往往由于初始化类型的不同生成不同种类的对象而且函数和运算符重载过程也比一般的函数和运算符重载复杂的多。以下是一个简易栈的实现以及几个运算符重载为了确保该栈实现的健壮性也对它进行一些必要的测试。下面是各文件目录层次关系。下面是代码贴图。编译并运行该程序运行时失败弹出错误信息见下图。从显示结果看是string测试出了问题。当然很多人可能早就知道很多C的库函数(例如memcpy,memset等)不能对对象操作否则程序很容易崩溃但是知道为什么吗,如果您并不清楚为什么那就通过一个简单的例子来看一看到底究竟怎么回事。首先注释掉testtypeshpp中跟teststring()无关的代码因为其它几个数据类型测试已经通过不必再跟踪。设置断点然后启动调试器见下面贴图。打开watches窗口接下来专门针对string类型的Stack建立过程一路跟踪下去(注意巧妙的用好调试程序的快捷菜单上的几个按钮)已经跟踪到了teststringcc第行代码前仍然没有问题见下图。继续Stepinto进入栈的push成员函数体内压入栈第一个string对象没有发生任何问题继续跟踪把第二个string对象压入栈的过程此时栈空间不足需要重新分配空间然后把原来栈中的string对象复制到新开辟的空间再销毁原来的空间。这个过层中开辟空间没有问题因为new足够智能它知道该开辟多大的空间(因为new能调用构造函数创建一个string数组T被初始化为new以后再调用就成了p=newstd::stringn)push对象到栈中这个复制过程也不会产生问题(因为std::string已经重载了=可以正常复制std::string对象)但是由于栈空间不足调用rebuild函数时我们从Debug下拉菜单选择Editwatches…增加几个变量监测它们的变化见下面的贴图。编辑Waches窗口变量的方法很多也可以把鼠标指示移动到Watches窗口内按下鼠标右键会弹出一个快捷菜单有几个功能供我们选择。用于手工添加变量到Watches窗口内用来编辑Watches窗口内当前选中的变量则用来把选中的变量从Watches窗口内删除见左下图。如果想添加一个变量到Watches窗口还有更直接的方法。例如想添加data到Watches窗口可以用鼠标选中data(选中后显示灰色)按下鼠标右键在弹出的快捷菜单中选择见右上图则data会自动添加到Watches窗口内。tsize()成员函数值居然为有点不可思议难道产生的每一个string对象不会超过个字符的长度,赶紧看看产生的字符窜str的值(把data添加到Watches窗口就可以了data指向的字符窜就是当前str的值)是”izOdThYbzQ”显然它远远超过个字符了。接下来的std::memcpy(p,data,sz*tsize())就仅仅复制sz*tsize()个字符到新空间中此时的sz为也就是说仅仅复制*个字符到新空间中tsize()的实现很容易找到(选中tsize按下鼠标右键从弹出的快捷菜单中选择则自动追踪到Satck内成员函数tsize()的实现处)它是也就是说sizeof(std::string)的值为你敢相信这个结果吗,继续跟踪下去当企图再往栈中放入第三个std::string对象时由于空间不足再次分配更多空间此时栈数据成员cap的值已经为,sz已经为又进入rebuild函数体运行语句std::memcpy(p,data,sz*tsize())时程序崩溃了。以上调试过程中如果同时打开栈状态窗口和汇编窗口可能更容易看出问题出在什么地方当然啦那需要您能看懂gcc汇编。或许你已经明白是sizeof惹的祸其实还不止sizeof,memcpy和memset也功不可没都有份。如果想改进这个栈的实现就需要替换这两个函数STL的algorithm函数头下有个copy是个泛型算法知道怎么复制简单类型(例如int,char,bool,double等)和复杂类型(例如本例的std::string或者自定义类型)当然此刻的sizeof已经不必用了。这里不再介绍怎么改进本例中的栈实现而是把它留给读者作为练习。混合风格的程序其实很多时候我们写的程序尤其复杂的C程序并非一种编程风格而是以上几种编程风格的混用而且我们编程经常使用库函数和类。下面给出一个简单例子。网络上数据非常丰富有时我们需要从这些海量数据中筛选出我们感兴趣的一些信息。我们在此把这个复杂的问题简单化假设我们有G个正整数存放在一个磁盘文件里面我们需要从这些数中找出百万个(假设仅仅MB内存但是硬盘容量充足)最大的。为了模拟以上过程并节约时间我们处理数据量小一点。首先用随机数产生器产生千万个正整数把这些随机数写到硬盘上放在一个文件里要求从这些数中找出K个最大的在位系统上使用额外MB缓存运行速度就基本可以接受。可以这样做:每次读取M个数放入内存建造一个堆筛选出K个最大的这样需要读取次然后建堆筛选次共产生K个较大的数再从这K个中选出K个最大的。为了加快存取速度设置读写缓冲区MB(sizeof(sizet)*M)。这里并不打算再讲述一步步怎么调试程序因为调试以下程序并不难但没有给出测试代码希望读者动手自己补上并调试运行使之得到正确结果。下面是源代码文件层次图和源代码的贴图。编译并运行以上程序一种可能的结果如下截图:假设生成的随机数存放在文件randstxt中筛选出的最大K个随机数存放在文件maxktxt中程序运行完毕打开所在目录可以看到如下:说明可以产生随机数(randstxt大小为KB)也能筛选出一些结果(maxktxt文件大小为KB)。置于结果是否正确请读者编程测试验证作为练习。以上运行结果是在笔者的古董笔记本电脑(IBMT)上运行测得产生一千万个随机数并分批写入磁盘文件消耗了将近秒分批读取这些数据找出K个最大的大约耗费了秒钟其实时间主要耗费在读写磁盘文件上假如不读写磁盘的话产生千万的随机数在笔者的古董电脑上也不会超过秒从这些随机数中找出K个最大的需要的时间不会超过毫秒。阅读别人编写的程序有时为了提升自己的水平我们往往需要阅读别人的程序消化吸收为自己所用。这里仍旧以上面的小结中的程序作为示例。首先看几个伪关键字(并非真正的关键字而是宏定义或者typedef定义的别名)。main函数里面用到了sizet和clockt我们看一看它们究竟是什么原型。选中一个sizet按下鼠标右键从弹出的快捷菜单中选择见下图。SIZETYPE这样我们可以找到sizet的声明位置在stddefh头文件里面是一个typedef来的见下面的贴图第行红色方框中的部分。那SIZETYPE又是什么呢按照同样的方法追踪下去仍然在文件stddefh里面就在第行是一个longunsignedint类型用宏定义的仍然见上图。那clockt又是什么呢,按照同样的方法去追踪我们发现它在timeh文件里面是long的typedef在第行见下面的贴图红色方框标出的部分。如果您不明白任何函数名或者定义的变量名均可以采用类似的方法去追踪。假如您想看看某个函数的实现可以采用类似的方法。例如您想知道writefile的实现就选中这个名称按下鼠标右键从弹出的快捷菜单中选择见下面的贴图。此时会自动找到这个函数的实现它在文件writefilecc文件里面光标停留在该函数头前面见下面的贴图中红色方框标出的部分。如果该实现中用到了其它的函数您不清楚的地方可以采用此方法继续追踪下去以上是我们自己定义的函数如果要是调用的系统的函数怎么办,采用同样的方法固然可以但是重名函数很多实现也各不相同有些函数实现十分复杂我们很难短时间内看明白。为此我们可以在文档中查询该函数的用法就可以了可能您不会忘记我们前面有关章节介绍按下F快捷键可以在我们已经事先设置好的cppreferencechm里面查询和网上查询。那是一种方法还有更快捷的方法我们无需键入函数名就可以自动查找。例如假如我们想查找函数getline的相关使用方法选中getline这个名称按下鼠标右键在弹出的快捷菜单中选择这样仍然可以在cppreferencechm文件中查找见下图。当选择CReference的时候会弹出一个窗口在帮助文件中找到两个函数名为getline的函数第二个是我们需要的选中第二个并点击Display按钮见下面的贴图。点击Display后会自动搜索cppreferencechm文件中有关getline函数的相关用法介绍并切换到该函数的用法界面部分见下面的贴图。通过上述介绍的几个简单菜单按钮我们就可以比较方便的阅读别人编写的源程序了。附录附录有几个部分分别讲述在不同的操作系统上安装Code::Blocks配置其他库等。在Linux下安装Code::BlocksLinux版本众多不同版本有些差异这里以在ubuntu和fedora上安装Code::Blocks为例。Ubuntu()在etcaptsourceslist下添加如下内容。以root身份登陆打开一个图形界面的编辑器在终端上粘贴下面一行内容。gksugeditetcaptsourceslist在文件末尾贴上以下内容。#codeblocksdeb#wxwidgetsdeb注意:在第()步您也可能需要使用feisty而并非gutsy,这跟你使用的ubuntu版本有关。()确保您的packagesystem信任这些源就需要添加他们的key。在终端键入以下内容。wget–q|sudoaptkeyadd–wget–q|sudoaptkeyadd–在终端键入以下内容更新这些包。sudoaptgetupdatesudoaptgetupgrade()安装Code::Blocks在终端键入下行内容。sudoaptgetinstalllibcodeblockscodeblockslibwxsmithlibcodeblockscontrib想得到最新的nightlybuild就重复一次第()步。现在您应该可以在程序语言列表中见到Code::Blocks了。Fedora()以root身份登陆在控制台窗口执行下面的命令。yuminstallcodeblocks()运行Code::Blocks在应用程序的下拉菜单中找到程序设计选择Code::BlocksIDE。或者打开一个控制台窗口执行下面的命令。codeblocks在MacOSX下安装Code::Blocks准备工作()确认X已经安装看看X是否在您的系统中已经安装了(在应用程序的菜单里)如果没有安装就拿出MacOS的盘装上吧。安装方法很简单选中备选安装包的installer打开X前面打勾安装上。如果您使用的是至的版本可以从Apple网上下载X。()安装开发工具(MacOSX以上版本不需要这一步)打开xterm,试试你在终端上不能使用Code::Blocks。xterm是X的一部分这也就是为何要安装X的原因。运行gcc命令如果出错信息提示没有输入文件说明gcc可用如果出错信息说找不到gcc那您需要安装开发工具。如果需要安装开发工具的话您可以从Apple网站下载或从MacOS盘上安装找到Xcodeinstaller装上就是了运行这个installer除了文档可以不用安装外其他全部选中安装上。MacOSX需要安装以上版本的Xcode工具MacOSX需要安装以上版本的Xcode工具MacOSX需要安装以上版本的Xcode工具。安装Code::Blocks解压zip安装包把CodeBlocksapp放到您想放的位置(建议放在DeveloperApplications或者)。~Applications下Code::Blocks搭配高版本gcc编译器Code::Blocks搭配较高版本的gcc编译器有两种方法如果你用Windows系统可以升级和配置高版本的MinGW(内嵌gcc)从而使用高版本gcc。在所有系统上都可以升级和搭配高版本的gcc编译器。升级MinGW目前最新稳定的MinGW版本内嵌了gcc编译器测试版则内嵌了gcc升级MinGW前需要先卸载原来古老版本的MinGW或者把新版本的MinGW安装到不同的位置。笔者建议您首先卸载古老版本的MinGW然后到下载最新测试版MinGW的安装器(installer)并执行之把MinGW安装到Code::Blocks文件夹下启动Code::Blocks如果不能自动检测到新安装的MinGW的话就在Settings下拉菜单中选择Compileranddebugger…按钮此时会弹出一个界面选择左边带有标签Globalcompilersettings的图标然后选择Toolchainexecutables见下图。用鼠标点击Autodetect按钮(绿色框内)如果能识别最好不能识别择需要点击按钮手工配置路径(注意红色框内的配置)配置完毕后点击OK按钮退出就可以了。升级并配置gcc编译器如果能找到gcc的二进制代码当然最好如果没有二进制安装包就需要自己编译gcc编译gcc的方法这里不再赘述请参阅相关文档。假设您手头已经有了高版本的gcc二进制安装包Windows版本的gcc二进制文件可以登陆下载。下载完毕后笔者建议您把它安装到Code::Blocks的目录下然后配置编译器选项(跟上面配置MinGW的类似)从Settings下拉菜单中选择Compileranddebugger…按钮此时会弹出一个界面选择左边带有标签Globalcompilersettings的图标然后选择Toolchainexecutables点击按钮逐一配置好路径见下图(注意粗线红色框内的文件配置)。配置完毕后编译运行一个小程序测试一下如果编译成功则说明配置正确失败就按照上面的配置说明好好检查一下看看哪里有问题改正。安装配置boost安装boost有点麻烦因为需要下载源代码和编译文件编译完boost然后再配置配置完毕后还要测试安装是否正确。以下以WindowsXP上安装boost为例进行介绍。()下载boost登陆下载最新的boost源代码包和编译文件。写本文的时候最新的boost源代码包是版最新的编译文件boostjam下载完毕后解压。注意最好下载二进制的boostjam这样就可以直接使用它编译boost了。在Windows上安装boost需要下载boostjamntxzip在linux上安装boost就下载boostjamlinuxxtgz在FreeBSDUnix上安装boost就下载boostjamfreebsdxtgzMacOSX上安装boost就下载boostjammacosxxtgz。()编译boost首先需要解压boost的包再解压boostjamntxzip解压完毕boostjamntxzip后只有一个可执行文件bjamexe把这个文件复制到解压后的boost安装包下(在笔者电脑上是D:TDDOWNLOADboostboost)。接下来需要设计gcc编译器环境变量假如你已经成功安装了GCC或者MinGW全局环境变量就已经自动配置好了可以进行命令行编译否则需要设置GCC编译器路径。笔者电脑上gccexe的路径是C:ProgramFilesCodeBlocksMinGWbin把它加到全局变量路径就可以了。按照这样次序去找MyComputer(我的电脑)>Properties(属性)>Advanced(高级)>EnvironmentVariables(环境变量)>Path>Edit(编辑)>然后把gccexe文件的路径(C:ProgramFilesCodeBlocksMinGWbin)复制到环境变量Path其它环境变量的后面保存就可以了。这是一种一劳永逸的方法如果您并不经常使用命令行编译文件可以采用即设即用的方式。打开控制台键入setpath=C:ProgramFilesCodeBlocksMinGWbin并按下回车键则gcc编译器本次可用命令行编译关闭控制台即失效。在控制台上找到bjamexe的路径(已经复制到D:TDDOWNLOADboostboost下面)键入bjam–toolset=gcc–prefix=C:boostinstall进行编译此命令会把编译后的boost文件安装到C:boost下。在控制台上用gcc编译器以命令行形式编译boost见下图。需要特别注意:命令行中=前后不可以有空格文件夹名字随便取但是一个文件夹名字只能是一个单词不能是两个或者两个以上中间用空格隔开的单词否则编译失败。编译过程将会是比较枯燥等待好在时间不会太长编译过程中CPU、内存、硬盘负荷都很重在笔者的古董笔记本电脑(WinXPSP,PIIIGHzCPU,MB内存GB硬盘)上纯编译时间大约用了一个小时。编译过程中往往会提示很多信息(包括一些警告信息)除非失败否则一律不用理会它们编译完毕后最终显示结果见下图。从上图中的文字可以看出boost成功安装。一般而言编译成功所有的文件并不容易根据笔者经验用gcc和gcc编译boost从未完全编译成功所有的文件这次使用gcc编译boost编译成功的文件数见上图中最后的提示信息(…updatedtargets…)。()配置boost打开code::blocks在Settings的下拉菜单中选择然后在Searchdirectory栏目下用Add添加boost的路径(在笔者电脑上是)保存退出见下面截图红色框内文字。()测试boost我们仅仅需要测试boost是否安装配置正确而并非测试boost是否完整或者有没有bug测试boost的完整性和是否有bug不是一件很容易的事情boost团队中有很多人一直进行着这项伟大的工作。编译和运行testcpp都需要连接两个库文件编译前需要在本工程中添加上这个两个文件的路径见下图红色框框起来的两个文件(首先在Project下拉菜单中选择Buildoptions…然后可以参考下图用Add按钮添加见红色框内文字)。编译成功后运行时还需要能找到这两个文件。安装配置QtCCGUI库多如牛毛商用的免费的都很多。其中名气最大的CCGUI库可能就是Qt了Qt非常强大而且版本升级很快既有商用版也有免费版。()下载如果希望在Code::Blocks下开发Qt的应用首先需要到Qt的官方网站根据您使用的系统下载相应Qt的最新版本然后进行安装。如果您希望在Windows下用Qt编写应用程序一般可以选用两种版本MinGW的或者MSVC的这里以MinGW的为例进行简单介绍安装配置。()安装下载完毕启动安装文件进行安装安装过程中可选是否安装MinGW因为我们已经安装了MinGW因此不需该项(去掉前面的勾)笔者建议您把Qt安装在CodeBlocks目录下。Qt的库相对比较大安装时间可能比较长请耐心等待。()设置系统环境变量安装完Qt为了便于搜索需要加载的文件需要设置系统环境变量操作系统的环境变量设置要特别小心否则很难说会出现什么问题。以笔者电脑安装的Qt为例拖动鼠标到我的电脑图标上按下右键弹出菜单选择属性再从弹出菜单中选择高级然后选择环境变量填入以下这些项目。Qtdir=C:ProgramFilesCodeBlocksQtqtInclude=C:ProgramFilesCodeBlocksQtqtincludeC:ProgramFilesCodeBlocksMinGWincludeLib=C:ProgramFilesCodeBlocksQtqtlibC:ProgramFilesCodeBlocksMinGWlibPath中加入C:ProgramFilesCodeBlocksQtqtbinC:ProgramFilesCodeBlocksMinGWbin()设置编译器搜索路径Setting下拉菜单下选择然后在Searchdirectory栏目下用Add添加Qt路径(笔者电脑上C:ProgramFilesCodeBlocksQtqt)见下面截图红色框内文字。()设置Code::Blocks全局变量在弹出的对话框中设置Qt的全局环境变量。其中有一项baseSetting下拉菜单下选择栏目必填该项是Qt的安装路径(笔者电脑上是)见下图。()添加Qmake打开Code::Blocks的Tools下拉菜单选择添加一个Qmake填入选项见下面贴图。再添加一个Qmake但是不用写参数(Parameters:后面的框不填project空着)。()测试使用Code::Blocks的Wizard创建一个Qt工程。工程名任意接下来有一个选项需要填入Qt路径这个需要特别注意否则编译器搜索不到需要加载的文件(在笔者电脑上的路径是C:ProgramFilesCodeBlocksQtqt)见右面的截图。编译器选择MinGW最后产生的代码见下面贴图。配置好该工程的编译选项(Project下拉菜单选择Buildoptions…设置适当编译选项)和属性(注意Project下拉菜单Properties…下Buildtargets类型选择GUIapplication见下面截图红色框内文字)。编译之除了几个警告外一般不会出现什么问题。假如您以上各个环节配置正确运行编译后的二下图(左)。进制文件结果见特别说明笔者编译和调试本书中所有的程序都使用测试版MinGW(内嵌了gcc)如果您想编译本书中的任何程序笔者也建议您使用较新版本的编译器(例如g或者g)和调试器(例如gdb)此外编辑部分程序使用Code::Blocksbuild(年月日的nightlybuild版)编辑部分程序使用Code::blocks官方版。作者对本书中的任何程序代码不提供任何形式的担保如果您希望在与本书无关的地方使用部分或者全部代码为了不致于给您、我以及他人带来不便代码前请务必加上以下文字信息。如果您阅读本书过程中发现错误不妥之处请给我写信Email:chipsetyahoocomcn或者登陆我的博客给我留言。如果您对本书有什么建议Chipset洗耳恭听。如果您在使用Code::Blocks的过程中发现本书能给您带来一点心得或收获那将是本书作者Chipset最大的荣幸。谢谢

我要回帖

更多关于 codeblocks 的文章

 

随机推荐