07 2012 档案
摘要:很多人以为“指向数组的指针”就是“指向指针的指针”,于是有人写这样的代码:int a[3][4];int **p = a;//错误 这个代码的错误之处在于a是一个数组,它的成员也是数组,所以a叫做“数组的数组”——C++中严格说来没有二维数组。那么,你要用一个指针来记录a,就要用一个能表示“数组的数组”的指针,以下代码是正确的:int (*p)[4] = a;//正确 只有这样才能保证++p使p指向a的下一对像(该对像是一个数组)。 顺便提一句:不要写成“int *p[4];”来看一下指针数组的指针怎么用,既然都是指针也应该支持动态内存分配,下面的例子展示了如何对数组的指针动态分配内存:...
阅读全文
摘要:C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。如果上述任何问题的答案是“是”的话,那么我知道我得认真考虑我是否应该去做这份工作。从面试..
阅读全文
摘要:面向对象编程的三要素:数据抽象、继承以及动态绑定。这里讨论一个算术表达式树问题,如(-5)*(3+4)对应的表达式树为:我们希望通过调用合适的函数来创建这样的树,然后打印该树完整的括号化形式。例如:Expr t = Expr("*", Expr("-",5), Expr("+", 3, 4));cout << t << endl; 输出结果为:((-5)*(3+4))此外我们不想为这些表达式的表示形式操心,也不想关心它们内存分配和回收的事宜。从上面图我们可以看出,图中有两种对象节点和箭头。每个节点包含一个值——
阅读全文
摘要:上一回讨论的句柄技术有一个明显的缺点:为了将句柄捆绑到类T的对象上,必须要新定义一个具有类型为T的成员对象的新类。这个毛病相当麻烦,如果想新设计一个类的句柄类,就需要新定义两个类。C++之父提到过一种定义句柄类的技术可以弥补这一个缺点,主要思想就是将引用技术从数据中分离出来,把引用计数放到句柄类自己的对象之中。class Handle{ public: // 和前面一样 private: Point *p; int *u;};这里不再有指向UPoint的指针,我们使用指向Point的指针和指向一个int的指针表示引用计数。使...
阅读全文
摘要:第五章介绍了代理类,这个类能让我们在一个容器中存储类型不同但相互关联的对象。这种方法需要为每个对象创建一个代理,并要将代理存储在容器中。创建代理将会复制所代理的对象。 如果想避免这些复制该怎么做呢?可以使用句柄类。它允许在保持代理的多态行为的同时,还可以避免进行不必要的复制。 处于多态的环境中,我们可以知道对象的基类类型,但是不知道对象本身的类型或者怎么样复制这种类型的对象。 如果多个指针指向同一个对象,就必须考虑要在什么时候删除对象。不能太早也不能太晚,太早删除,就会有某个仍然指向它的指针存在,再使用这个指针就会产生未定义行为。删除得太晚又会占用本来早该另作它用的空间。 需要一种...
阅读全文
摘要:前言: OOP 的 意思 在我看来就是使用继承和动态绑定的编程方式。继承是一种抽象,它允许程序员在某些时候忽略相似对象之间的差异,又在其他时候利用这些差异。 C++ 程序员都应该知道,只有在程序通过指向基类对象的指针或基类对象的引用调用虚函数时,才会发生运行时的多态现象。 对象的创建和复制不是运行时多态的,这一点严重影响了类的设计。所以,容器——无论是类似于数组或者结构体的内建容器还是用户自定义容器类——只能获得编译时类型一致的元素值。如果有一系列类之间存在继承关系,当我们需要创建、复制和存储对象,而这些对象的确切类型只有到运行时才能知道时,则这种编译时的检查会带来一些麻烦。 通常,解...
阅读全文
摘要:一. 你需要一个构造函数吗? 构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的特点:1.构造函数的命名必须和类名完全相同。2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用。 有些内太简单,它们的结构就是它们的接口,所以不需要构造函数。但是一般情况下都需要构造函数来初始化成员变量。二..
阅读全文
摘要:传统业务结构下,由于多种技术之间的孤立性(LAN 与 SAN),使得数据中心服务器总是提供多个对外 I/O 接口(在此,可理解成服务器的网卡):用于数据计算与交互的 LAN 接口以及数据访问的存储接口,某些特殊环境如特定 HPC(高性能计算)环境下的超低时延接口。服务器的多个 I/O 接口导致了数据中心环境下多个独立运行的网络同时存在,不仅使得数据中心布线复杂,不同的网络、接口形体造成的异构还直接增加了额外人员的运行维护、培训管理等高昂成本投入,特别是存储网络的低兼容性特点,使得数据中心的业务扩展往往存在约束。 数据中心里会有两个网络,一个是前端 IP 网络,后端可能会是光纤网络,都会在...
阅读全文
摘要:缩略语 英文全名 中文解释ETS Enhanced Transmission Selection 增强传输选择。PFC Priority-based Flow Control 基于优先级的流控制DCB Data Center Bridging 数据中心网桥DCBX Data Center Bridging eXchange Protocol 数据中心桥接交换协议SP(PQ) Strict Priority Queue ...
阅读全文
摘要:1. delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间2. delete [] 用于释放 new [] 分配的空间3. delete 释放空间的时候会调用 相应对象的析构函数 顺便说一下new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存4. 调用free 之前需要检查 需要释放的指针是否为空,使用delete 释放内存则不需要检查指针是否为NULL5. free 和 delete 不能混用,也就是说new 分配的内存空间最好不要使用使用free 来释放,malloc 分配的空间也不要使用 delete来释放.
阅读全文
摘要:一.运算符重载不能重载的运算符: 成员运算符“.” 作用域运算符“::” 条件运算符“?:” 指针运算符 * 编译预处理命令的开始符号 #运算符重载的两种形式:成员函数或者友元函数二.虚函数1. 析构函数可以是虚函数,但是构造函数不能是虚函数2. 在类体系中访问一个虚函数时,应使用指向基类的指针或对基类的指针或者对基类的引用,以满足运行时多态的要求。当然也可以像调用普通函数一样利用对象名来调用一个虚函数,这时会失去虚特性3. 虚函数必须是一个类的成员函数,不能使友元,但是它可以是另一个类的友元。另外虚函数不能是一个静态函数4. 在基类中使用虚函数保证...
阅读全文
摘要:下载安装python安装工具下载地址:http://pypi.python.org/pypi/setuptools 可以找到正确的版本进行下载。win7 32位可以下载setuptools-0.6c11.win32-py2.7.exe 。注意:win7 64位必须使用ez_setup.py进行安装。方法是下载ez_setup.py后,在cmd下执行 python ez_setup.py,即可自动安装setuptools。目前没有直接的exe安装版本。注意2:更新了更简单的办法,可以直接跳转到最后面下载完成后双击执行安装文件,即可在D:\Program Files\python2.7\scrip
阅读全文
摘要:之前一直看不懂马尔科夫算法的awk实现。最近学习了awk,基本上能看懂了。C++版的参见这里。#!/bin/awk -f#markov.awk: markov chain algorithm for 2-word perfixesBEGIN { MAXGEN = 10000; NONWORD = "\n"; w1=w2=NONWORD }{ for(i = 1; i <= NF; i++) { #read all words statetab[w1,w2,++nsuffix[w1,w2] ] = $i #print "IN",$i w1 = w2
阅读全文
摘要:awk 使用printf#printf使用类似于C语言#字符转换zhuyupeng@zhuyupeng-PC~$ echo "65" | awk '{printf "%c\n",$0}'Azhuyupeng@zhuyupeng-PC~$ echo "99" | awk '{printf "%f\n",$0}'99.000000#格式化输出#打印名字,左对齐,使用‘-’zhuyupeng@zhuyupeng-PC~$ awk '{printf "%-15s %s\n&
阅读全文
摘要:接上一篇,这里使用的grade.txt 也是和上一篇中的相同。先来总结一下awk内置变量:ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行-F选项NF 浏览记录的域个数NR 已读的记录数OFS 输出域分隔符ORS 输出例句分隔符RS 控制记录分隔符zhuyupeng@zhuyupeng-PC~$ awk '{print NF,NR,$0} END {print F...
阅读全文
摘要:前一篇学习了awk的基本知识,现在来做一些练习加深一下印象。假设我们有这样一个待处理的文件"grade.txt":M.Tansley 05/99 48311 Green 8 40 44 J.Lulu 06/99 48317 green 9 24 26P.Bunny 02/99 48 Yellow 12 35 28J.Troll 07/99 4842 Brown-3 12 26 26L.Tansley 05/99 4712 Brown-2 12 30 28#打印整个文件zhuyupeng@zhuyupeng-PC~$ awk '{print $0}' grad
阅读全文
摘要:awk:好用的数据处理工具awk 也是一个非常棒的数据处理工具!sed 常常用于一整个行的处理, awk 则比较倾向于一行当中分成数个『栏位』(或者称为一个域,也就是一列)来处理。因此,awk 相当的适合处理小型的数据数据处理呢!awk 通常运行的模式是这样的:[root@www ~]# awk '条件类型1{动作1} 条件类型2{动作2} ...' filenameawk 后面接两个单引号并加上大括号 {} 来配置想要对数据进行的处理动作。 awk 可以处理后续接的文件,也可以读取来自前个命令的 standard output 。 但如前面说的,awk 主要是处理『每一行的栏
阅读全文
摘要:1. 实现 f(x) = 2 * f(x -1) + x * x:def f(x): if x == 0: return x else: return f(x-1) * 2 + x * xfor x in xrange(1,10): print f(x)2. 一个简单类的实现class tClass(): def __init__(self,orig=0): self.storedValue = orig def read(self): return self.storedValue def write...
阅读全文
摘要:1. 随机函数的使用>>> random.random() # Random float x, 0.0 <= x < 1.00.37444887175646646>>>random.uniform(1, 10) # Random float x, 1.0 <= x < 10.01.1800146073117523>>>random.randint(1, 10) # Integer from 1 to 10, endpoints included7>>>random.randrange(0, 101,
阅读全文
摘要:1.冒泡排序:#for((i=0;i<10;i++))for i in {0..9} #两种方法都可以do ((a[i]=$RANDOM % 1000)) #产生随机数 echo -n "${a[i]} "donefunction bubble(){ len=${#a[@]} for((i=0;i<len;i++)) do for((j=i;j<len;j++)) do if [ ${a[i]} -ge ${a[j]} ] then tmp=${a[i]} ...
阅读全文
摘要:数组的声明:1.declare -a array # array被当作数组名2.array=( value1 value2 value3 ... )3.array=( [1]=one [2]=two [3]=three ... )4.array[key]=value # array[0]=one,array[1]=two数组提取:zhuyupeng@zhuyupeng-PC ~$ array=( [0]=one [1]=two [2]=three [3]=four )zhuyupeng@zhuyupeng-PC ~$ echo ${array[@]:1}two three fourzhuyup
阅读全文
摘要:该程序实现f(x) = 2f(x-1) + x * x这样一个函数,通过传入 参数 x 计算 表达式的值function f(){ local num="$1" if [ $num = 0 ] #注意与C语言的不同,不是‘==’,条件判断要有空格 赋值等号之间不要加空格 then ret=0 else let "dec=num-1" f $dec let "ret=$? * 2 + $1 * $1" #‘$?’ 是上一次函数的返回值 fi return $ret}for((i=0; i<10; i++...
阅读全文
摘要:要实现的功能C语言编程Linux Shell脚本编程程序/脚本的参数传递intmain(intargc, char**argv){if (argv!= 4) {printf( “Usage: %s arg1 arg2 arg3”,argv[0] );return 1;}printf(“arg1:%s/n”,argv[1]);printf(“arg2:%s/n”,argv[2]);printf(“arg3:%s/n”,argv[3]);return 0;}#!/bin/shif [ $# -lt3 ]; thenecho "Usage: `basename$0` arg1 arg2 a
阅读全文
摘要:1.变量赋值a=123readnameb=$(ls/home)把命令的执行结果赋值给变量2.使用变量(前面用$)echo$aleta=a+1系统变量$0 这个程序的执行名字 $n 这个程序的第n个参数值,n=1...9 $* 这个程序的所有参数 $# 这个程序的参数个数 $$ 这个程序的PID $! 执行上一个背景指令的PID $? 上一个指令的返回值 3.if语句if [ "22" -lt "33" ]注意空格thenecho "22 less than 33"elseecho "no"fi4.case语句#!/
阅读全文
摘要:原文链接:http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html今天来讨论一下装饰器。装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。1. 装饰器入门1.1. 需求是怎么来的?装饰器的定义很是抽象,我们来看一个小例子。?1234def foo():print 'in foo()'foo()这是一个
阅读全文
摘要:原文链接:http://www.cnblogs.com/huxi/archive/2011/01/02/1924317.html首先通过一个例子来看一下本文中可能用到的对象和相关概念。?123456789101112131415#coding: UTF-8import sys # 模块,sys指向这个模块对象import inspectdef foo(): pass # 函数,foo指向这个函数对象class Cat(object): # 类,Cat指向这个类对象def __init__(self, name='kitty'):self.name = namedef sayHi
阅读全文
摘要:听说过sed 和 awk 比较强大,专门学习了一下。使用这些shell工具需要一些正则表达式的知识,这里先来了解一些特殊符号的意思:特殊符号代表意义[:alnum:]代表英文大小写字节及数字,亦即 0-9, A-Z, a-z[:alpha:]代表任何英文大小写字节,亦即 A-Z, a-z[:blank:]代表空白键与 [Tab] 按键两者[:cntrl:]代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等[:digit:]代表数字而已,亦即 0-9[:graph:]除了空白字节 (空白键与 [Tab] 按键) 外的其他所有按键[:lower:]代表小写字节,亦即 a-
阅读全文