璐村惂鐢ㄦ埛_00QGEUR馃惥 -
关注数: 0 粉丝数: 1 发帖数: 264 关注贴吧数: 1
完美的C++:C++/CLI 什么是C++/CLI呢?C++当然指的是Bjarne Stroustrup在BELL实验室发明的C++语言,它实现了运行时取得速度和尺寸最佳化的静态对象模型,然而它除了堆分配外不支持程序的动态修改,它准许无限地接近底层设备,但在程序运行过程中几乎无法操作活动类型,也无法操作与程序相关联的底层结构。Herb Sutter,C++/CLI的主要构造者之一,称C++是一门“混凝土”式的语言。  CLI指的是通用语言结构,一种支持动态组件编程模型的多重结构,在许多情况下,这代表了一个与C++对象模型完全颠倒了的模式。一个时实的软件层,有效地执行系统,在底层操作系统与程序之间运行。操作底层的设备受到一定的限制,操作执行程序中的活动类型及与程序相关联的下部结构得到了支持。反斜杠(/)代表C++和CLI的捆绑,这个捆绑带来的细节问题是本文主要讨论的问题。  所以,“什么是C++/CLI”问题的最初、最接近答案是:它是静态C++对象模型到CLI的动态组件对象编程模型的捆绑。简而言之,它就是你如何用C++在.NET中编程,而不是C#或Visual Basic.NET。象C#和CLI本身一样,C++/CLI正在ECMA(欧洲计算机制造商协会)主持下进行标准化,以最终符合ISO标准。  实时通用语言(CLR)是CLI的微软版本,它非常适用于微软的Windows操作系统,相似地,Visual C++2005是C++/CLI的实现。  作为第二个近似的答案,我认为C++/CLI是.NET编程模式与C++的结合,正如以前将模板与C++结合起来产生的泛型编程。所有这种结合中,企业所拥有的C++的投资以及开发人员使用C++的经验将得到保存,而这恰恰是使用C++/CLI进行开发的重要基础。
差错控制方法 差错的产生原因及其控制方法  差错控制在数据通信过程中能发现或纠正差错,把差错限制在尽可能小的允许范围内的技术和方法。   1. 信号在物理信道中传输时,线路本身电器特性造成的随机噪声、信号幅度的衰减、频率和相位的畸变、电器信号在线路上产生反射造成的回音效应、相邻线路间的串扰以及各种外界因素(如大气中的闪电、开关的跳火、外界强电流磁场的变化、电源的波动等)都会造成信号的失真。在数据通信中,将会使接受端收到的二进制数位和发送端实际发送的二进制数位不一致,从而造成由“0”变成“1”或由“1”变成“0”的差错。 2.差错的控制方法  最常用的差错控制方法是差错控制编码。数据信息位在向信道发送之前,先按照某种关系附加上一定的冗余位,构成一个码字后再发送,这个过程称为差错控制编码过程。接收端收到该码字后,检查信息位和附加的冗余位之间的关系,以检查传输过程中是否有差错发生,这个过程称为检验过程。  差错控制编码可分为检错码和纠错码。  ①检错码--能自动发现差错的编码;  ②纠错码--不仅能发现差错而且能自动纠正差错的编码。  差错控制方法分两类,一类是自动请求重发ARQ,另一类是前向纠错FEC。  在ARQ方式中,当接收端发现差错时,就设法通知发送端重发,直到收到正确的码字为止。ARQ方式只使用检错码。  在FEC方式中,接收端不但能发现差错,而且能确定二进制码元发生错误的位置,从而加以纠正。FEC方式必须使用纠错码。 3.编码效率  衡量编码性能好坏的一个重要参数是编码效率R,它是码字中信息位所占的比例。编码效率越高,即R越大,信道中用来传送信息码元的有效利用率就越高。编码效率计算公式为:            R=k/n=k/(k+r)  式中 k为码字中的信息位位数     r为编码时外加冗余位位数     n为编码后的码字长度
关于main() 、int main()、void main() 与 float main()的讨论 最简单的C程序:///////////////////////////////main(){}//////////////////////////////这个程序有个不易察觉的错误。函数main()和其他函数一样,如果没有显式声明返回类型,那么函数返回类型就默认是整型(在C中,默认规定)。但,程序中没有给出任何的返回值。通常,这个不会有什么危害。返回值为整型的函数如果返回失败,实际上是隐含地返回了某个“垃圾”整数(不确定的值)。只要该值不被用到,就无关紧要。然而,大多数C语言实现都是通过函数main的返回值来告知操作系统函数的执行是否成功。典型的处理方案是,返回值为0代表程序执行成功,返回值非0则表示程序执行失败。如果一个程序的main函数并不返回任何值,那么有可能看上去执行失败。如果正在使用一个软件管理系统,该系统关注程序被调用后执行是否成功还是失败,那么很可能得到令人惊讶的结果。main() 默认函数返回值为整型,等同于int main()void main() 表示函数不返回值,返回值无关紧要的情况下使用。int main() 返回值为整型float main() 返回值为实型……有的编译器会在编译时检查main()的类型,一般为了方便都是声明为void型,建议最好用int型于是,C程序应该像下面这样编写代码://////////////////////////////////#include #include main(){ return 0;}/////////////////////////////////#include #include main(){ exit(0);}////////////////////////////////#include #include main(){ exit( EXIT_SUCCESS ); }////////////////////////////////上面均为:程序成功执行的返回,非0为程序执行失败的返回。最后一个失败返回可改为:exit( EXIT_FAILURE );----------------------------------------------注:EXIT_SUCCESS与EXIT_FAILURE在 中有定义。
关于 i++ 与 ++i 的讨论 由于表达式的求值顺序并非完全由操作符的优先级决定,因此有了以下讨论:i + --i 的结果是多少?操作符的优先级规则要求自减运算在加法运算之前进行,但我们没有办法得知加法操作符的左操作数是在右操作数之前还是之后进行求值.由于自减操作符具有副作用.--i 在 i 之前或之后执行,表达式的结果在两个情况下将会不同.标准说明类似这种表达式的值是未定义的.尽管每种编译器都会为这个表达式产生某个值,但到底哪个是正确的并无标准答案.因此,像这样的表达式是不可移植,应该予以避免.下面这个程序将说明这个问题.//bad_exp.c#include main(){ int i = 10; i = i-- - --i * ( i = - 3 ) * i++ + ++i; printf( "i = %d\n", i );}非法表达式结果:值 编译器-128 Tandy 6000 Xenix 3.2-95 Think C 5.02( Macintosh )-86 IBM PowerPC AIX 3.2.5-85 Sun Sparc acc( K&C编译器 )-63 gcc,HP_UX 9.0, PowerC.2.04 Microsoft C++ 7.021 Turbo C/C++ 3.0, Turbo C/C++ 4.522 FreeBSD 2.1R30 Dec Alpha OSF1 2.036 Dec VAX/VMS42 Microsoft 5.1你可以看到结果如此戏剧性.许多编译器由于是否添加了优化措施而导致结果不同.例如:在gcc中使用了优化器后,程序的值从-63变成了22.尽管每个编译器以不同的顺序计算这个表达式,但你不能说任何一种方法是错误的!这是由于表达式本身的缺陷引起的,由于它包含了许多具有副作用的操作符,因此它的求值顺序存在歧义.以下表达式,你可以在你的C编译器试验一下:i = ( i-- ) + ( ++i );i = j + j++;k *= k++;以下为C++的:你能遇见他们的结果吗?cout<<++( ++i )<< ',' << i<
原创程序展示范例 ///////////////////////////////////////////////////////// // 高速存储分配释放函数 ///////////////////////////////////////////////////////// // //说明: // 这个文件是对内存进行高速静态分配代替 new 等动态分配 // 命令的算法.通过指针对数组的控制实现. // //初始化函数: // 原形: void Init_Memory( void ) // 调用方式: Init_Memory(); // //分配函数: // 原形: void* Allocate( void ) // 调用方式: p = ( p_type * )Allocate(); // exp: p = ( int * )Allocate(); // //释放函数: // 原形: void Free_Memory( void *ptr ) // 调用方式: Free_Memory( p ); // // tearfly // 2004.10.21 // 风之翼工作室版权所有 ////////////////////////////////////////////////////////// #include #include #define BLKSIZ 80 //最大的单个数据容量 #define N 10 //高速存储区的个数 typedef union NODE{ //定义联合目的为了节省空间 union NODE *link; char data[BLKSIZ]; } BLOCK; static BLOCK *heap; //处理的接口指针 static BLOCK array[N]; //高速存储区数组 void Init_Memory() //对高速存储区进行初始化 { unsigned i; BLOCK *ptr; heap = array; ptr = heap; for( i = 1; i < N - 1; i++ ) { ptr->link = &array[i]; ptr = ptr->link; } ptr->link = NULL; } void* Allocate() //分配高速存储区 { void *ptr; if( heap != NULL ) { ptr = heap; heap = heap->link; return ptr; } std::cout << "没有可用的高速存取空间\n\7"; exit(1); } void Free_Memory( void *ptr ) //释放高速存储区 { BLOCK *p; p = (BLOCK *)ptr; p->link = heap; heap = p; return; } void main() { } ---------------------------------------------------------- 环境: Microsoft Visual C++ 7.0 Microsoft XP SP2 ////////////////////////////////////////////////////////// 如果在本吧发表原创程序请参照本范例,由于百度节省空间,进行了缩近,格式有变化,非本人程序格式,在此声明,谢谢支持!
1 下一页