C/C++
lhsgbc
这个作者很懒,什么都没留下…
展开
-
qt .pro
原文网址:http://blog.csdn.net/adriano119/archive/2010/09/11/5878169.aspx 在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下:1. 注释从“#”开始,到这一行结束。2.模板变量告诉qmake为这个应用程序生成哪种makefile。转载 2012-11-14 07:52:50 · 637 阅读 · 0 评论 -
程序设计中的计算复用(Computational Reuse)
从斐波那契数列说起我想几乎每一个程序员对斐波那契(Fibonacci)数列都不会陌生,在很多教科书或文章中涉及到递归或计算复杂性的地方都会将计算斐波那契数列的程序作为经典示例。如果现在让你以最快的速度用C#写出一个计算斐波那契数列第n个数的函数(不考虑参数小于1或结果溢出等异常情况),我不知你的程序是否会和下列代码类似:?publicstatic u转载 2012-02-13 17:57:21 · 117 阅读 · 0 评论 -
对死锁的思考【2】/thinking in deadlocks
介绍了什么是死锁,对于每种类型一个资源和多个资源的检测,这里会介绍一下如何从死锁中恢复死锁的避免死锁的预防说明:这不是一篇专业性的文章,只是力求让读者能理解、知道什么是死锁。如果想要更具体深入的知识还需要查阅相关文献。从死锁中恢复抢占性恢复从字面上看,抢占性恢复就是强制把已经被占有的资源强制拿过来,分配给需要他的进程,而达到解除死锁的目的。在不通知持有资源进程的情况转载 2012-02-13 19:16:05 · 160 阅读 · 0 评论 -
scanf需注意的一点
注意scanf("%d,%d,%d",&a,&b,&c);中%d,%d,%d之间有逗号,在输入数据时也要加逗号,如果去掉逗号,输入时就不用逗号,而用空格,tab键或回车键将各个数据隔开原创 2012-02-14 12:08:27 · 168 阅读 · 0 评论 -
提高程序性能、何为缓存——从存储器结构说起
开篇 上一篇博文局部性原理浅析——良好代码的基本素质中对程序局部性有了一个简单的介绍。基本上已经知道了如何编写有良好局部性的代码。但是为什么有良好局部性的代码就能有良好的运行效率,这个问题将在这篇博文中给出解答。至于存储器内部的组织实现,将在下篇文章中叙述。存储器层次结构我们知道,计算机里的存储器有:硬盘、主存、高速缓存(其中又有一级高速缓存、二级高速缓存等等)、在往上就是寄存转载 2012-02-13 18:00:53 · 131 阅读 · 0 评论 -
浅析代码优化
开篇相信有过编码经验的人都知道,程序的正常运行,只是最基本的要求。更多的,还要考虑程序的性能,运行效率,组织结构,和重用性等等。今天将简单的讨论一下如何优化程序性能。要写出高效的程序,可能多数初学者想到的是在程序中用合适的算法和数据结构。这确实是一中提高程序性能的主要方法。而这里要讨论的是另一种方法,也是很多人都忽略但确实很重要的方法。也是我们这篇文章的主题:如何编写出编译器能转载 2012-02-13 19:14:17 · 336 阅读 · 0 评论 -
底层探秘之——运行时 数据结构
这篇博文主要内容是程序运行时的数据结构,包括运行时程序中的不同部分如何分配内存、函数调用的内存实现、还介绍了一个c独有的强大功能,一个被称为“展开堆栈”(unwinding stack)的技术 注意到标题了吗?运行时 数据结构,中间的空格是特意留出的,运行时可以认为是程序执行的一个状态,一般有编译时,运行时等,他们都是表示一个处理状态。编程语言的的经典对立之一就是代码和数据的转载 2012-02-13 19:22:41 · 214 阅读 · 0 评论 -
Hanoi Tower 汉诺塔的简单分析/C
当然、这是一个经典的递归问题~ 想必来看这篇博文的同学对汉诺塔应该不会陌生了吧, 写这篇博还是有初衷的: 之前学数据结构的时候自己看书、也上网上查了很多资料,资料都比较散、而且描述的不是很清楚,对于当时刚刚接触算法的我,要完全理解还是有一定难度。今天刚好有时间就整理了下思路、重写分析了一下之前的疑惑的地方、没有透彻的地方便都豁然开朗了。所以迫不及待把我的想法记录下来,转载 2012-02-13 19:27:27 · 2053 阅读 · 0 评论 -
C++为什么不叫++C?——浅谈前自增与后自增的区别
《C++ Primer》确实给我带来了很多惊喜。作为一本专业的具有较高门槛的"入门书",它有很多地方实在是国内的书不可及的,这不仅在于内容上的严谨,更表现在优秀的习题所带给学习者的启迪。 习题5.16你认为为什么C++不叫做++C? 看到这个习题,顿感眼前一亮(不禁想起某些国内书籍的题目,真是平淡如水),这对于理解前自增操作与后自增操作而言着实是个好的题目。想弄转载 2012-02-13 19:30:37 · 177 阅读 · 0 评论 -
文本文件与二进制文件的区别
一、文本文件与二进制文件的定义 大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。 简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过转载 2012-02-12 22:01:44 · 115 阅读 · 0 评论 -
C/C++哪些地方會用到pointer呢? (C/C++) (C)
Abstract學習C/C++,大家最大的障礙就是pointer,本文試著將pointer做整體的討論。IntroductionC很多地方都用到pointer,C++則有不少替代方案,以下是C和C++會用到pointer的地方。CC++1.Pass by AddressReference2.Pass Array to Functi转载 2012-02-12 20:25:09 · 200 阅读 · 0 评论 -
linux下C语言多线程编程实例
http://blog.readnovel.com/article/htm/tid_507071.html转载 2012-02-11 15:58:02 · 91 阅读 · 0 评论 -
如何將struct array寫入文字檔? 如何從文字檔讀出struct array? (C/C++) (C)
Abstract本文介紹如何將struct array寫入binary file,並從binary file讀出struct array。IntroductionC語言 / fwrite_fread_struct_array.c 1 /* 2 (C) OOMusou 2008 http://oomusou.cnblogs.com 3 4 Filena转载 2012-02-12 22:29:18 · 362 阅读 · 0 评论 -
对死锁的思考【1】/thinking in deadlocks
开篇死锁是操作系统中的重要概念,和操作系统中的其他重要概念一样,对它的正确理解将帮助你写出更加高效、优秀的程序。这里没有晦涩的定义,只有易懂的描述和生动的例子。相信你看了之后会有所收获。什么是死锁简单的说,死锁就是电脑里的硬件资源或者软件资源不够用了。为什么会有这种情况呢?比如说A占有资源m,请求资源n。B占有资源n请求资源m。进程A和B都会因为请求不到自己的资源而睡眠。下转载 2012-02-13 19:15:25 · 131 阅读 · 0 评论 -
对内存的思考
最近对底层的东西比较感兴趣、所以就看了些相关的书籍和资料在这里做一个简单的总结,和大家交流一下对内存的看法。 开篇:今天,计算机系统结构的真正挑战不在于内存的容量,而是内存的速度。如果你的软件实际上受到磁盘和内存的等待时间(访问时间)的限制,那么就是再好的芯片也无济于事。在内存和cpu之间存在着一道很深的鸿沟,而且是越来越深。在过去,每隔一两年,cpu的处理速度就会提升一倍,在转载 2012-02-13 19:28:47 · 445 阅读 · 0 评论 -
C语言程序的内存布局
C语言程序的内存布局一:C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 1.代码段(Code or Text): 代码段由程序中的机器码组成。在C语言中,程序语句进行编译后,形成机器代码。在执行程序的过程中,CPU的程序计数器指向转载 2012-02-14 11:11:24 · 132 阅读 · 0 评论 -
随机数
转载 2012-02-21 14:26:26 · 105 阅读 · 0 评论 -
如何將10進位轉2進位?
Abstractprintf()只能顯示10、8、16進位的值,卻無法顯示2進位的值,但有時候我們會希望能直接顯示2進位數字。Introduction使用環境:Visual C++ 8.0 / Visual Studio 2005Method 1:這是從C Primer Plus 5/e改寫的,使用bit運算來將10進位轉2進位,相當漂亮的寫法。decimal2binary转载 2012-02-12 20:15:42 · 265 阅读 · 0 评论 -
C语言中的EOF符号常量
先看一段代码/* 将输入复制到输出:读一个字符while(该字符不是文件结束指示符) 输出刚读入的字符 读下一个字符 */#include stdio.h>int main(){ int c; while((c=getchar())!= EOF) { putchar(c); } return 0;转载 2012-02-15 11:04:35 · 236 阅读 · 0 评论 -
最大子序列问题及其求解----C 语言学习
这两天看了看最大子序列问题,顺便的做一下笔记,最大子序列问题相信大家都再熟悉不过了,来回顾一下问题:给定整数(可能有负数),求的最大值(为方便起见,如果所有整数均为负数,则最大子序列和为 0 )。下面来看三种实现方法:1,使用两层 for 循环,算法复杂度显然是 O(N²):?intMaxSubSequ转载 2012-02-14 11:05:48 · 224 阅读 · 0 评论 -
一个堆栈误操作实例
#include int main(){int a=1;int b=2;int c[2]={3,4};c[2]=5;c[3]=6;printf("%d,%d,%d,%d,%d,%d",c[0],c[1],c[2],c[3],a,b);return 0;}输出为3,4,5,6,6,5.为什么a和b分别为6,5 呢?在堆栈中从高地址到低地址储存为a,原创 2012-03-06 23:02:18 · 153 阅读 · 0 评论 -
不定参数的应用
不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多。除了格式化输出之外,我实在没看到多少应用。主要原因是这种技术比较麻烦,副作用也比较多,而一般情况下重载函数也足以替换它。尽管如此,既然大家对它比较感兴趣,我就简单总结一下它的使用和需要注意的常见问题。原理刚学C语言的时候,一般人都会首先接触printf函数。通过这个函数,你可以打印不定个数的变量到屏幕转载 2012-03-07 21:16:29 · 108 阅读 · 0 评论 -
windows有意思的con输出
今天无意中发现在windows下面不能建立文件名为con的文件,新建时系统提示与现有的文件名同名,无法新建。后来査了一下,con是windows系统保留的系统关键字。除此还有:con、prn、aux、nul、com0、com9、lpt0、lpt9等等。下面的代码很意思:#include int main(){int i;FILE *fp;FILE *f[]={fop转载 2012-03-07 22:14:13 · 340 阅读 · 0 评论 -
虚拟地址和虚拟内存区别
程序访问存储器所使用的逻辑地址称为虚拟地址,虚拟地址 (virtual address): 4G虚拟地址空间中的地址,程序中使用的都是虚拟地址。每一个进程都分配有一个4G的虚拟地址。通过虚拟地址访问内存的形式称为保护模式,因为它不允许直接访问内核空间,而对应的直接访问物理内存的方式称为实模式,现在已经很少使用。 比如 mov eax,004227b8h ,这是把地址004227b8h原创 2012-03-08 18:45:03 · 1513 阅读 · 4 评论 -
open,write等基本系统IO的带缓冲与不带缓冲的差别
带缓存的文件操作是标准C 库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的。何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制。 不带缓存的文件操作通常都是系统提供的系统调用,更加低级,直接从硬盘中读取和写入文件,由于IO瓶颈的原因,速度并不转载 2012-03-14 22:55:02 · 224 阅读 · 0 评论 -
按位操作
我还不是一个职业程序员,也没有写过太多的代码,目前还只是一个爱好者吧。目前为止,我从来没有使用过按位运算和操作,不论是在C++或者AS的实际应用中……不对,应该说没有刻意主动使用过,特别是用于实际操作中。今天看到一些启发,记录一下: 首先,为什么要使用按位运算?——能节省在二进制数据和布尔数据之间转换的步骤,所以只要可能,就应该用按位操作来代替布尔操作。这样做得越多,对转载 2012-10-08 14:57:21 · 586 阅读 · 0 评论 -
C标准库分析之<assert.h>
* "__FILE__"是预定义的宏(也叫内置宏),值是所在文件的文件名(字符串字面量) *//* "__LINE__"是预定义的宏,值是调用的语句所在文件中的行数(是十进制常量) *//* assert.h standard header */#undef assert /* 良性取消assert定义 */#ifdef NDEBUG #define assert转载 2012-11-12 19:42:38 · 416 阅读 · 0 评论 -
Linux下缓冲区溢出攻击的原理及对策
前言从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。尽管堆栈帧结构的引入为在高级语言中实现函数或过程这样的概念提供了直接的硬件支持,但是由于将函数返回地址这样的重要数据保存在程序员可见的堆栈中,因此也给系统安全带来了极大的隐患。历史上最著名的缓冲区溢出攻击可能要算是1988年11月2转载 2012-03-06 16:29:59 · 145 阅读 · 0 评论 -
(转)fflush函数详解2
在有些时候,你会发现你的输出并没有按照你代码的流程输出, 比如说当你用C语言写了做了一个写文件的函数并印出一些信息,供perl或php等调用.而这时你会发现, perl或php并没有获取到你C语言中的打印信息.而代码什么都没有错误,在linux终端也可以正确打印出来. 这时可真是郁闷吧. 那么, 记住了, 这很大可能是没有更新你的缓冲区了. 这时int fflush(FILE *stream)这个转载 2012-03-04 11:00:47 · 260 阅读 · 0 评论 -
P问题、NP问题、NPC问题、NP难问题的概念[zz]
你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题并不是那种“只有搜才行”的问题,NPC问题才是。好,行了,基本上这个误解已经被澄清了。下面的内容都是在讲什么是P问题,什么是NP问题,什么是NPC问题,你如果不是很感兴趣就可以不看了。接转载 2012-02-26 13:33:43 · 159 阅读 · 0 评论 -
栈和栈帧
转载 2012-02-21 11:03:50 · 118 阅读 · 0 评论 -
(转)fflush函数详解1
1.flush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃 fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。2.fflush的真正作用就是立即将缓冲区中的内容输出到设备。正因为这样,所以只能在写入文件的时候使用fflush。在读取文件时使用fflush是不好的编程方法,因为那样的代码在一些环境下可能正常工作,但在另转载 2012-03-03 21:42:16 · 299 阅读 · 0 评论 -
简单知识点回顾
#includeint main(){unsigned char a=255;unsigned short b=aunsigned long c=bprintf("%u,%u,%u",a,b,c);return 0;}首先不能直接给 char a直接赋值255(char a只能赋值0-127),只能给unsigned char a赋值255;unsign原创 2012-03-03 16:47:33 · 120 阅读 · 0 评论 -
在文本文件中换行符与\n的区别
在储存在文本文件中的C程序中,换行符enter被储存为‘\n’是一个字符,ascii码为10,而直接键入的\ 和n表示的转义字符,实际上储存的是两个字符ascii码为92和102,是完全不同的两个东西。原创 2012-03-04 10:57:41 · 256 阅读 · 0 评论 -
对缓冲区 文件指针 fflush rewind的一次理解
#includeint main(){FILE * file;file=fopen("out.txt","r");printf("%d\n",ftell(file));int ch=fgetc(file); printf("%d\n",ch);printf("%d\n",ftell(file));fflush(file);ch=fget原创 2012-03-04 15:01:55 · 214 阅读 · 0 评论 -
对stdin的理解
#includeint main(){ int ch=getchar();printf("%d\n",ftell(stdin)); ch=getchar(); printf("%d\n",ch);printf("%d\n",ftell(stdin)); rewind(stdin);printf("%d\n",fte原创 2012-03-04 15:17:27 · 290 阅读 · 0 评论 -
论坛解答
1 库函数调用和系统功能调用有什么区别? (1)系统功能调用,指调用操作系统提供的函数 在早期的DOS时代,是用中断来实现的,即著名的 INT 21H 在Windows里,由一系列DLL文件提供,比如User32.DLL GDI32.DLL等 (2)库函数调用,是指调用语言提供的函数,它由LIB库文件给与支持. 就我所知,从T转载 2012-03-04 11:49:37 · 272 阅读 · 0 评论 -
linux下C语言多线程编程实例
学东西,往往实例才是最让人感兴趣的,老是学基础理论,不动手,感觉没有成就感,呵呵。下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉。下面是我们的代码:/*thread_example.c : c multiple thread programming in linux *a转载 2012-02-11 15:44:30 · 58 阅读 · 0 评论 -
单步调试
单步调试 在程序开发中,为了找到程序的bug,通常采用的一种调试手段,一步一步跟踪程序执行的流程,根据变量的值,找到错误的原因。 很多的开发工具都支持单步调试。 在需要调试的代码段设置断点,然后按预设的快捷键步进。VC 单步调试 在VC++6.0中的单步调试: 调试重要的几个键: F9在当前光标所在的行下断点,如果当前行已经有断转载 2012-02-11 10:21:22 · 287 阅读 · 0 评论 -
命名空间
一、 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的同名冲突。 在 C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。C++又引入了类作用域,类是出现在文件内的。在不同的作用域中可以定义相同名字的变量,互不于扰,系统能够区别它们。 1、全局变量的作用域是整个转载 2011-12-13 12:30:49 · 151 阅读 · 0 评论