Board logo

标题: C语言(四个字)http://www.shucunwang.com/RunCode/c/ [打印本页]

作者: zzz19760225     时间: 2016-6-25 20:09    标题: C语言(四个字)http://www.shucunwang.com/RunCode/c/

http://www.shucunwang.com/RunCode/c/

http://codepad.org/TIbKemXJ

http://www.manonggu.com/biancheng/
C 语言资源大全中文版
https://github.com/jobbole/awesome-c-cn

【生肉】比较C语言和机器语言                                (英语,看示范)
https://www.bilibili.com/video/av11237858

颖思教学网(turbo c为主的C语言内容)
http://www.winyes.com/

B站C语言
https://www.bilibili.com/video/av9430200/?from=search&seid=8131884833781373784

搜狗 turbo c 中文版    下载   (用运行向导中的汉化版本,使用虚拟机模式运行程序)
http://xiazai.sogou.com/detail/3 ... 00A00000000598FB273

c语言
    锁定

同义词 c(计算机语言)一般指c语言
本词条由“科普中国”百科科学词条编写与应用工作项目 审核 。
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。[1]

中文名
    C语言
外文名
    The C Programming Language
类    别
    计算机程序设计语言
创始人
    Dennis MacAlistair Ritchie

创始时间
    1972年
发    源
    BCPL语言
主要编译器
    Clang、GCC、MSVC、Turbo C等
启发语言
    B语言、汇编、ALGOL68
操作系统
    多平台

目录

    1 发展历史
    2 编程开发
    ▪ 编译器
    ▪ 集成开发环境(IDE)
    ▪ Hello World
    3 语言标准

    ▪ K&R C
    ▪ ANSI C / C89标准
    ▪ C99标准
    ▪ C11标准
    4 语言特点
    ▪ 基本特性

    ▪ 特有特点
    ▪ 优缺点
    ▪ C11新特性
    5 语言组成
    ▪ 基本构成
    ▪ 关键字

    ▪ 语法结构
    ▪ 程序结构
    ▪ 函数
    ▪ 运算符号
    6 经典错误

发展历史
C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。
1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。
c语言宣传图 c语言宣传图
20世纪60年代,美国AT&T公司贝尔实验室(AT&T Bell Laboratory)的研究员Ken Thompson闲来无事,手痒难耐,想玩一个他自己编的,模拟在太阳系航行的电子游戏——Space Travel。他背着老板,找到了台空闲的机器——PDP-7。但这台机器没有操作系统,而游戏必须使用操作系统的一些功能,于是他着手为PDP-7开发操作系统。后来,这个操作系统被命名为——UNIX。
1970年,美国贝尔实验室的 Ken Thompson,以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。
1971年,同样酷爱Space Travel的Dennis M.Ritchie为了能早点儿玩上游戏,加入了Thompson的开发项目,合作开发UNIX。他的主要工作是改造B语言,使其更成熟。[2]
1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
1973年初,C语言的主体完成。Thompson和Ritchie迫不及待地开始用它完全重写了UNIX。此时,编程的乐趣使他们已经完全忘记了那个"Space Travel",一门心思地投入到了UNIX和C语言的开发中。随着UNIX的发展,C语言自身也在不断地完善。直到今天,各种版本的UNIX内核和周边工具仍然使用C语言作为最主要的开发语言,其中还有不少继承Thompson和Ritchie之手的代码。[2]
在开发中,他们还考虑把UNIX移植到其他类型的计算机上使用。C语言强大的移植性(Portability)在此显现。机器语言和汇编语言都不具有移植性,为x86开发的程序,不可能在Alpha,SPARC和ARM等机器上运行。而C语言程序则可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。[2]
1977年,Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。[3]
C语言继续发展,在1982年,很多有识之士和美国国家标准协会为了使这个语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,C语言作者和应用程序员组成。1989年,ANSI发布了第一个完整的C语言标准——ANSI X3.159—1989,简称“C89”,不过人们也习惯称其为“ANSI C”。C89在1990年被国际标准组织ISO(International Organization for Standardization)一字不改地采纳,ISO官方给予的名称为:ISO/IEC 9899,所以ISO/IEC9899: 1990也通常被简称为“C90”。1999年,在做了一些必要的修正和完善后,ISO发布了新的C语言标准,命名为ISO/IEC 9899:1999,简称“C99”。[2]  在2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899: 2011,简称为“C11”。
编程开发
编译器
GCC,GNU组织开发的开源免费的编译器
MinGW,Windows操作系统下的GCC
Clang,开源的BSD协议的基于LLVM的编译器
Visual C++ :: cl.exe,Microsoft VC++自带的编译器
集成开发环境(IDE)
CodeBlocks,开源免费的C/C++ IDE
CodeLite,开源、跨平台的C/C++集成开发环境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Stdio系列
Hello World
下面是一个在标准输出设备 (stdout) 上,印出 "Hello, world!" 字符串的简单程序。类似的程序,通常作为初学编程语言时的第一个程序:
1
2
3
4
5
6
7
       
#include <stdio.h>

int main(void)
{
    printf("Hello, world!");
    return 0;
}
语言标准
K&R C
起初,C语言没有官方标准。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。布莱恩·柯林汉(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本书,名叫《The C Programming Language》。这本书被 C语言开发者们称为K&R,很多年来被当作 C语言的非正式的标准说明。人们称这个版本的 C语言为K&R C。[3]
K&R C主要介绍了以下特色:
结构体(struct)类型
长整数(long int)类型
无符号整数(unsigned int)类型
把运算符=+和=-改为+=和-=。因为=+和=-会使得编译器不知道使用者要处理i = -10还是i =- 10,使得处理上产生混淆。
即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最 准要求,许多老旧的编译器仍然运行K&R C的标准。
ANSI C / C89标准
1970到80年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本。
1983年,美国国家标准协会(ANSI)成立了一个委员会X3J11,来制定 C语言标准。[4]
1989年,美国国家标准协会(ANSI)通过了C语言标准,被称为ANSI X3.159-1989 "Programming Language C"。因为这个标准是1989年通过的,所以一般简称C89标准。有些人也简称ANSI C,因为这个标准是美国国家标准协会(ANSI)发布的。
1990年,国际标准化组织(ISO)和国际电工委员会(IEC)把C89标准定为C语言的国际标准,命名为ISO/IEC 9899:1990 - Programming languages -- C[5]  。因为此标准是在1990年发布的,所以有些人把简称作C90标准。不过大多数人依然称之为C89标准,因为此标准与ANSI C89标准完全等同。
1994年,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C89标准修订版,名叫ISO/IEC 9899:1990/Cor 1:1994[6]  ,有些人简称为C94标准。
1995年,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C89标准修订版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity[7]  ,有些人简称为C95标准。
C99标准
1999年1月,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C语言的新标准,名叫ISO/IEC 9899:1999 - Programming languages -- C [8]  ,简称C99标准。这是C语言的第二个官方标准。
在C99中包括的特性有:

    增加了对编译器的限制,比如源程序每行要求至少支持到 4095 字节,变量名函数名的要求支持到 63 字节(extern 要求支持到 31)。
    增强了预处理功能。例如:
        宏支持取可变参数 #define Macro(...) __VA_ARGS__
        使用宏的时候,允许省略参数,被省略的参数会被扩展成空串。
        支持 // 开头的单行注释(这个特性实际上在C89的很多编译器上已经被支持了)
    增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool
        支持 long long, long double _Complex, float _Complex 等类型
    支持不定长的数组,即数组长度可以在运行时决定,比如利用变量作为数组长度。声明时使用 int a[var] 的形式。不过考虑到效率和实现,不定长数组不能用在全局,或 struct 与 union 里。
    变量声明不必放在语句块的开头,for 语句提倡写成 for(int i=0;i<100;++i) 的形式,即i 只在 for 语句块内部有效。
    允许采用(type_name){xx,xx,xx} 类似于 C++ 的构造函数的形式构造匿名的结构体。
    复合字面量:初始化结构的时候允许对特定的元素赋值,形式为:
    struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 };
    struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是对 .c,.d 赋值的

    格式化字符串中,利用 \u 支持 unicode 的字符。
    支持 16 进制的浮点数的描述。
    printf scanf 的格式化串增加了对 long long int 类型的支持。
    浮点数的内部数据描述支持了新标准,可以使用 #pragma 编译器指令指定。
    除了已有的 __line__ __file__ 以外,增加了 __func__ 得到当前的函数名。
    允许编译器化简非常数的表达式。
    修改了 /% 处理负数时的定义,这样可以给出明确的结果,例如在C89中-22 / 7 = -3, -22% 7 = -1,也可以-22 / 7= -4, -22% 7 = 6。 而C99中明确为 -22 / 7 = -3, -22% 7 = -1,只有一种结果。
    取消了函数返回类型默认为 int 的规定。
    允许 struct 定义的最后一个数组不指定其长度,写做 [](flexible array member)。
    const const int i 将被当作 const int i 处理。
    增加和修改了一些标准头文件,比如定义 bool 的 <stdbool.h> ,定义一些标准长度的 int 的 <inttypes.h> ,定义复数的 <complex.h> ,定义宽字符的 <wctype.h> ,类似于泛型的数学函数 <tgmath.h>, 浮点数相关的 <fenv.h>。 在<stdarg.h> 增加了 va_copy 用于复制 ... 的参数。里增加了 struct tmx ,对 struct tm 做了扩展。
    输入输出对宽字符以及长整数等做了相应的支持。
    GCC和其它一些商业编译器支持C99的大部分特性。

C11标准

    2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C语言的新标准,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C [9]  ,简称C11标准,原名C1X。这是C语言的第三个官方标准,也是C语言的最新标准。
    新的标准提高了对C++的兼容性,并增加了一些新的特性。这些新特性包括:
        对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符, aligned_alloc函数以及<stdalign.h>头文件。
        _Noreturn 函数标记,类似于 gcc 的 __attribute__((noreturn))。
        _Generic 关键字。
        多线程(Multithreading)支持,包括:
            _Thread_local存储类型标识符,<threads.h>头文件,里面包含了线程的创建和管理函数。
            _Atomic类型修饰符和<stdatomic.h>头文件。
        增强的Unicode的支持。基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件<uchar.h>.
        删除了 gets() 函数,使用一个新的更安全的函数gets_s()替代。
        增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。
        增加了更多浮点处理宏。
        匿名结构体/联合体支持。这个在gcc早已存在,C11将其引入标准。
        静态断言(static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。
        新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。
        新增 quick_exit() 函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作。

语言特点

基本特性

    C++语言代码 C++语言代码
    1、高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来的工作单元。[10]
    2、结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。[10]
    4、代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件操作的场合,优于其它高级语言。[10]
    5、使用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。[11]

特有特点

        C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。
        C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。
        不同的变量类型可以用结构体(struct)组合在一起。
        只有32个保留字(reserved keywords),使变量、函数命名有更多弹性。
        部份的变量类型可以转换,例如整型和字符型变量。
        通过指针(pointer),C语言可以容易的对存储器进行低级控制。
        预编译处理(preprocessor)让C语言的编译更具有弹性。

优缺点

    优点
    1、简洁紧凑、灵活方便
    C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。[12]
    C语言的 Hello World 程序 C语言的 Hello World 程序
    2、运算符丰富
    C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。[12]
    3、数据类型丰富
    C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。[13]
    4、表达方式灵活实用
    C语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,其程序设计更主动、灵活。它语法限制不太严格,程序设计自由度大,如对整型量与字符型数据及逻辑型数据可以通用等。[14]
    5、允许直接访问物理地址,对硬件进行操作
    由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。
    6、生成目标代码质量高,程序执行效率高
    C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编程序生成的目标代码效率低10%~20%。[14]
    7、可移植性好
    C语言在不同机器上的C编译程序,86%的代码是公共的,所以C语言的编译程序便于移植。在一个环境上用C语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境中运行。[14]
    8、表达力强
    C语言有丰富的数据结构和运算符。包含了各种数据结构,如整型、数组类型、指针类型和联合类型等,用来实现各种数据结构的运算。C语言的运算符有34种,范围很宽,灵活使用各种运算符可以实现难度极大的运算。
    C语言能直接访问硬件的物理地址,能进行位(bit)操作。兼有高级语言和低级语言的许多优点。
    它既可用来编写系统软件,又可用来开发应用软件,已成为一种通用程序设计语言。
    另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。[14]
      
    缺点
    1、 C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。
    2、 C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。[15]

C11新特性

        1、对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符,aligned_alloc函数以及<stdalign.h>头文件)。
        2、_Noreturn 函数标记,类似于 gcc 的 __attribute__(noreturn)。
        3、_Generic关键字。
        4、多线程(Multithreading)支持,包括:_Thread_local存储类型标识符,<threads.h>;头文件,里面包含了线程的创建和管理函数。
        5、增强的Unicode的支持,基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件<uchar.h>.
        6、删除了 gets() 函数,使用一个新的更安全的函数gets_s()替代。
        7、增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s()等等。
        8、增加了更多浮点处理宏。
        9、匿名结构体/联合体支持,这个在gcc早已存在,C11将其引入标准。
        10、静态断言(Static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。
        11、新的 fopen()模式,(“…x”),类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。
        12、新增 quick_exit()函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作。
        13、_Atomic类型修饰符和<stdatomic.h>头文件。

语言组成
基本构成

    数据类型
    C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。[16]
    常量与变量
    常量其值不可改变,符号常量名通常用大写。
    变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。
    数组
    如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,方括内的索引值是从0算起的。[17]
    指针
    如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。[18]
    指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值,不同于return(z)这样的仅能得到一个返回值。
    指针是一把双刃剑,许多操作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。[17]
    字符串
    C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件<string.h>。[19]
    文件输入/输出
    在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件<stdio.h>;中。
    标准输入/输出
    有三个标准输入/输出是标准I/O库预先定义的:
    stdin标准输入
    stdout标准输出
    stderr输入输出错误[16]
    运算
    C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,对此合理进行分类,找出它们与数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
    先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2.13级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序。[20]

关键字

    关键字又称为保留字,就是已被C语言本身使用,不能作其它用途使用的字。例如关键字不能用作变量名、函数名等标识符
    由ISO标准定义的C语言关键字共32个:
    auto double int struct break else long switch
    case enum register typedef char extern return union
    const float short unsigned continue for signed void
    default goto sizeof volatile do if while static inline
    restrict _Bool _Complex _Imaginary _Generic[21]

    基本数据类型
    void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果。(C89标准新增)
    char:字符型类型数据,属于整型数据的一种。(K&R时期引入)
    int:整型数据,表示范围通常为编译器指定的内存字节长。(K&R时期引入)
    float:单精度浮点型数据,属于浮点数据的一种。(K&R时期引入)
    double:双精度浮点型数据,属于浮点数据的一种。(K&R时期引入)
    _Bool:布尔型(C99标准新增)
    _Complex:复数的基本类型(C99标准新增)
    _Imaginary:虚数,与复数基本类型相似,没有实部的纯虚数(C99标准新增)
    _Generic:提供重载的接口入口(C11标准新增)
    类型修饰关键字
    short:修饰int,短整型数据,可省略被修饰的int。(K&R时期引入)
    long:修饰int,长整型数据,可省略被修饰的int。(K&R时期引入)
    long long:修饰int,超长整型数据,可省略被修饰的int。(C99标准新增)
    signed:修饰整型数据,有符号数据类型。(C89标准新增)
    unsigned:修饰整型数据,无符号数据类型。(K&R时期引入)
    restrict:用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。(C99标准新增)
    复杂类型关键字
    struct:结构体声明。(K&R时期引入)
    union:联合体声明。(K&R时期引入)
    enum:枚举声明。(C89标准新增)
    typedef:声明类型别名。(K&R时期引入)
    sizeof:得到特定类型或特定类型变量的大小。(K&R时期引入)
    inline:内联函数用于取代宏定义,会在任何调用它的地方展开。(C99标准新增)
    存储级别关键字
    auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配。与static相反。当变量未指定时默认为auto。(K&R时期引入)
    static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。(K&R时期引入)
    register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。(K&R时期引入)
    extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。(K&R时期引入)
    const:指定变量不可被当前线程改变(但有可能被系统或其他线程改变)。(C89标准新增)
    volatile:指定变量的值有可能会被系统或其他线程改变,强制编译器每次从内存中取得该变量的值,阻止编译器把该变量优化成寄存器变量。(C89标准新增)

流程控制关键字

    跳转结构
    return:用在函数体中,返回特定值(如果是void类型,则不返回函数值)。(K&R时期引入)
    continue:结束当前循环,开始下一轮循环。(K&R时期引入)
    break:跳出当前循环或switch结构。(K&R时期引入)
    goto:无条件跳转语句。(K&R时期引入)
    分支结构
    if:条件语句,后面不需要放分号。(K&R时期引入)
    else:条件语句否定分支(与if连用)。(K&R时期引入)
    switch:开关语句(多重分支语句)。(K&R时期引入)
    case:开关语句中的分支标记,与switch连用。(K&R时期引入)
    default:开关语句中的“其他”分支,可选。(K&R时期引入)

编译

        #define 预编译宏
        #if 表达式 #else if 表达式 #else #endif 条件编译
        #ifdef 宏 #else #endif 条件编译
        #ifndef 宏 #else #endif 条件编译与条件编译

语法结构

顺序结构

    顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。
    例如:a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为:c = a; a = b; b = c;执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b =c;则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。[22]

选择结构

    顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用选择结构。选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。选择结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的选择语句。选择结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。[23]

循环结构

    循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误。
    特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。
    三个循环的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。
    顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。[24]
    具体内容:
    for循环
    for循环结构是c语言中最具有特色的循环语句,使用最为灵活方便,它的一般形式为:
    for(表达式1;表达式2;表达式3)循环体语句 。(其中;不能省略)
    表达式
    表达式1为初值表达式,用于在循环开始前为循环变量赋初值。
    表达式2是循环控制逻辑表达式,它控制循环执行的条件,决定循环的次数。
    表达式3为循环控制变量修改表达式,它使for循环趋向结束。
    循环体语句是在循环控制条件成立的情况下被反复执行的语句。
    但是在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次,也可能一次也不计算。循环体可能多次执行,也可能一次都不执行。
    先执行表达式2,然后执行循环结构,最后表达式3,一直这样循环下去。
    for循环语句是c语言种功能最为强大的语句,甚至在一定程度上可以代替其他的循环语句。
    do
    do循环结构,do 1 while⑵;的执行顺序是1->2->1...循环,2为循环条件。
    while
    while循环结构,while(1) 2; 的执行顺序是1->2->1...循环,1为循环条件
    以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。

程序结构

    C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。[25]

判断语句(选择结构):

    if 语句:“如果”语句;if—else 语句:“若…(则)…否则…”语句;switch 语句:“切换”语句;switch—case:“切换—情况”语句。

循环语句(循环结构):

    while 语句:“当…”语句;do—while 语句:“做…当…(时候)”语句;for 语句:条件语句(即“(做)…为了…”语句)。

跳转语句(循环结构:是否循环):

    goto 语句:“转舵”语句,也称“跳转”语句;break 语句:“中断”(循环)语句,即结束整个循环;continue 语句:“继续”语句(结束本次循环,继续下一次循环);return 语句:“返回”语句。
    需要说明的是:
        1、一个C语言源程序可以由一个或多个源文件组成。[26]
        2、每个源文件可由一个或多个函数组成。
        3、一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。是整个程序的入口。[2]
        4、源程序中可以有预处理命令(包括include 命令,ifdef、ifndef命令、define命令),预处理命令通常应放在源文件或源程序的最前面。
        5、每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。(结构体、联合体、枚举型的声明的“}”后要加“ ;”。)
        6、标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
    书写规则
        1、一个说明或一个语句占一行。
        2、用{} 括起来的部分,通常表示了程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。
        3、低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。以便看起来更加清晰,增加程序的可读性。在编程时应力求遵循这些规则,以养成良好的编程风格。

函数

    C程序是由一组变量或是函数的外部对象组成的。 函数是一个自我包含的完成一定相关功能的执行代码段。我们可以把函数看成一个“黑盒子”,你只要将数据送进去就能得到结果,而函数内部究竟是如何工作的的,外部程序是不知道的。外部程序所知道的仅限于输入给函数什么以及函数输出什么。函数提供了编制程序的手段,使之容易读、写、理解、排除错误、修改和维护。
    C程序中函数的数目实际上是不限的,如果说有什么限制的话,那就是,一个C程序中必须至少有一个函数,而且其中必须有一个并且仅有一个以main为名,这个函数称为主函数,整个程序从这个主函数开始执行。
    C 语言程序鼓励和提倡人们把一个大问题划分成一个个子问题,对应于解决一个子问题编制一个函数,因此,C 语言程序一般是由大量的小函数而不是由少量大函数构成的,即所谓“小函数构成大程序”。这样的好处是让各部分相互充分独立,并且任务单一。因而这些充分独立的小模块也可以作为一种固定规格的小“构件”, 用来构成新的大程序。
    C语言发展的那么多年来,用C语言开发的系统和程序浩如烟海。在发展的同时也积累了很多能直接使用的库函数。
    ANSI C提供了标准C语言库函数。
    C语言初学者比较喜欢的Turbo C 2.0提供了400多个运行时函数,每个函数都完成特定的功能,用户可随意调用。这些函数总体分成输入输出函数、数学函数、字符串和内存函数、与BIOS和DOS有关的函数、 字符屏幕和图形功能函数、过程控制函数、目录函数等。
    Windows系统所提供的Windows SDK中包含了数千个跟Windows应用程序开发相关的函数。
    其他操作系统,如Linux,也同样提供了大量的函数让应用程序开发人员调用。
    作为程序员应尽量熟悉目标平台库函数其功能。这样才能游刃有余地开发特定平台的应用程序。比如作为Windows应用程序的开发者,应尽量熟悉Windows SDK;作为Linux应用程序开发者,应尽量熟悉Linux系统调用和POSIX函数规范。

运算符号

    比较特别的是,比特右移(>>)运算符可以是算术(左端补最高有效位)或是逻辑(左端补 0)位移。例如,将 11100011 右移 3 比特,算术右移后成为 11111100,逻辑右移则为 00011100。因算术比特右移较适于处理带负号整数,所以几乎所有的编译器都是算术比特右移。
    运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符(=)和逗号运算符。[27]

()、 []、 -> 、 .、!、 ++、 --        圆括号、方括号、指针、成员、逻辑非、自加、自减
++ 、 -- 、 * 、 & 、 ~ 、!        单目运算符
+、 - 、 sizeof、(cast)         
* 、 / 、%        算术运算符
+ 、 -        算术运算符
<< 、 >>        位运算符
< 、 <= 、 > 、 >=        关系运算符
== 、!=        关系运算符号
&        位与
^        位异或
|        位或
&&        逻辑与
||        逻辑或
? 、:        条件运算符
/= 、%= 、 &= 、 |= 、 ^=        赋值运算符
= 、 += 、 -= 、 *= 、         
,        顺序运算符

经典错误
void main()的用法并不是任何标准制定的。 C语言标准语法是int main,任何实现都必须支持int main(void) { /* ... */ }和int main(int argc, char* argv[]) { /* ... */ }。 [9]
类似于a+=a++;或者(i++)+(i++)+(i++)属于未定义行为,并不是说c语言中还未定义这种行为,它早有定论,它的结果取决于编译器实现,不要写这样的代码!

参考资料

        1.    Stephen Prata.C Primer Plus.美国:人民邮电出版社,2005:1-3
        2.    苏小红,孙志岗,陈惠鹏.C语言大学实用教程.北京市:电子工业出版社,2013年:8-8
        3.    C语言的发展过程  .C语言中文网.2012-04-28[引用日期2012-07-31]
        4.    American National Standards Institute(ANSI——美国国家标准学会)  .标准信息网[引用日期2012-08-8]
        5.    ISO/IEC 9899:1990 - Programming languages -- C  .国际标准化组织(ISO - International Organization for Standardization)[引用日期2014-11-22]
        6.    ISO/IEC 9899:1990/Cor 1:1994  .国际标准化组织(ISO - International Organization for Standardization)[引用日期2014-11-22]
        7.    ISO/IEC 9899:1990/Amd 1:1995 - C Integrity  .国际标准化组织(ISO - International Organization for Standardization)[引用日期2014-11-22]
        8.    ISO/IEC 9899:1999 - Programming languages -- C  .国际标准化组织(ISO - International Organization for Standardization)[引用日期2014-11-22]
        9.    ISO/IEC 9899:2011 - Information technology -- Programming languages -- C  .国际标准化组织(ISO - International Organization for Standardization)[引用日期2014-11-22]
        10.    C语言程序设计教程相关介绍  .星火教程网.2012-03-22[引用日期2012-08-1]

[ Last edited by zzz19760225 on 2018-7-31 at 21:29 ]
作者: zzz19760225     时间: 2016-6-26 18:29
1显示帮助文本,txt,chm,
main()
{
paintf("眼下你需要什么?/n")
paintf("需要一本c语言帮助说明书。/n")
paintf("本书内容关于c语言总体综合部分和分部。综合部分包括硬件与c语言以及c语言编辑器内容,分部包括命令文字,命令语法,简单问答类算法,一般完成作业经常需要类算法,综合算法年代可知内容年列表,不包括本年。/n")
paintf("现在开始阅读本书,具体内容如下:。。。。。。/n")
}

C语言和grub是否可以类似,直接在自己电脑上操作帮助文件,集中在几个常用,重要,方便,字数少的命令。

如何在电脑里存储这些帮助书籍信息,在一切命令行和字符模式下显示这些内容?

1如何在命令行下显示,尤其是grub,以及编辑程序。
2将一本书或一篇文章内容转化为c语言信息体的效率做法,命令,还是软件,或者编辑器?
3合适的信息量和需求,分别针对菜鸟,中鸟,老鸟(老鸟部分是针对一些改编阅读帮助,寻找一些新瓶装老酒的经典综合体系的书籍文章群)。

[ Last edited by zzz19760225 on 2016-8-6 at 17:16 ]
作者: zzz19760225     时间: 2016-6-26 18:30
帮助问答部分

针对帮助信息的搜索问答。
属于一加一等于二的计算。
提问+问题=答案。

初级类书籍的集中,中级类书籍的集中,高级类的书籍集中。

小白和新手学习用的案例,可以不用hello  word,而是用坦克对战的简陋模式,代表己方坦克的点或圆,八方运动和步数速度,发射的子弹或炮弹,边界,战斗部分。其次是指挥战斗部分,复制己方内容再添加随机运动。

如果用火柴人的打斗模式也不错。

初级书籍应该加上函数部分,将高中数学的函数对应部分加在其中。

[ Last edited by zzz19760225 on 2016-9-29 at 21:55 ]
作者: zzz19760225     时间: 2016-6-26 18:30
硬件和c编辑器联系
不同的硬件就如酒瓶,装c语言这个酒,对硬件的检索应该加入到编辑器的功能中,硬件信息的载入作为基础。你熟悉其,就可以把酒装进入,假设语言模式实践检验。

[ Last edited by zzz19760225 on 2016-7-6 at 03:52 ]
作者: zzz19760225     时间: 2016-6-26 18:31
假设具有针对c语言的行业信息集中协会,中国人的自由模式,同样针对的也是处理汉字数码信息的中层软硬可靠语言。

汉字类汇编,

汉字类全自由结构的语法和所有权语言。

在特定概念范围,针对可能性的自由范围,实践所生成的相对合适的限制语言,被选择为普及内容,这个普及内容就是标准。

在一个个目的与行为之路的互相转换中,很容易失去开始所向的方向。

道,变化,可能,不确定,可行。自由。
技术的自由这个抽象的概念,在不同的事物上会有不同的范围概念圆的集合,主要用已知和未知可知来分方向。

已有硬件的范围,已有硬件的可用范围,已有硬件可用范围里的使用内容和使用的标准化稳定范围。

完全用人工,就如农业群体与工农群体之间的质量比较。机器人的作用是效率,而不是代替,是作为一个工具而不是人的情感代表来取代人自身,就如宠物与人的关系(一位极端喜好自己宠物的人可能在将自己宠物与他人比较时,忽略他人与自身相同的人概念,但是当自身与宠物发生生死取舍的,一般会选择舍去宠物这个身外之物。)。

编程语言与硬件可用范围的关系,以及与已有编程语言标准的关系,这个需要很熟悉已有内容,就如学习钻出了知识的概念群。

知识惯性,外行互动,服务要求,极端渐变,寻找更新。

[ Last edited by zzz19760225 on 2016-9-29 at 17:54 ]
作者: zzz19760225     时间: 2016-6-26 18:32
汉字DOS的基础文字信息,
语言编辑器工具,启动引导系统的基本环境或已有linux veket,FREEDOS,windows cmd,
结构,权限,范围,内容,公平
算法,效率,
界面,功能,功能应用获取的整体综合使用,
优化的自动和手工,单机,单用户,机器范围安全和信息安全的问题,网路中机器用户信息的安全问题,
更新,反馈,网路帮助,网络社群,个体网络交际门路类服务器,
生活编辑类软件,
工作编辑类软件,
学习编辑类软件。
生活为先,对应生活运用的用字需求,从无知进入有知的家庭教育,衣食住行乐的需求不足部分。
学习其次,对应成长中学生时代和自学结构,终身学习精神,追求更好而努力出更好。
工作最后,进入社会以自我生存生活学习综合内容为对象的基础工作,并且综合其他内容为职业的工作生活,包括从为别人工作转化为自我工作的终身职业工作和兴趣工作。

编码的无知,有知,可知,未知,不知的部分,集中在有知的长期和十年时代层级的稳定可靠自由效率内容,稳定而能愿意接受,可靠而能托付事情,自由而能适应时代变化,效率而实现更多时间于生活学习工作。编码方阵?

[ Last edited by zzz19760225 on 2016-7-6 at 20:40 ]
作者: zzz19760225     时间: 2016-6-26 18:33
1veket下的gcc,emacs,vim(这个需要尝试实现),
虚拟机或实体机下的freedos,msdos,tc编辑器,
实体机的硬件和分区表,bios,三个变动环境中的构建可能探索,变动的硬件和环境,与相对不变的信息知识技术结构。

[ Last edited by zzz19760225 on 2016-7-7 at 04:16 ]
作者: zzz19760225     时间: 2016-6-26 18:34
1

开发shell  和和sell编程
打造工具和资源材料开发未知领域与用工具制作产品服务消费用户。

用编程语言去画出需要的内容,每一笔都是一个指令,得出一个内容,这些内容添补到受体上,形成追求个人需求画面的绘画过程。

目前的编程语言无法直接运行,需要达到的使用效果是操作系统,软件,硬件接口,如一个中间话筒,用户输入的内容需要同步或近乎同步的反应到指令对象,并形成一个整体状态缩小图形或地图。多层信息统计组成不同的信息地图,通过地图进行相对修改和查看差异,探索可能极限。

在linux优先使用vim,相对方便,可以不做任何调整。

电脑主板硬件信息地址(指针?),计算地址,内存地址,硬盘地址,优盘地址,用户界面硬件地址(显示屏,显卡,声卡,音响,网卡,路由器)。

操作系统的状态,静态的,动态。算盘式操作系统,静水式操作系统,流水式操作系统,石头式操作系统,动物式操作系统。机械电器类电脑,输入计算类电脑,主动类人电脑。

随时中断信息运输的路程,任何时候返回开始的出发点,停止正在运输的路程转到指定的出发点,临时暂时的停留再继续,结束所有路程。

编程语言表格,格子表格的层重叠,数据信息格子转向的跳线指令(从一个格子跑到另一个表格上的格子)。

类似sed,ex和vi的单句输入,这个输入相对一个整体,这个整体可以是处于类似调试的动态循环状态,或者类似格子表格的静态填格子的行为。

格子表格的层面限制和不限制层面的自由格子关系。
以自由信息为基础,向可行可用可靠走。

用3D软件构建格子表格,在格子表格中放置概念圆和原点信息。

小白新手学习的动静互换,首先是一个可以通过可见部分数字修改实现变化的编程游戏,其次是已经存在的3D格子表格打开信息知识技术帮助书籍学习,累了就去修改那个动态循环编程游戏玩,两者相同的基础是同一个编程语言范围内,而长期的硬件接口,应用软件,操作系统都是沿着这条路走的,自由可能无限的内容,使这条路只是一个方向可以确定,其余的无法预知,只有做出来的现在和总结出的过去。在龙芯熟悉和能用的延伸余力之外,从相同的命令集向其他计算机熟悉。

存储图形块的格子圆组成的方块图,有点类似硬盘咯。方块组图是针对信息层的逐层延伸需要。一个名字需要存储,例如文件这个两个汉字,通过18030和十六进数,转换为二进制,这二进制数组成一个数群,这些数群以自身影子照射的模式投影到硬盘的电路存储上。这时有屏幕上显示的文件这个名,同样有硬盘里文件这个二进制影子,还有围绕这个名与影的过程信息路或信息流。外接硬件自带驱动与三体操作系统自身硬件驱动各自起到作用,不需要另外寻找和安装硬件驱动(驱动更新可以闲置硬件本身附带的驱动)。五分之一防范心和五分之一信任心的中间群范围,这样分成人与人信任和怀疑两端中的三个状态,极端信任,极端怀疑,大概主次的中间变化范围。

        物态的自由状态,中间常态自由状态,人需的自由状态。自由的可能概念和选择行为概念,力量的有概念,意识在和意识到。自由的反向负自由概念和直接延伸极端的反自由概念。自由的合理状态就是自由。定义自由与合理的另一种自由和相对定义前的自由的无自由。文字定义比较产生的不自由,不自由的可用性质。行为自由无自由。

三层概念的自由极限,常用道路,人需底限。编程需要的极限之处人是无法看全看清的,但是这种极限的不确定无限概念空间是可以存在的,这可以算假设,如果能用最好。在目前已有的内容上,总有比较好的当时,时代,过去的相对好的内容(比较能发挥效率的状态)。当遇到灾难和思考比较极限的时候,会有人生于此世的死这个一线的生存综合内容,没有空气,没有水,没有食物,没有内脏功能,等等人生存的底限。编程语言的生存,常用,极限。

增减延伸管道符号,等于号的变异。等于号,不等于号,约等于号,增减号,

~用约等于号会与约等于号的概念冲突,约等于上下两边加上个加和减号。约等于的定义误差归纳,增减号的增加减少随需参与加入的内容,一个增减号与另一个增减号之间的内容是一个回合,每个增减号后的第一个内容前面内容的综合总和。肯定确定与不确定随机内容的不断更新过程。

用ex模式,格子表格的半边操作,输入格子名,输入需要的内容,设置路上内容,类似增减号计算。
另半边是3D图形的直观,而这个直观过程可以通过另半边天的类ex操作模式,建立树形结构的分支,并行运行部分,修改部分。这个3D格子表格功能集成在操作系统或功能软件,硬件接口中,需要简化运行内容和体积大小。

二进制的表达与十进制和其他进制区分开来,有无,无为零有为一,无无为有,有无为有,有有为无。将不同进制计算,数字与字符区别的内容如何很好的行驶于字符为主的自然语言交流中?大道混沌趋向分路,路上极限上下分层类批量加工,特殊和个体空间及转变。

[  名  /  动   \   名  ]       [   名  /  动   \  名  /  动  \  名      ]
[  信息   /   地址   ]        [   动词 /  数组 \  数群  /  数形  ]
数形,函数集,数字概念的点,线段,射线,直线,方形,圆线形,规律曲线形,非规律曲线形。规律立体,非规律立体。规律多维体,非规律多维体。
数形内规律层面分类,数形内非规律层面分类。
规律数字,非规律数字。
规律数和非规律数的互相准确计算和非准确计算,可得结果和非得结果,定义数字和结果,约等于结果。
|[   /  ]|[   /  ]|[   /  ]|[   /  ]|[   /  ][   /  ][  /   ][   /   ][   /   ]|
---------------------------------------------------
|           |         |         |         |         |        |        |        |          |
---------------------------------------------------
|(   )| ( )|()| ()| ()|()|()|()|(  )|
---------------------------------------------------
|    /    |     /   |    /   |    /   |    /   |   \   |     \   |    \   |    \    |
+----+-----+-----+----+----+----+---+----+-----+
|    >    |     >  |     <   |    <  |    >   |    >   |   >   |   >   |    <   |
---------------------------------------------------
有些内容明显是有人走过,直接使用就可以了,但是要在合适的时候发现需要的内容,需要一个分享,标准名义和搜索的部分。

名,地址,起名时间,信息大小,统计标准,
修改时间1,结果,地址路,开始,备注信息;
修改时间2,,,,;
修改信息用于数据恢复。

名,起点仓,运输车,运输路,终点仓。
名字当中包括所有信息,

命令名/命令内容(名,起点仓,运输车,运输路,终点仓)/时间/

时间,过去时间,现在时间,未来时间,
过去的记录修改恢复时间,现在的使用时间,校准时间,错误时间,未来的预算计划类需使用时间。
用光感角度提取线条比较,统计出以天为基础的近似时间值,用于时间缺失。石英钟时间,无线电波时间,网络中国时间,网络外国时间。

不定义空间大小,最小十倍百倍千倍万倍空间,最小一到五倍空间。
顺序存储节约空间,增大内存硬盘空间,压缩式存储空间。
这些内容在论坛里应该有。

[ Last edited by zzz19760225 on 2016-9-30 at 02:16 ]
作者: zzz19760225     时间: 2016-6-26 18:36
1C -> C++ -> go -> vala->gtk..................qml              qt..........

[ Last edited by zzz19760225 on 2016-7-28 at 15:18 ]
作者: zzz19760225     时间: 2016-6-26 18:37
4个函数实现的C编译器:C4
C4   2014-11-13 12:57:30 发布
您的评价:       
     
0.0       
收藏     0收藏
4个函数实现的c编译器,大约500行。基本上已经比较完备了,可以自己编译自己。

使用方法:

gcc -o c4 c4.c  (you may need the -m32 option on 64bit machines)
./c4 hello.c
./c4 -s hello.c

./c4 c4.c hello.c
./c4 c4.c c4.c hello.c
项目主页:http://www.open-open.com/lib/view/home/1415851490758


// c4.c - C in four functions

// char, int, and pointer types
// if, while, return, and expression statements
// just enough features to allow self-compilation and a bit more

// Written by Robert Swierczek

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <unistd.h>
#include <fcntl.h>

char *p, *lp, // current position in source code
     *data;   // data/bss pointer

int *e, *le,  // current position in emitted code
    *id,      // currently parsed identifier
    *sym,     // symbol table (simple list of identifiers)
    tk,       // current token
    ival,     // current token value
    ty,       // current expression type
    loc,      // local variable offset
    line,     // current line number
    src,      // print source and assembly flag
    debug;    // print executed instructions

// tokens and classes (operators last and in precedence order)
enum {
  Num = 128, Fun, Sys, Glo, Loc, Id,
  Char, Else, Enum, If, Int, Return, Sizeof, While,
  Assign, Cond, Lor, Lan, Or, Xor, And, Eq, Ne, Lt, Gt, Le, Ge, Shl, Shr, Add, Sub, Mul, Div, Mod, Inc, Dec, Brak
};

// opcodes
enum { LEA ,IMM ,JMP ,JSR ,BZ  ,BNZ ,ENT ,ADJ ,LEV ,LI  ,LC  ,SI  ,SC  ,PSH ,
       OR  ,XOR ,AND ,EQ  ,NE  ,LT  ,GT  ,LE  ,GE  ,SHL ,SHR ,ADD ,SUB ,MUL ,DIV ,MOD ,
       OPEN,READ,CLOS,PRTF,MALC,MSET,MCMP,EXIT };

// types
enum { CHAR, INT, PTR };

// identifier offsets (since we can't create an ident struct)
enum { Tk, Hash, Name, Class, Type, Val, HClass, HType, HVal, Idsz };

void next()
{
  char *pp;

  while (tk = *p) {
    ++p;
    if (tk == '\n') {
      if (src) {
        printf("%d: %.*s", line, p - lp, lp);
        lp = p;
        while (le < e) {
          printf("%8.4s", &"LEA ,IMM ,JMP ,JSR ,BZ  ,BNZ ,ENT ,ADJ ,LEV ,LI  ,LC  ,SI  ,SC  ,PSH ,"
                           "OR  ,XOR ,AND ,EQ  ,NE  ,LT  ,GT  ,LE  ,GE  ,SHL ,SHR ,ADD ,SUB ,MUL ,DIV ,MOD ,"
                           "OPEN,READ,CLOS,PRTF,MALC,MSET,MCMP,EXIT,"[*++le * 5]);
          if (*le <= ADJ) printf(" %d\n", *++le); else printf("\n");
        }
      }
      ++line;
    }
    else if (tk == '#') {
      while (*p != 0 && *p != '\n') ++p;
    }
    else if ((tk >= 'a' && tk <= 'z') || (tk >= 'A' && tk <= 'Z') || tk == '_') {
      pp = p - 1;
      while ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z') || (*p >= '0' && *p <= '9') || *p == '_')
        tk = tk * 147 + *p++;
      tk = (tk << 6) + (p - pp);
      id = sym;
      while (id[Tk]) {
        if (tk == id[Hash] && !memcmp((char *)id[Name], pp, p - pp)) { tk = id[Tk]; return; }
        id = id + Idsz;
      }
      id[Name] = (int)pp;
      id[Hash] = tk;
      tk = id[Tk] = Id;
      return;
    }
    else if (tk >= '0' && tk <= '9') {
      if (ival = tk - '0') { while (*p >= '0' && *p <= '9') ival = ival * 10 + *p++ - '0'; }
      else if (*p == 'x' || *p == 'X') {
        while ((tk = *++p) && ((tk >= '0' && tk <= '9') || (tk >= 'a' && tk <= 'f') || (tk >= 'A' && tk <= 'F')))
          ival = ival * 16 + (tk & 15) + (tk >= 'A' ? 9 : 0);
      }
      else { while (*p >= '0' && *p <= '7') ival = ival * 8 + *p++ - '0'; }
      tk = Num;
      return;
    }
    else if (tk == '/') {
      if (*p == '/') {
        ++p;
        while (*p != 0 && *p != '\n') ++p;
      }
      else {
        tk = Div;
        return;
      }
    }
    else if (tk == '\'' || tk == '"') {
      pp = data;
      while (*p != 0 && *p != tk) {
        if ((ival = *p++) == '\\') {
          if ((ival = *p++) == 'n') ival = '\n';
        }
        if (tk == '"') *data++ = ival;
      }
      ++p;
      if (tk == '"') ival = (int)pp; else tk = Num;
      return;
    }
    else if (tk == '=') { if (*p == '=') { ++p; tk = Eq; } else tk = Assign; return; }
    else if (tk == '+') { if (*p == '+') { ++p; tk = Inc; } else tk = Add; return; }
    else if (tk == '-') { if (*p == '-') { ++p; tk = Dec; } else tk = Sub; return; }
    else if (tk == '!') { if (*p == '=') { ++p; tk = Ne; } return; }
    else if (tk == '<') { if (*p == '=') { ++p; tk = Le; } else if (*p == '<') { ++p; tk = Shl; } else tk = Lt; return; }
    else if (tk == '>') { if (*p == '=') { ++p; tk = Ge; } else if (*p == '>') { ++p; tk = Shr; } else tk = Gt; return; }
    else if (tk == '|') { if (*p == '|') { ++p; tk = Lor; } else tk = Or; return; }
    else if (tk == '&') { if (*p == '&') { ++p; tk = Lan; } else tk = And; return; }
    else if (tk == '^') { tk = Xor; return; }
    else if (tk == '%') { tk = Mod; return; }
    else if (tk == '*') { tk = Mul; return; }
    else if (tk == '[') { tk = Brak; return; }
    else if (tk == '?') { tk = Cond; return; }
    else if (tk == '~' || tk == ';' || tk == '{' || tk == '}' || tk == '(' || tk == ')' || tk == ']' || tk == ',' || tk == ':') return;
  }
}

void expr(int lev)
{
  int t, *d;

  if (!tk) { printf("%d: unexpected eof in expression\n", line); exit(-1); }
  else if (tk == Num) { *++e = IMM; *++e = ival; next(); ty = INT; }
  else if (tk == '"') {
    *++e = IMM; *++e = ival; next();
    while (tk == '"') next();
    data = (char *)((int)data + sizeof(int) & -sizeof(int)); ty = PTR;
  }
  else if (tk == Sizeof) {
    next(); if (tk == '(') next(); else { printf("%d: open paren expected in sizeof\n", line); exit(-1); }
    ty = INT; if (tk == Int) next(); else if (tk == Char) { next(); ty = CHAR; }
    while (tk == Mul) { next(); ty = ty + PTR; }
    if (tk == ')') next(); else { printf("%d: close paren expected in sizeof\n", line); exit(-1); }
    *++e = IMM; *++e = (ty == CHAR) ? sizeof(char) : sizeof(int);
    ty = INT;
  }
  else if (tk == Id) {
    d = id; next();
    if (tk == '(') {
      next();
      t = 0;
      while (tk != ')') { expr(Assign); *++e = PSH; ++t; if (tk == ',') next(); }
      next();
      if (d[Class] == Sys) *++e = d[Val];
      else if (d[Class] == Fun) { *++e = JSR; *++e = d[Val]; }
      else { printf("%d: bad function call\n", line); exit(-1); }
      if (t) { *++e = ADJ; *++e = t; }
      ty = d[Type];
    }
    else if (d[Class] == Num) { *++e = IMM; *++e = d[Val]; ty = INT; }
    else {
      if (d[Class] == Loc) { *++e = LEA; *++e = loc - d[Val]; }
      else if (d[Class] == Glo) { *++e = IMM; *++e = d[Val]; }
      else { printf("%d: undefined variable\n", line); exit(-1); }
      *++e = ((ty = d[Type]) == CHAR) ? LC : LI;
    }
  }
  else if (tk == '(') {
    next();
    if (tk == Int || tk == Char) {
      t = (tk == Int) ? INT : CHAR; next();
      while (tk == Mul) { next(); t = t + PTR; }
      if (tk == ')') next(); else { printf("%d: bad cast\n", line); exit(-1); }
      expr(Inc);
      ty = t;
    }
    else {
      expr(Assign);
      if (tk == ')') next(); else { printf("%d: close paren expected\n", line); exit(-1); }
    }
  }
  else if (tk == Mul) {
    next(); expr(Inc);
    if (ty > INT) ty = ty - PTR; else { printf("%d: bad dereference\n", line); exit(-1); }
    *++e = (ty == CHAR) ? LC : LI;
  }
  else if (tk == And) {
    next(); expr(Inc);
    if (*e == LC || *e == LI) --e; else { printf("%d: bad address-of\n", line); exit(-1); }
    ty = ty + PTR;
  }
  else if (tk == '!') { next(); expr(Inc); *++e = PSH; *++e = IMM; *++e = 0; *++e = EQ; ty = INT; }
  else if (tk == '~') { next(); expr(Inc); *++e = PSH; *++e = IMM; *++e = -1; *++e = XOR; ty = INT; }
  else if (tk == Add) { next(); expr(Inc); ty = INT; }
  else if (tk == Sub) {
    next(); *++e = IMM;
    if (tk == Num) { *++e = -ival; next(); } else { *++e = -1; *++e = PSH; expr(Inc); *++e = MUL; }
    ty = INT;
  }
  else if (tk == Inc || tk == Dec) {
    t = tk; next(); expr(Inc);
    if (*e == LC) { *e = PSH; *++e = LC; }
    else if (*e == LI) { *e = PSH; *++e = LI; }
    else { printf("%d: bad lvalue in pre-increment\n", line); exit(-1); }
    *++e = PSH;
    *++e = IMM; *++e = (ty > PTR) ? sizeof(int) : sizeof(char);
    *++e = (t == Inc) ? ADD : SUB;
    *++e = (ty == CHAR) ? SC : SI;
  }
  else { printf("%d: bad expression\n", line); exit(-1); }

  while (tk >= lev) { // "precedence climbing" or "Top Down Operator Precedence" method
    t = ty;
    if (tk == Assign) {
      next();
      if (*e == LC || *e == LI) *e = PSH; else { printf("%d: bad lvalue in assignment\n", line); exit(-1); }
      expr(Assign); *++e = ((ty = t) == CHAR) ? SC : SI;
    }
    else if (tk == Cond) {
      next();
      *++e = BZ; d = ++e;
      expr(Assign);
      if (tk == ':') next(); else { printf("%d: conditional missing colon\n", line); exit(-1); }
      *d = (int)(e + 3); *++e = JMP; d = ++e;
      expr(Cond);
      *d = (int)(e + 1);
    }
    else if (tk == Lor) { next(); *++e = BNZ; d = ++e; expr(Lan); *d = (int)(e + 1); ty = INT; }
    else if (tk == Lan) { next(); *++e = BZ;  d = ++e; expr(Or);  *d = (int)(e + 1); ty = INT; }
    else if (tk == Or)  { next(); *++e = PSH; expr(Xor); *++e = OR;  ty = INT; }
    else if (tk == Xor) { next(); *++e = PSH; expr(And); *++e = XOR; ty = INT; }
    else if (tk == And) { next(); *++e = PSH; expr(Eq);  *++e = AND; ty = INT; }
    else if (tk == Eq)  { next(); *++e = PSH; expr(Lt);  *++e = EQ;  ty = INT; }
    else if (tk == Ne)  { next(); *++e = PSH; expr(Lt);  *++e = NE;  ty = INT; }
    else if (tk == Lt)  { next(); *++e = PSH; expr(Shl); *++e = LT;  ty = INT; }
    else if (tk == Gt)  { next(); *++e = PSH; expr(Shl); *++e = GT;  ty = INT; }
    else if (tk == Le)  { next(); *++e = PSH; expr(Shl); *++e = LE;  ty = INT; }
    else if (tk == Ge)  { next(); *++e = PSH; expr(Shl); *++e = GE;  ty = INT; }
    else if (tk == Shl) { next(); *++e = PSH; expr(Add); *++e = SHL; ty = INT; }
    else if (tk == Shr) { next(); *++e = PSH; expr(Add); *++e = SHR; ty = INT; }
    else if (tk == Add) {
      next(); *++e = PSH; expr(Mul);
      if ((ty = t) > PTR) { *++e = PSH; *++e = IMM; *++e = sizeof(int); *++e = MUL;  }
      *++e = ADD;
    }
    else if (tk == Sub) {
      next(); *++e = PSH; expr(Mul);
      if (t > PTR && t == ty) { *++e = SUB; *++e = PSH; *++e = IMM; *++e = sizeof(int); *++e = DIV; ty = INT; }
      else if ((ty = t) > PTR) { *++e = PSH; *++e = IMM; *++e = sizeof(int); *++e = MUL; *++e = SUB; }
      else *++e = SUB;
    }
    else if (tk == Mul) { next(); *++e = PSH; expr(Inc); *++e = MUL; ty = INT; }
    else if (tk == Div) { next(); *++e = PSH; expr(Inc); *++e = DIV; ty = INT; }
    else if (tk == Mod) { next(); *++e = PSH; expr(Inc); *++e = MOD; ty = INT; }
    else if (tk == Inc || tk == Dec) {
      if (*e == LC) { *e = PSH; *++e = LC; }
      else if (*e == LI) { *e = PSH; *++e = LI; }
      else { printf("%d: bad lvalue in post-increment\n", line); exit(-1); }
      *++e = PSH; *++e = IMM; *++e = (ty > PTR) ? sizeof(int) : sizeof(char);
      *++e = (tk == Inc) ? ADD : SUB;
      *++e = (ty == CHAR) ? SC : SI;
      *++e = PSH; *++e = IMM; *++e = (ty > PTR) ? sizeof(int) : sizeof(char);
      *++e = (tk == Inc) ? SUB : ADD;
      next();
    }
    else if (tk == Brak) {
      next(); *++e = PSH; expr(Assign);
      if (tk == ']') next(); else { printf("%d: close bracket expected\n", line); exit(-1); }
      if (t > PTR) { *++e = PSH; *++e = IMM; *++e = sizeof(int); *++e = MUL;  }
      else if (t < PTR) { printf("%d: pointer type expected\n", line); exit(-1); }
      *++e = ADD;
      *++e = ((ty = t - PTR) == CHAR) ? LC : LI;
    }
    else { printf("%d: compiler error tk=%d\n", line, tk); exit(-1); }
  }
}

void stmt()
{
  int *a, *b;

  if (tk == If) {
    next();
    if (tk == '(') next(); else { printf("%d: open paren expected\n", line); exit(-1); }
    expr(Assign);
    if (tk == ')') next(); else { printf("%d: close paren expected\n", line); exit(-1); }
    *++e = BZ; b = ++e;
    stmt();
    if (tk == Else) {
      *b = (int)(e + 3); *++e = JMP; b = ++e;
      next();
      stmt();
    }
    *b = (int)(e + 1);
  }
  else if (tk == While) {
    next();
    a = e + 1;
    if (tk == '(') next(); else { printf("%d: open paren expected\n", line); exit(-1); }
    expr(Assign);
    if (tk == ')') next(); else { printf("%d: close paren expected\n", line); exit(-1); }
    *++e = BZ; b = ++e;
    stmt();
    *++e = JMP; *++e = (int)a;
    *b = (int)(e + 1);
  }
  else if (tk == Return) {
    next();
    if (tk != ';') expr(Assign);
    *++e = LEV;
    if (tk == ';') next(); else { printf("%d: semicolon expected\n", line); exit(-1); }
  }
  else if (tk == '{') {
    next();
    while (tk != '}') stmt();
    next();
  }
  else if (tk == ';') {
    next();
  }
  else {
    expr(Assign);
    if (tk == ';') next(); else { printf("%d: semicolon expected\n", line); exit(-1); }
  }
}

int main(int argc, char **argv)
{
  int fd, bt, ty, poolsz, *idmain;
  int *pc, *sp, *bp, a, cycle; // vm registers
  int i, *t; // temps

  --argc; ++argv;
  if (argc > 0 && **argv == '-' && (*argv)[1] == 's') { src = 1; --argc; ++argv; }
  if (argc > 0 && **argv == '-' && (*argv)[1] == 'd') { debug = 1; --argc; ++argv; }
  if (argc < 1) { printf("usage: c4 [-s] [-d] file ...\n"); return -1; }

  if ((fd = open(*argv, 0)) < 0) { printf("could not open(%s)\n", *argv); return -1; }

  poolsz = 256*1024; // arbitrary size
  if (!(sym = malloc(poolsz))) { printf("could not malloc(%d) symbol area\n", poolsz); return -1; }
  if (!(le = e = malloc(poolsz))) { printf("could not malloc(%d) text area\n", poolsz); return -1; }
  if (!(data = malloc(poolsz))) { printf("could not malloc(%d) data area\n", poolsz); return -1; }
  if (!(sp = malloc(poolsz))) { printf("could not malloc(%d) stack area\n", poolsz); return -1; }

  memset(sym,  0, poolsz);
  memset(e,    0, poolsz);
  memset(data, 0, poolsz);

  p = "char else enum if int return sizeof while "
      "open read close printf malloc memset memcmp exit void main";
  i = Char; while (i <= While) { next(); id[Tk] = i++; } // add keywords to symbol table
  i = OPEN; while (i <= EXIT) { next(); id[Class] = Sys; id[Type] = INT; id[Val] = i++; } // add library to symbol table
  next(); id[Tk] = Char; // handle void type
  next(); idmain = id; // keep track of main

  if (!(lp = p = malloc(poolsz))) { printf("could not malloc(%d) source area\n", poolsz); return -1; }
  if ((i = read(fd, p, poolsz-1)) <= 0) { printf("read() returned %d\n", i); return -1; }
  p = 0;
  close(fd);

  // parse declarations
  line = 1;
  next();
  while (tk) {
    bt = INT; // basetype
    if (tk == Int) next();
    else if (tk == Char) { next(); bt = CHAR; }
    else if (tk == Enum) {
      next();
      if (tk != '{') next();
      if (tk == '{') {
        next();
        i = 0;
        while (tk != '}') {
          if (tk != Id) { printf("%d: bad enum identifier %d\n", line, tk); return -1; }
          next();
          if (tk == Assign) {
            next();
            if (tk != Num) { printf("%d: bad enum initializer\n", line); return -1; }
            i = ival;
            next();
          }
          id[Class] = Num; id[Type] = INT; id[Val] = i++;
          if (tk == ',') next();
        }
        next();
      }
    }
    while (tk != ';' && tk != '}') {
      ty = bt;
      while (tk == Mul) { next(); ty = ty + PTR; }
      if (tk != Id) { printf("%d: bad global declaration\n", line); return -1; }
      if (id[Class]) { printf("%d: duplicate global definition\n", line); return -1; }
      next();
      id[Type] = ty;
      if (tk == '(') { // function
        id[Class] = Fun;
        id[Val] = (int)(e + 1);
        next(); i = 0;
        while (tk != ')') {
          ty = INT;
          if (tk == Int) next();
          else if (tk == Char) { next(); ty = CHAR; }
          while (tk == Mul) { next(); ty = ty + PTR; }
          if (tk != Id) { printf("%d: bad parameter declaration\n", line); return -1; }
          if (id[Class] == Loc) { printf("%d: duplicate parameter definition\n", line); return -1; }
          id[HClass] = id[Class]; id[Class] = Loc;
          id[HType]  = id[Type];  id[Type] = ty;
          id[HVal]   = id[Val];   id[Val] = i++;
          next();
          if (tk == ',') next();
        }
        next();
        if (tk != '{') { printf("%d: bad function definition\n", line); return -1; }
        loc = ++i;
        next();
        while (tk == Int || tk == Char) {
          bt = (tk == Int) ? INT : CHAR;
          next();
          while (tk != ';') {
            ty = bt;
            while (tk == Mul) { next(); ty = ty + PTR; }
            if (tk != Id) { printf("%d: bad local declaration\n", line); return -1; }
            if (id[Class] == Loc) { printf("%d: duplicate local definition\n", line); return -1; }
            id[HClass] = id[Class]; id[Class] = Loc;
            id[HType]  = id[Type];  id[Type] = ty;
            id[HVal]   = id[Val];   id[Val] = ++i;
            next();
            if (tk == ',') next();
          }
          next();
        }
        *++e = ENT; *++e = i - loc;
        while (tk != '}') stmt();
        *++e = LEV;
        id = sym; // unwind symbol table locals
        while (id[Tk]) {
          if (id[Class] == Loc) {
            id[Class] = id[HClass];
            id[Type] = id[HType];
            id[Val] = id[HVal];
          }
          id = id + Idsz;
        }
      }
      else {
        id[Class] = Glo;
        id[Val] = (int)data;
        data = data + sizeof(int);
      }
      if (tk == ',') next();
    }
    next();
  }

  if (!(pc = (int *)idmain[Val])) { printf("main() not defined\n"); return -1; }
  if (src) return 0;

  // setup stack
  sp = (int *)((int)sp + poolsz);
  *--sp = EXIT; // call exit if main returns
  *--sp = PSH; t = sp;
  *--sp = argc;
  *--sp = (int)argv;
  *--sp = (int)t;

  // run...
  cycle = 0;
  while (1) {
    i = *pc++; ++cycle;
    if (debug) {
      printf("%d> %.4s", cycle,
        &"LEA ,IMM ,JMP ,JSR ,BZ  ,BNZ ,ENT ,ADJ ,LEV ,LI  ,LC  ,SI  ,SC  ,PSH ,"
         "OR  ,XOR ,AND ,EQ  ,NE  ,LT  ,GT  ,LE  ,GE  ,SHL ,SHR ,ADD ,SUB ,MUL ,DIV ,MOD ,"
         "OPEN,READ,CLOS,PRTF,MALC,MSET,MCMP,EXIT,"[i * 5]);
      if (i <= ADJ) printf(" %d\n", *pc); else printf("\n");
    }
    if      (i == LEA) a = (int)(bp + *pc++);                             // load local address
    else if (i == IMM) a = *pc++;                                         // load global address or immediate
    else if (i == JMP) pc = (int *)*pc;                                   // jump
    else if (i == JSR) { *--sp = (int)(pc + 1); pc = (int *)*pc; }        // jump to subroutine
    else if (i == BZ)  pc = a ? pc + 1 : (int *)*pc;                      // branch if zero
    else if (i == BNZ) pc = a ? (int *)*pc : pc + 1;                      // branch if not zero
    else if (i == ENT) { *--sp = (int)bp; bp = sp; sp = sp - *pc++; }     // enter subroutine
    else if (i == ADJ) sp = sp + *pc++;                                   // stack adjust
    else if (i == LEV) { sp = bp; bp = (int *)*sp++; pc = (int *)*sp++; } // leave subroutine
    else if (i == LI)  a = *(int *)a;                                     // load int
    else if (i == LC)  a = *(char *)a;                                    // load char
    else if (i == SI)  *(int *)*sp++ = a;                                 // store int
    else if (i == SC)  a = *(char *)*sp++ = a;                            // store char
    else if (i == PSH) *--sp = a;                                         // push

    else if (i == OR)  a = *sp++ |  a;
    else if (i == XOR) a = *sp++ ^  a;
    else if (i == AND) a = *sp++ &  a;
    else if (i == EQ)  a = *sp++ == a;
    else if (i == NE)  a = *sp++ != a;
    else if (i == LT)  a = *sp++ <  a;
    else if (i == GT)  a = *sp++ >  a;
    else if (i == LE)  a = *sp++ <= a;
    else if (i == GE)  a = *sp++ >= a;
    else if (i == SHL) a = *sp++ << a;
    else if (i == SHR) a = *sp++ >> a;
    else if (i == ADD) a = *sp++ +  a;
    else if (i == SUB) a = *sp++ -  a;
    else if (i == MUL) a = *sp++ *  a;
    else if (i == DIV) a = *sp++ /  a;
    else if (i == MOD) a = *sp++ %  a;

    else if (i == OPEN) a = open((char *)sp[1], *sp);
    else if (i == READ) a = read(sp[2], (char *)sp[1], *sp);
    else if (i == CLOS) a = close(*sp);
    else if (i == PRTF) { t = sp + pc[1]; a = printf((char *)t[-1], t[-2], t[-3], t[-4], t[-5], t[-6]); }
    else if (i == MALC) a = (int)malloc(*sp);
    else if (i == MSET) a = (int)memset((char *)sp[2], sp[1], *sp);
    else if (i == MCMP) a = memcmp((char *)sp[2], (char *)sp[1], *sp);
    else if (i == EXIT) { printf("exit(%d) cycle = %d\n", *sp, cycle); return *sp; }
    else { printf("unknown instruction = %d! cycle = %d\n", i, cycle); return -1; }
  }
}

[ Last edited by zzz19760225 on 2016-12-4 at 00:33 ]
作者: zzz19760225     时间: 2016-6-26 18:38
1
学习较底层编程:动手写一个C语言编译器
http://blog.jobbole.com/77305/

[ Last edited by zzz19760225 on 2016-12-4 at 01:03 ]
作者: zzz19760225     时间: 2016-6-26 18:38
习语言 编辑
习语言即中文版的C语言,确切的说是支持中文代码的C语言的超集,由一套完备的编程语法和相配套的工具组成。
中文名 习语言 外文名 The Learn Programming Language 文件扩展名 习、接口
目录
1 简介
2 简单例子
3 各版本
4 获取途径
5 系列作品
简介编辑
习语言即中文版的C语言,由一套完备的编程语法和相配套的工具组成,旨在将编程大众化,普及化,中文化。适合作为初学者的入门学习工具。
作为一种中文编程语言,习语言中所有的关键字和函数都为中文。习语言已经完全支持汇编和C语言,并向windows图形处理发展。
历史经验证明,英文写的代码时间久了大部分都会遗忘的。而习语言则避免了这一点,中文浏览下就可以回忆起来,真正符合汉语特色。而且支持全角标点符号,编程时输入符号不用频繁切换。
中文C(习)语言中文编程系统(简称:习语言):是一款主要用于教育和学习的中文编程软件系统。基于现有C语言系统实现并有扩充。其特点如下:
1、完全支持全中文编程,代码全中文,文件名全中文。
2、综合了PASCAL和C的优点实现,支持 “开始”“结束”扩起语句块。支持更多注释方法,方便程序组织。
3、支持多字节字直观表示。如 '我', 'abcd'都可以作为字(符).
4、支持中文标点符号,中文标点符号和英文标点符号混合使用等。
5、支持文章式的程序组织,在中文文章中嵌入程序代码,直接编译。
6、支持中文文字运算符,支持全角,半角混合使用。
7、体积小巧,很少的接口文件,使用理解容易。
用途:使用中文编写 C语言程序及基于C语言的操作系统
简单例子编辑
下面是一个简单的视窗例子,让大家体会习语言的魅力:
#包含 “习语言系统.接口”
#包含 “习语言视窗.接口”
【 主程序 】
整数类型主函数( 整数类型 参数个数, 字符类型 *参数表[])
{
图形初始化显示器( 空指针,320, 240,空指针, 0, 空指针);
图形打开显示器();
图形输出文字(10, 30 ,“春眠不觉晓,处处闻啼鸟!”);
图形输出文字(10, 200 ,“按任意键退出”);
获取按键();
图形关闭显示器();
返回 0;
}
效果图:

各版本编辑
简介
习语言4715-3.6版
习语言4714版
习语言2014版
历史修订:
习语言3.6 修订
1、优化习库,改进对多窗口绘图的支持。
2、优化习语言编辑器,支持快捷键CTRL+F8,CTRL+F9对项目或无项目时当前文件进行编译和运行。
3、支持F8,F9快捷键前后翻看输出内容。
4、增加和习姐的协作,可以在习语言编辑器里编写习姐语句,直接发送给习姐运行。
5、习库中增加对简繁体数字的识别和处理及苏州码子等数字的识别和处理函数。
习语言3.5 修订
1、支持 如果...就...;或者...就...;否则... 这样的逻辑表达方式。
2、支持 重复...直到...; 这样的逻辑表达方式。
3、支持 重复...当...; 这样的逻辑表达方式。
4、支持 当...重复...; 这样的逻辑表达方式。
5、支持 检查...{若等于…}; 这样的分支语句表达方式。
6、改进习语言编辑器,支持动态增加自定义词汇和语句(选中文本,右键菜单中:追加->添加到词汇表中; 追加->添加到快捷词语表中)。
7、修复编译器对 无类型 甲; 无类型 *猫; 甲=*猫; 类似这样的程序语句的处理异常。
8、在习语言编辑器环境中支持文件编译选项设置。
9、支持项目编译设置和整个项目编译。
10、支持编译时直接编译文件相关的素材文件。
11、完善 简易习 支持。
习语言3.4 修订
1、调整习语言编辑器工具栏,修正菜单中发现的问题。
2、变量、字母、类型、运算符工具栏可以配置关闭(体验版不支持关闭)。
3、增加对语法:“如果...就...”的支持。
习语言3.3 修订
1、完善编译设置的支持,进“项目”菜单选“设置...”选项可以设置文件的编译选项。
2、习语言编辑器格式对话框修改扩充,增加常用词语输入。
3、根据习语言2016版反馈,完善侧边栏内容。
4、修正函数无需参数,实际传入1个参数不报错的问题。
5、完善图形编程相关函数。
习语言3.2 修订
1、简易习代码支持完善。
2、习语言编辑器完善
3、侧边栏词汇表整理完善,目前分类更清晰易懂。
习语言3.1 修订
1、修复数组指针编译出错问题:
整数 (*数)[5];
整数 符[5] = {1,2,3,4,5 }, 小明;
数 = &符;
小明 = (*数)[2];
2、完善 串口函数,更方便串口编程。
3、改进 别名 处理,修复结构类型中指针成员定义使用别名时的编译报错问题。
4、改进 数组 处理,修复数组用区间定义时初始化不正确的问题。 如:
整数类型 月份天数[1,12] = {31,28,31,30};
5、整理改进侧边栏词汇表中视窗函数的组织,归类更清晰。
6、重新编译生成整个编译器,解决360误报问题。
7、支持二进制常数表示,其表示方法为: 0b101101 、0B101101 、0二101101、 101101b、 101101B、101101二。 这六种表示方法都可以,效果相同。
习语言3.0 修订
1、增加串口操作函数,支持简易的串口通讯编程。
2、其他已知问题完善。
习语言2.9 修订
1、修改 输入字符串 函数的实现代码,修正WIN10平台使用时的异常问题。
2、编辑区选定词汇后,在右键菜单中增加快捷搜索功能。
习语言2.8 修订
1、完善词汇提示。
2、修正格式输出对 %词 的处理。
3、完善习语言编辑器,缺省打开侧边栏。
习语言2.71 修订
1、增加 图形模式文件打开 函数。
2、完善程序退出处理。
3、完善习语言编辑器,缺省打开侧边栏。
习语言2.7 修订
1、增加完善图形处理函数。
2、修正编译器处理复杂乘除运算式时的一个错误。
3、增加几个时间函数,归类整理侧边栏函数。
习语言2.61 修订
1、增加对话框控件操作函数。
2、优化视窗函数列表。
3、增加新对话框程序支持。
4、新增程序模板。
习语言2.6 修订
1、修正商业版发布不完整的问题.
2、完善习语言编辑器,增加输出窗口行数限制。
3、完善环境配置和示例程序。
4、商业版更好的支持VC头文件和库。
5、增加预处理指令。
习语言2.5 修订
1、整理完善图形函数,优化图形驱动.
2、增加控制台打开关闭、图形暂停、三角形绘图、漫水填充等函数。
3、整理优化函数分类和提示信息。
4、整理实现更多程序模板。
5、增加消息处理宏,实现消息处理框架。
习语言2.4 修订
1、改进习语言编辑器多文件搜索处理,输出信息前后浏览,编辑位置回退浏览和前进。
2、完善图形刷新显示函数,刷新的同时,刷新界面显示,处理所有待处理事件消息。
3、完善部分函数的注释信息,更易懂清晰。
4、增加 控制台设置文本颜色 函数。
5、增加对 windows.h 接口文件的支持,可以编译运行原始 WIN32代码,也可以中英混编。
6、优化习语言编译器,出错信息更方便定位。
习语言2.3 修订
1、更改函数名 文件结束 为 文件已结束, 文件出错 为 文件已出错。
2、完善部分函数的解释。
3、完善动态库导出函数的处理,实现全中文支持。
4、完善习语言编辑器,支持版本信息中显示启动路径,方便多版本并存时区分运行的哪个版本。
习语言2.2 修订
1、修正2.1版本发现的视窗程序用控制台编译链接后运行出错的问题。
习语言2.1 修订
1、完善 习语言编辑器,在帮助-版本信息窗口中,按关联右键之后,习语言编辑器自动和.习文件关联,可以双击打开。
2、完善 系统函数、接口文件,函数提示内容。
习语言2.02 修订
1、完善 指针表函数。
2、完善 内存操作函数,变分配为申请,因从程序角度看,是申请内存,从内存管理角度看,才是分配。
3、完善 习语言编辑器的前后定位功能(前一位置,后一位置 的功能)。
习语言2.01 修订
1、完善 习语言.exe ,增强对编译汇编代码时,各种不同命令行参数的容错处理能力。
2、修改richedit的处理,支持richedit。
习语言2.0 修订
1、完善绘图功能。
2、完善习语言编辑器,支持函数全称显示,支持中文符号,汉字多行列输入。
3、完善系统函数、类型、宏。
4、集成了习语言使用教程
5、集成VC6连接器
6、增加“俄罗斯方块和贪食蛇源代码”
7、增加花心萝卜的可视化IDE及其视频教程
习语言1.86.1 修订
1、完善国标字符串函数对字符的容错处理。
2、修改习语言编译器对宽字符的支持方法。
3、美化系统图标
习语言1.86 修订
1、完善视窗函数列表。
2、完善习语言编辑器,运行命令支持快捷键。
习语言1.85.9 修订
1、完善系统函数列表。
2、完善习语言编辑器。
习语言1.85.8 修订
1、完善系统函数。废弃1.85.6之前的所有1.85分支版本。
2、完善侧边栏词汇提示
3、更新"习语言.exe",支持“编译.设置”文件。
4、优化对资源的支持,增加对菜单的支持。
5、优化习语言编辑器,支持新文件保存路径记忆。
6、完善控件式样风格。
习语言1.85.6 修订
1、修复1.85版在系统库函数中引入的一个内存访问异常问题。废弃1.85.6之前的最近几个1.85分支版本。
2、整理完善习语言图形、视窗函数,对函数列表进行分类整理。 更改部分函数名。
3、完善图形处理接口函数,支持绘制无背景的图片,支持保存内容为图片。
4、完善习语言编辑器。
习语言1.85.5 修订
1、完善习语言编译器,支持 #编译指令 对齐(入栈 , 2)
2、完善习语言编辑器。
3、整理完善习语言图形视窗词库及接口。
习语言1.85 修订
1、整理完善国标字符串函数。
2、完善图形格式输入函数。
3、优化提示词库
4、优化习语言编辑器侧边栏词汇自动输入功能,提供是否带提示的可选项。
5、优化习语言编译器,增加对关键词:检查、加载 的支持。
6、优化整理时间相关函数。
7、修正完善链表函数、扩充图形输入串的功能。
习语言1.82 修订
1、完善习语言编辑器词汇提示功能。
2、完善提示词库。
3、优化系统库函数
4、支持一种更简单的图形编程。
习语言1.80 修订
1、去除侧边栏自动输入词汇中的注释。
2、完善快捷输入功能。
3、优化习标准库,缩小可执行程序大小
习语言1.78 修订
1、支持首拼快捷输入
2、增加少量函数
3、完善侧边栏词汇
习语言1.76 修订
1、支持PASCAL赋值运算符
2、支持从1开始的数组表示语法
3、完善系统函数
习语言1.75 修订
1、增加多输出窗口。
2、改善函数帮助显示。
3、变量名 支持GB18030字符(早期版本支持 GB2312)。
4、支持DLL隐式调用(商业版才支持)。
习语言1.72版 修订
1、扩充部分实用函数。
2、支持图片直接显示和声音播放等多媒体接口。
习语言1.71版 修订
1、增加动态库函数声明调用宏,简化动态库访问。
2、解决上一版本发现的小数类型在输入时的错误问题。
3、增加图形格式输出和图形输入功能,方便将所有控制台程序迁移为图形程序。
4、优化视窗函数,新增大量视窗函数,更方便绘制各种控件,方便视窗程序的编写。
5、在编辑器环境中增加资源的支持。
习语言1.70版 修订
1、完善编译环境,用习语言写的工具代替原来的批处理。
2、支持动态指针数组,链表,完善文件名处理。
3、优化编辑器,适应中文状态下输入英文符号。
4、完善词汇函数表,点击可实现多行代码输入。
5、支持函数别名,支持中文句号作为语句结束。
6、完善习语言程序设计文档。
习语言1.69版 修订
1、完善编译器,增加纯汇编代码生成功能, 应xl-os开发需求增加。
2、在编辑器中增加习语言词汇树,实现快速添加词汇到编辑区。
习语言1.68版 修订
1、完善编译器,优化代码生成
2、完善条目有点多,省略...。
习语言1.66版 修订
1、微调运算符优先级 更符合思维习惯。
2、修正浮点初始化为负数时处理错误。
3、根据最新版本的更改更正视窗示例。
习语言1.65版 修订
1、继续完善浮点处理问题。
2、严格函数调用,不再允许未声明直接调用函数。
习语言1.62版 修订
1、修正浮点处理问题。
2、增加main函数名支持
3、完善中文提示。
4、支持C代码直接编译
习语言1.6版 修订
1、完善 标准调用 和 C调用的处理
2、修正浮点运算错误
3、增加中文命令
4、增加C和习语言相互转换的命令。
习语言 1.5版 修订
1、更新习语言编辑器, 增加在开始运行时提示打开或新建。
2、整理系统函数接口定义,完善函数注释。
统一将文件读写函数的文件句柄放为第一个参数,
统一读字符为读取单字节英文字符,读字为读单字节英文字符或汉字。
3、支持文件打开和保存函数、支持对话框创建, 控件创建等图形编程。
4、修正中汇几个错误。
总结下阶段成果:
1、完成支持全中文的习语言, 生成全中文编写汇编代码(X86)。
2、完成支持全中文汇编(X86)的汇编器。生成兼容微软格式的目标代码。用微软的连接工具连接可生成WINDOWS上的控制台程序和视窗程序。
3、完成全中文标准习语言函数库。可以支持基础的控制台和图形编程。
4、完成支持全中文构建指导书(等效makefile )的构建工具(等效make )
5、完成支持中文语法高亮的编辑器,可以支持习语言源程序和构建指导书的语法高亮和编辑。及习语言源程序的集成编译。
6、完成习语言基础教程。
正在进行的工作:
1、开发习语言相关配套工具。
1.4版在易用性上有很大提高, 解决了一些发现的问题。
已经有1.5版,支持windows图形设计。
截止 2012年5月 最新版是 1.76
可以通过 添加函数库的方式 兼容c/c++
不过 在使用上需要 注意几点就是 先进行 编译 然后运行 并且 控制台程序 和 图形模式的 编译方式不同 需要 分别点 两个不同的 编译按钮 左侧的是控制台按钮 右侧的是 图形模式编译按钮 通行模式编译按钮 是 运行 然后是 带参数的运行再就是 运行捕获 (会在下方的输出面板上面显示 程序运行的时候输出的文字内容)
正在开发 直接点运行 自动进行 编译并且运行的 功能
获取途径编辑
习语言1.82版可以在各大下载网站下载,百度搜索“习语言 下载”即可获取下载链接,也可通过论坛、微群、做相关的任务获取。
系列作品编辑
习语言——C语言中文扩展库
习佳佳——中文C++开发伴侣
习丽妞——linux系统下编程的中文扩展库
习51——51单片机中文开发伴侣
中汇——中文X86汇编
中文构建工具(汉化版的make工具)

[ Last edited by zzz19760225 on 2017-6-12 at 01:37 ]
作者: zzz19760225     时间: 2016-6-26 18:39
linux                  gcc      
dos                   Turbo C

工具只是装备一件武器,使用武器和寻找武器实现方向的人,是一体的。


计算机术语
同义词
收藏
分享
tc
编辑词条
外文名        Turbo C       
属于        计算机术语


1基本内容
2功能介绍
3其他术语
1 基本内容 编辑
Turbo C 集成开发环境是由Borland 公司开发的一套C 语言开发工具,它集成了程序编辑、调试、链接等多种功能。在DOS 系统时代,Turbo C 是被最广泛使用的一种PC 机应用程序开发工具,很多应用软件均是由Turbo C 开发完成。随着计算机及其软件的发展,操作系统已经从DOS 发展到Windows。Windows 系统下的大部分应用软件已经不再使用Turbo C来开发,但是作为一种非常优秀 C 程序开发工具,其依然是一种学习 C 程序设计的理想工具。下面主要介绍广泛使用的2.0 版本。[1]

2 功能介绍 编辑
  Turbo C 集成开发环境主要提供如下功能:

  1. 文件管理功能

  Turbo C 提供了源程序文件的建立、保存、关闭和打开等基本功能。利用这些功能,可以完成C 程序文件从建立到保存,以及打开的一些系列操作。

  2. 编辑功能

  Turbo C 主要提供了文本的选定、插入、删除和查找等基本编辑功能。

  3. 编译/链接功能

  所有的C 语言源程序以文本(ASCII )形式存放,必须经过语法分析、检查,并翻译后才可以形成计算机可以识别的二进制指令,一般将编译后的程序称为目标代码。在程序设计过程经常用到函数库,因此一般是在将目标代码和函数库中目标代码链接之后才真正形成计算机可以识别的二进制指令程序。

  4. 运行/调试功能

  在程序设计过程中,难免会出现一些错误,因此必须经过运行验证后,才可以交付使用。在编译阶段主要是语法分析并检查错误,而运行阶段主要检查程序逻辑上的错误。为了方便检查程序上的逻辑错误,一般的编译器均提供了调试功能从而跟踪程序的运行过程和状态。Turbo C 主要提供了单步执行、跟踪、断点管理和表达式计算等功能。

  5. 项目管理功能

  在软件开发的过程,一个软件可能需要多人编辑成百上千的程序文件,形成几十万行以上的代码。管理如此大规模的软件开发,必须通过项目管理来实现。Turbo C 提供的项目管理功能,主要是代码的编译和链接控制。

  6. 系统设置与帮助

  为了保证系统正常的运行,设置编译链接等参数的,Turbo C 提供了相关的系统参数设置功能。另外,为了帮助初学者掌握Turbo C 的使用,系统提供了丰富的帮助信息。获得帮助信息的主要方法是在需要帮助的时候,按下功能键F1。

3 其他术语 编辑
  TC(Transmission Convergence)传输会聚子层。提供与ATM层的统一接口。

  TC,TurboCache的简写nVidia的TurboCache(简称TC)技术在构建新一代产品的性价比上,具有非常的意义,在兼顾成本的前提下,提供了最新的GPU架构和各项前瞻性应用。TurboCache是专利型硬件和软件技术,TurboCache抓住了新、旧总线换代的时机,将PCI-Express带宽优势进行了淋漓尽致的发挥。

  TC, Traffic Control的简写是linux进行流量控制的工具, 通过tc, 可以控制网络接口收发数据的速率。

  TC,Total Commander的缩写Total Commander,简称TC,原名Windows Commander,功能强大的全能文件管理器。

  TC, TopCoder 的缩写TopCoder这个网站可以说是一个程序设计比赛的网站,但是在题型,比赛形式跟ACM/ICPC极不相同。该网站把中国纳入其赛区,大家可以上去那里跟来自全世界的程序员(事实上大多数也是大学生)进行更直接的交流,可能也是ACM/ICPC练兵的好地方吧。

  Thin Client的缩写瘦客户机(Thin Client)是使用专业嵌入式处理器、小型本地闪存、精简版操作系统的基于PC工业标准设计的小型行业专用商用PC。 配置包含专业的低功耗、高运算功能的嵌入式处理器。不可移除地用于存储操作系统的本地闪存、以及本地系统内存、网络适配器、显卡和其它外设的标配输入/输出选件。瘦客户机没有可移除的部件,可以提供比普通PC更加安全可靠的使用环境,以及更低的功耗,更高的安全性。

-------------------------------------------------------------------------------------------------------------------------------------------------
当Turbo C开始执行时,首先它会等待你敲入任何一个键。当你敲入任何一个键后,Turbo C就会把光标移到主菜单上的File这一项上,此时你如果想要使用编辑器,可以把光标移动到Edit上,然后敲入回车键,或者直接敲入E或e就可以了。当你执行完以上的动作之后,屏幕就看起来如图所示的完全一样。在编辑窗口最上面有一行反白的编辑器状态栏,这一行的文字是用来告诉你编辑器的状态,以及当前你正在编辑的文件名称。其中前两项Line和Col是用来显示当前光标所在的行号和列号。Insert则用来告诉你,当前编辑器正在插入文字的状态。也就是说,当你输入文字时,Turbo C就会把你输入的文字放到原来就已经存在的文字中间。和Inser模式相反的模式是overwrite,在这种操作模式下,新敲入的文字会取代原来光标所在的位置的文字。你可以使用INS这个键,在这两种模式下变换,在大部分情况下,你都会使用原来就已经设置好的INSERT模式,因为这种模式最常用。INDENT这个信息是提示你当前编辑器是在自动编排模式下工作。等一会儿,你就可以看到自动编排的模式是如何进行的,当你不想使用自动编排模式的时候,只要输入CRTL+O+I就可以了。梢后,如果你又想使用自动编排模式时,只要再输入CTRL+O+I就可以了。Tab这项信息是用来告诉你,你可以使用TAB键执行跳位。你可以使用CTRL+O+T来开关这个功能。在编辑器状态栏上的最后一项信息是当前你正在编辑的程序的名称,当我们开始执行TURBO C时,可以在命令中就设置好自己将要编辑的程序文件名称,这点梢后就会介绍。因为到目前为止,你并没有设置要编辑程序的文件名称,所以TRUBO C就使用预先设置好的名字NONAME.C。

---------------------------------------------------------------------------------------------------------------------------------------------------
一旦你进入编辑窗口后,它就准备接收文字。所以你可以输入以下的文字:
Roses are red
violets are blue
and so will you.

当你输入最后一行文字后,不要忘了键入回车。如果你敲错了任何字符时,你可以使用退位键(backspace)去休整错误的字符。现在你的屏幕看起来就像图3.2一样,在图3.2中,请注意光标的位置和LINE和COL旁的数字。

你可以使用光标来移动光标。现在你使用光标键把光标移动到 and so will you这一行的最左边。接下来你就输入I like Turbo C并回车,当你键图时,请仔细观察Turbo C如何把原来输入的那一行文字向右移动,这就是编辑器在插入状态时所做的事情。如果你把编辑器变成Overwrite状态时,Turbo C就会把原先那一行文字覆盖掉。现在屏幕看起来就像图3.3那样。

[ Last edited by zzz19760225 on 2016-12-11 at 16:40 ]
作者: zzz19760225     时间: 2016-6-26 18:40
C语言是否可以分解位解释语言和编译两类合并随意选择模式。


nim       vala

[ Last edited by zzz19760225 on 2017-7-13 at 05:47 ]
作者: zzz19760225     时间: 2016-6-26 18:41
练习:
1通过linux终端的 gcc显示一段话:


集中在这一段熟悉其字,结构,背后的延伸,编辑器的运算,机器码的内容,变换不同的显示内容,小文大文等等。
#include <stdio.h>
int main(void)
{
  printf("")
  return 0;
}
假设编码正确,终端下输入gcc 文件名和后缀,确认会生成./a.out文件,直接输入这个./a.out显示文件内容。

2下次试试写错了,变形的程序写法,直接查看的./a.out机器码在不同的文本内容下会有那些差异。
#include <stdio.h>
int main(void)
{
printf("");
}
ugg:
函数大全好找比如《C~C++程序员实用大全——C~C++最佳编程指南》
函数源代码那就不好找了,只能仿真实现,或者反汇编查看。

[ Last edited by zzz19760225 on 2017-11-1 at 14:19 ]
作者: zzz19760225     时间: 2016-6-26 18:43
Python
编辑词条

Python(KK 英语发音:/ˈpaɪθən/)是一种面向对象、直译式计算机程序设计语言。也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。 Python语法简捷而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。Python的名字来源于一个喜剧。也许最初设计Python这种语言的人并没有想到Python会在工业和科研上获得如此广泛的使用。[1]
快速导航
知乎精选
中文名        蟒蛇
别名        蟒蛇语言
设计者        Guido van Rossum
荣誉        2010年度编程语言       
外文名        python
发行时间        1991年
最新版本        3.4.0,2.7.8
概况
知乎精选最新


1概要介绍
2产生起源
3风格介绍
4特色缺点
5功能介绍
6设计定位
7CGI介绍
服务器
程序
环境变量
8执行情况
9基本语法
10应用介绍
11工具功能
12版本介绍
13开发环境
14其他相关
1 概要介绍 编辑
Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程。Python已经成为最受欢迎的程序设计语言之一。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。自从2004年以后,python的使用率是呈线性增长。[2]

由于Python语言的简洁、易读以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python教授程序设计课程。例如麻省理工学院的计算机科学及编程导论课程就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。

说起科学计算,首先会被提到的可能是MATLAB。然而除了MATLAB的一些专业性很强的工具箱还无法替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。和MATLAB相比,用Python做科学计算有如下优点:

● 首先,MATLAB是一款商用软件,并且价格不菲。而Python完全免费,众多开源的科学计算库都提供了Python的调用接口。用户可以在任何计算机上免费安装Python及其绝大多数扩展库。


Python LOGO

● 其次,与MATLAB相比,Python是一门更易学、更严谨的程序设计语言。它能让用户编写出更易读、易维护的代码。

● 最后,MATLAB主要专注于工程和科学计算。然而即使在计算领域,也经常会遇到文件管理、界面设计、网络通信等各种需求。而Python有着丰富的扩展库,可以轻易完成各种高级任务,开发者可以用Python实现完整应用程序所需的各种功能。

英文简介

  Python is an object-oriented explanation of computer programming languages, is a powerful and well-size-fits-all language, has been more than a decade of development, maturity and stability. Python scripting language with the most rich and powerful class library, enough to support the vast majority of day-to-day applications.

  This language has a very simple and clear characteristics of grammar, for a variety of high-level mission to complete, almost all of the operating system to run.

  At present, this language is related to the rapid technological development, the rapid expansion of the number of users, and related resources.

  这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行。

  目前,基于这种语言的相关技术正在飞速的发展,用户数量急剧扩大,相关的资源非常多。

2 产生起源 编辑
Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者。

ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是非开放造成的。Guido 决心在Python 中避免这一错误。同时,他还想实现在ABC 中闪现过但未曾实现的东西。

就这样,Python在Guido手中诞生了。实际上,第一个实现是在Mac机上。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。

3 风格介绍 编辑
风格

Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。

设计者开发时总的指导思想是,对于一个特定的问题,只要有一种最好的方法来解决就好了。这在由Tim Peters写的python格言(称为The Zen of Python)里面表述为:There should be one-- and preferably only one --obvious way to do it. 这正好和Perl语言(另一种功能类似的高级动态语言)的中心思想TMTOWTDI(There's More Than One Way To Do It)完全相反。

Python的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。其中很重要的一项就是Python的缩进规则。

一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{}来明确的定出模块的边界的,与字符的位置毫无关系)。这一点曾经引起过争议。因为自从C这类的语言诞生后,语言的语法含义与字符的排列方式分离开来,曾经被认为是一种程序语言的进步。不过不可否认的是,通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。

4 特色缺点 编辑
特色:

  简单————Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。

  易学————就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。

速度快:Python 的底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,运行速度非常快。

  免费、开源————Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。

  高层语言————当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。

  可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在下述任何平台上面运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、



Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC和Symbian!

  解释性————这一点需要一些解释。一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码 运行 程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。

  面向对象————Python即支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。

  可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。

  可嵌入性————你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。

  丰富的库————Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

规范的代码:Python采用强制缩进的方式使得代码具有较好可读性。而Python语言写的程序不需要编译成二进制代码。

  概括————Python确实是一种十分精彩又强大的语言。它合理地结合了高性能与使得编写程序简单有趣的特色。

缺点:

单行语句和命令行输出问题:很多时候不能将程序连写成一行,如import sys;for i in sys.path:print i。而perl和awk就无此限制,可以较为方便的在shell下完成简单程序,不需要如Python一样,必须将程序写入一个.py文件。

独特的语法

这也许不应该被称为局限,但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。最常见的情况是tab和空格的混用会导致错误,而这是用肉眼无法分别的。

无类型

作为一种动态语言,随时随地创建和使用变量是Python给我们带来的巨大的便利。但是它也会使得程序不严谨,某些错误只有在运行中才可能出现。所以,使用Python编程的时候,要对类型做到心里有数。这也使得Python的IDE工具无法提供便利的自动完成等功能。

关于“无类型”的说法,是完全错误的。一看就是不了解python的人写的。python是一种“强类型”“动态绑定”。

运行速度慢:这里是指与C和c++相比。

5 功能介绍 编辑

Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。

Python社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能无所不包,覆盖科学计算、Web开发、数据库接口、图形系统多个领域,并且大多成熟而稳定。第三方模块可以使用Python或者C语言编写。SWIG,SIP常用于将C语言编写的程序库转化为Python模块。Boost C++ Libraries包含了一组库,Boost.Python,使得以 Python 或 C++ 编写的程序能互相调用。借助于拥有基于标准库的大量工具、能够使用低级语言如C和可以作为其他库接口的C++,Python已成为一种强大的应用于其他语言与工具之间的胶水语言。

Python标准库的主要功能有:

文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能

文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能

操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能

网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能

网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架

W3C格式支持,包含HTML,SGML,XML的处理。

其它功能,包括国际化支持、数学 运 算、HASH、Tkinter等

6 设计定位 编辑
Python的设计哲学是“优雅”、“明确”、“简单”。因此,Perl语言中“总是有多种方法来做同一件事”的理念在Python开发者中通常是难以忍受的。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常被认为比Perl具备更好的可读性,并且能够支撑大规模的软件开发。这些准则被称为Python格言。在Python解释器内运行import this可以获得完整的列表。

Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。所以很多人认为Python很慢。不过,根据二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT技术,或者用使用C/C++语言改写这部分程序。可用的JIT技术是PyPy。

Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。

虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shell script、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。

Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。《Python技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过,2004 年,Python 已在 Google 内部使用,Google 召募许多 Python 高手,但在这之前就已决定使用Python,他们的目的是 Python where we can, C++ where we must,在操控硬件的场合使用 C++,在快速开发时候使用 Python。”

7 CGI介绍 编辑
CGI 目前由NCSA维护,

CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。

CGI程序可以是Python脚本、Perl脚本、Shell脚本、C或者C++程序等。

服务器

在你进行CGI编程前,确保您的Web服务器支持CGI及已经配置了CGI的处理程序。

所有的HTTP服务器执行CGI程序都保存在一个预先配置的目录。这个目录被称为CGI目录,并按照惯例,它被命名为/var/www/cgi-bin目录。

CGI文件的扩展名为.cgi,python也可以使用.py扩展名。

默认情况下,Linux服务器配置运行的cgi-bin目录中为/var/www。

如果你想指定的其他运行CGI脚本的目录,可以修改httpd.conf配置文件,

1

2

3

4

5

6

7

8

9

<Directory"/var/www/cgi-bin">

AllowOverrideNone

OptionsExecCGI

Orderallow,deny

Allowfromall

</Directory>

<Directory"/var/www/cgi-bin">

OptionsAll

</Directory>

程序

使用Python创建第一个CGI程序,文件名为hello.py,文件位于/var/www/cgi-bin目录中,内容如下,

1

2

3

4

5

6

7

8

9

10

#!/usr/bin/envpython

print("Content-type:text/html\r\n\r\n")

print("<html>")

print("<head>")

print("")

print("</head>")

print("<body>")

print("<h2>HelloWord!ThisismyfirstCGIprogram")

print("</body>")

print("</html>")

以上程序在浏览器访问显示结果如下:

1

HelloWord!ThisismyfirstCGIprogram

这个的hello.py脚本是一个简单的Python脚本,脚本第一的输出内容"Content-type:text/html\r\n\r\n"发送到浏览器并告知浏览器显示的内容类型为"text/html"。

环境变量

所有的CGI程序都接收以下的环境变量,

变量名

描述

CONTENT_TYPE       
这个环境变量的值指示所传递来的信息的MIME类型。目前,环境变量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示数据来自于HTML表单。

CONTENT_LENGTH       
如果服务器与CGI程序信息的传递方式是POST,这个环境变量即使从标准输入STDIN中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。

HTTP_COOKIE        客户机,内的,COOKIE,内容
HTTP_USER_AGENT        提供包含了版本数或其他专有数据的客户浏览器信息
PATH_INFO       
这个环境变量的值表示紧接在CGI程序名之后的其他路径信息。它常常作为CGI程序的参数出现。

QUERY_STRING       
如果服务器与CGI程序信息的传递方式是GET,这个环境变量的值即使所传递的信息。这个信息经跟在CGI程序名的后面,两者中间用一个问号'?'分隔。

REMOTE_ADDR       
这个环境变量的值是发送请求的客户机的IP地址,例如上面的192.168.1.67。这个值总是存在的。而且它是Web客户机需要提供给Web服务器的唯一标识,可以在CGI程序中用它来区分不同的Web客户机。

REMOTE_HOST       
这个环境变量的值包含发送CGI请求的客户机的主机名。如果不支持你想查询,则无需定义此环境变量。

REQUEST_METHOD       
提供脚本被调用的方法。对于使用 HTTP/1.0 协议的脚本,仅 GET 和 POST 有意义。

SCRIPT_FILENAME        CGI脚本的完整路径
SCRIPT_NAME        CGI脚本的的名称
SERVER_NAME        这是你的,WEB,服务器的主机名,别名或IP地址
SERVER_SOFTWARE        这个环境变量的值包含了调用CGI程序的HTTP服务器的名称和版本号,例如
以下是一个简单的CGI脚本输出CGI的环境变量:

1

2

3

4

5

#!/usr/bin/pythonimportosprint"Content-type:text/html\r\n\r\n";

print"<fontsize=+1>Environment</font><\br>";

forparaminos.environ.keys():

print"<b>%20s</b>:%s<\br>"

%(param,os.environ[param])

8 执行情况 编辑
Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。这种机制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine与Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一种更高级的Virtual Machine。这里的高级并不是通常意义上的高级,不是说Python的Virtual Machine比Java或.NET的功能更强大,而是说和Java 或.NET相比,Python的Virtual Machine距离真实机器的距离更远。或者可以这么说,Python的Virtual Machine是一种抽象层次更高的Virtual Machine。

基于C的Python编译出的字节码文件,通常是.pyc格式。

除此之外,Python还可以以交互模式运行,比如主流操作系统Unix/Linux、Mac、window都可以直接在命令模式下直接运行Python交互环境。直接下达操作指令即可实现交互操作。

9 基本语法 编辑
Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和惊喜。

缩进

Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字。增加缩进表示语句块的开始,而减少缩进则表示语句块的退出。缩进成为了语法的一部分。例如if语句:



注:上述例子为python 3.0版本的代码,@代表一个空格

根据PEP的规定,必须使用4个空格来表示每级缩进(不清楚4个空格的规定如何,在实际编写中可以自定义空格数,但是要满足每级缩进间空格数相等)。使用Tab字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。支持Tab字符和其它数目的空格仅仅是为兼容很旧的的Python程序和某些有问题的编辑程序。

流程控制语句

if语句,当条件成立时运行语句块。经常与else, elif(相当于else if) 配合使用。

for语句,遍列列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。

while语句,当条件为真时,循环运行语句块。

try语句。与except,finally配合使用处理在程序运行中出现的异常情况。

class语句。用于定义类型。

def语句。用于定义函数和类型的方法。

pass语句。表示此行为空,不运行任何操作。

assert语句。用于程序调适阶段时测试运行条件是否满足。

with语句。Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加密,然后在语句块运行退出后解密。

yield语句。在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。

raise语句。制造一个错误。

import语句。导入一个模块或包。

from import语句。从包导入模块或从模块导入某个对象。

import as语句。将导入的对象赋值给一个变量。

in语句。判断一个对象是否在一个字符串/列表/元组里。

表达式

Python的表达式写法与C/C++类似。只是在某些写法有所差别。

主要的算术运算符与C/C++类似。+, -, *, /, //, **, ~, %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取补、取模。>>, <<表示右移和左移。&, |, ^表示二进制的AND, OR, XOR运算。>, <, ==, !=, <=, >=用于比较两个表达式的值,分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,~, |, ^, &, <<, >>必须应用于整数。

Python使用and, or, not表示逻辑运算。

is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。

Python支持“列表推导式”(list comprehension),比如计算0-9的平方和:

>>> sum(x * x for x in range(10))

285

Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:

>>> add=lambda x, y : x + y

>>> add(3,2)

5

Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x。

Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:

>>> x, y=1,2#同时给x,y赋值,最终结果:x=1, y=2

特别地,可以使用以下这种形式来交换两个变量的值:

>>> x, y=y, x #最终结果:y=1, x=2

Python使用'(单引号)和"(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如\n表示换行符。表达式前加r指示Python不解释字符串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。

Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的类型有str, bytes, list, tuple等。它的语法是...[left:right]或者...[left:right:stride]。假定nums变量的值是[1, 3, 5, 7, 8, 13, 20],那么下面几个语句为真:

nums[2:5] == [5, 7, 8] 从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。

nums[1:] == [3, 5, 7, 8, 13, 20] 切割到最后一个元素。

nums[:-3] == [1, 3, 5, 7] 从最开始的元素一直切割到倒数第3个元素。

nums[:] == [1, 3, 5, 7, 8, 13, 20] 返回所有元素。改变新的列表不会影响到nums。

nums[1:5:2] == [3, 7] 从下标为1的元素切割到下标为5的元素但不包含下标为5的元素,且步长为2

函数

Python的函数支持递归、默认参数值、可变参数,但不支持函数重载。为了增强代码的可读性,可以在函数后书写“文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()打印出函数的使用帮助。比如:

>>>def randint(a, b):... "Return random integer in range [a, b], including both end points."...>>>help(randint)Help on function randint in module __main__: randint(a, b) Return random integer inrange[a, b], including both end points.

对象的方法



对象的方法是指绑定到对象的函数。调用对象方法的语法是instance.method(arguments)。它等价于调用Class.method(instance, arguments)。当定义对象方法时,必须显式地定义第一个参数,一般该参数名都使用self,用于访问对象的内部数据。这里的self相当于C++, Java里面的this变量,但是我们还可以使用任何其它合法的参数名,比如this 和 mine 等,self与C++,Java里面的this不完全一样,它可以被看作是一个习惯性的用法,我们传入任何其它的合法名称都行,比如:

Python认识一些以“__”开始并以“__”结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能。

类型

Python采用动态类型系统。在编译的时候,Python不会检查对象是否拥有被调用的方法或者属性,而是直至运行时,才做出检查。所以操作对象时可能会抛出异常。不过,虽然Python采用动态类型系统,它同时也是强类型的。Python禁止没有明确定义的操作,比如数字加字符串。

与其它面向对象语言一样,Python允许程序员定义类型。构造一个对象只需要像函数一样调用类型即可,比如,对于前面定义的Fish类型,使用Fish()。类型本身也是特殊类型type的对象(type类型本身也是type对象),这种特殊的设计允许对类型进行反射编程。

Python内置丰富的数据类型。与Java、C++相比,这些数据类型有效地减少代码的长度。下面这个列表简要地描述了Python内置数据类型(适用于Python 3.x):

类型

描述

例子

备注
str        一个由字符组成的不可更改的有串行       
'Wikipedia'

"Wikipedia"

"""Spanning

multiple

lines"""

在Python,3,x里,字符串由Unicode字符组成
bytes        一个由字节组成的不可更改的有串行        b'Some,ASCII'b",Some,ASCII"       
list        可以包含多种类型的可改变的有串行        [4,0,'string',True]       
tuple        可以包含多种类型的不可改变的有串行        (4,0,'string',True)       
set,frozenset        与数学中集合的概念类似,无序的,每个元素唯一       
{4.0, 'string', True}

frozenset([4.0, 'string', True])

dict        一个可改变的由键值对组成的无串行        {'key1':,1,0,3:,False}       
int        精度不限的整数        42       
float        浮点数,精度与系统相关        3.1415927       
complex        复数        3+2,7j       
bool        逻辑值,只有两个值:真,假        TrueFalse       
除了各种数据类型,Python语言还用类型来表示函数、模块、类型本身、对象的方法、编译后的Python代码、运行时信息等等。因此,Python具备很强的动态性。

数 学 运算

Python使用与C、Java类似的运算符,支持整数与浮点数的数学 运算。同时还支持复数运算与无穷位数(实际受限于计算机的能力)的整数运算。除了求绝对值函数abs()外,大多数数学函数处于math和cmath模块内。前者用于实数运算,而后者用于复数运算。使用时需要先导入它们,比如:

>>>importmath>>>print(math.sin(math.pi/2))1.0

fractions模块用于支持分数运算;decimal模块用于支持高精度的浮点数运算。

Python定义求余运行a % b的值处于开区间[0, b)内,如果b是负数,开区间变为(b, 0]。这是一个很常见的定义方式。不过其实它依赖于整除的定义。为了让方程式:b * (a // b) + a % b = a恒真,整除运行需要向负无穷小方向取值。比如7 // 3的结果是2,而(-7) // 3的结果却是-3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。

Python允许像数学的常用写法那样连着写两个比较运行符。比如a < b < c与a < b and b < c等价。C++的结果与Python不一样,首先它会先计算a < b,根据两者的大小获得0或者1两个值之一,然后再与c进行比较。

10 应用介绍 编辑
系统编程:提供API(Application Programming Interface应用程序编程接口),能方便进行系统维护和管理,Linux下标志性语言之一,是很多系统管理员理想的编程工具。

图形处理:有PIL、Tkinter等图形库支持,能方便进行图形处理。

数学处理:NumPy扩展提供大量与许多标准数学库的接口。

文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。

数据库编程:程序员可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server,Oracle,Sybase,DB2,Mysql、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。

网络编程:提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet 及BitTorrent. Google都在广泛地使用它。

Web编程:应用的开发语言,支持最新的XML技术。

多媒体应用:Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。

pymo引擎:PYMO全称为python memories off,是一款运行于Symbian S60V3,Symbian3,S60V5, Symbian3, Android系统上的AVG游戏引擎。因其基于python2.0平台开发,并且适用于创建秋之回忆(memories off)风格的AVG游戏,故命名为PYMO。

黑客编程:python有一个hack的库,内置了你熟悉的或不熟悉的函数,但是缺少成就感。

用Python写简单爬虫

首先,要通过urllib2这个Module获得对应的HTML源码。

import urllib2

url='http://www。baidu。com/s?wd=cloga'

content=urllib2.urlopen(url).read()

通过上面这三句就可以将URL的源码存在content变量中,其类型为字符型。

接下来是要从这堆HTML源码中提取我们需要的内容。用Chrome查看一下对应的内容的代码(也可以用Firefox的Firebug)。

可以看到url的信息存储在span标签中,要获取其中的信息可以用正则式。

Pylons-Web应用框架

Zope- 应用服务器

Plone- 内容管理系统

Django- 鼓励快速开发的Web应用框架

Uliweb- 国人开发的轻量级Web框架

TurboGears- 另一个Web应用快速开发框架

Twisted--Python的网络应用程序框架

Python Wikipedia Robot Framework- MediaWiki的机器人程序

MoinMoinWiki- Python写成的Wiki程序

flask- Python 微Web框架

Webpy- Python 微Web框架

Bottle- Python 微Web框架

EVE- 网络游戏EVE大量使用Python进行开发

Reddit - 社交分享网站

Dropbox - 文件分享服务

Pylons - Web应用框架

TurboGears - 另一个Web应用快速开发框架

Fabric - 用于管理成百上千台Linux主机的程序库

Trac - 使用Python编写的BUG管理系统

Mailman - 使用Python编写的邮件列表软件

Mezzanine - 基于Django编写的内容管理系统系统

Blender - 以C与Python开发的开源3D绘图软件

11 工具功能 编辑
Tkinter

Python默认的图形界面接口。Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组。

PyGTK

用于python GUI程序开发的GTK+库。GTK就是用来实现GIMP和Gnome的库。

PyQt

用于python的Qt开发库。QT就是实现了KDE环境的那个库,由一系列的模块组成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300个类和超过5750个的函数和方法。PyQt还支持一个叫qtext的模块,它包含一个QScintilla库。该库是Scintillar编辑器类的Qt接口。

wxPython

GUI编程框架,熟悉MFC的人会非常喜欢,简直是同一架构(对于初学者或者对设计要求不高的用户来说,使用Boa Constructor可以方便迅速的进行wxPython的开发)

PIL

python提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换、打印和显示。还能进行一些图形效果的处理,如图形的放大、缩小和旋转等。是Python用户进行图象处理的强有力工具。

Psyco

一个Python代码加速度器,可使Python代码的执行速度提高到与编译语言一样的水平。

xmpppy

Jabber服务器采用开发的XMPP协议,Google Talk也是采用XMPP协议的IM系统。在Python中有一个xmpppy模块支持该协议。也就是说,我们可以通过该模块与Jabber服务器通信,是不是很Cool。

PyMedia

用于多媒体操作的python模块。它提供了丰富而简单的接口用于多媒体处理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平台下使用。

Pmw

Python megawidgets,Python超级GUI组件集,一个在python中利用Tkinter模块构建的高级GUI组件,每个Pmw都合并了一个或多个Tkinter组件,以实现更有用和更复杂的功能。

PyXML

用Python解析和处理XML文档的工具包,包中的4DOM是完全相容于W3C DOM规范的。它包含以下内容:

xmlproc: 一个符合规范的XML解析器。Expat: 一个快速的,非验证的XML解析器。还有其他和他同级别的还有 PyHtml PySGML。

PyGame

用于多媒体开发和游戏软件开发的模块。

PyOpenGL

模块封装了“OpenGL应用程序编程接口”,通过该模块python程序员可在程序中集成2D和3D的图形。

NumPy、NumArray、SAGE

NumArray是Python的一个扩展库,主要用于处理任意维数的固定类型数组,简单说就是一个矩阵库。它的底层代码使用C来编写,所以速度的优势很明显。SAGE是基于NumPy和其他几个工具所整合成的数学软件包,目标是取代Magma, Maple, Mathematica和Matlab 这类工具。

MySQLdb

用于连接MySQL数据库。还有用于zope的ZMySQLDA模块,通过它就可在zope中连接mysql数据库。

Sqlite3

用于连接sqlite数据库。

  

Python-ldap

提供一组面向对象的API,可方便地在python中访问ldap目录服务,它基于OpenLDAP2.x。

smtplib

发送电子邮件。

ftplib

定义了FTP类和一些方法,用以进行客户端的ftp编程。如果想了解ftp协议的详细内容,请参考RFC959。

12 版本介绍 编辑
[3]Python主要版本为2.x和3.x,目前2.x使用居多。这里有一篇关于“初学者学习python2还是python3?”的文章讲的很不错,可以参考一下:http://www.pythontab.com/html/2012/pythonjichu_1220/11.html

Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下兼容。许多针对早期Python版本设计的程序都无法在Python 3.0上正常运行。为了照顾现有程序,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。基于早期Python版本而能正常运行于Python 2.6并无警告的程序可以通过一个2 to 3的转换工具无缝迁移到Python 3.0。

  新的Python程序建议使用Python 3.0版本的语法。除非运行环境无法安装Python 3.0或者程序本身使用了不支持Python 3.0的第三方库。目前不支持Python 3.0的第三方库有Django, Twisted, py2exe, PIL等。大多数第三方库都正在努力地兼容Python 3.0版本。即使无法立即使用Python 3.0,也建议编写兼容Python 3.0版本的程序,然后使用Python 2.6, Python 2.7来运行。Python 2.7被确定为最后一个Python 2.x版本,它除了支持Python 2.x语法外,还支持部分Python 3.1语法。

Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下兼容。许多针对早期Python版本设计的程序都无法在Python 3.0上正常运行。为了照顾现有程序,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。基于早期Python版本而能正常运行于Python 2.6并无警告的程序可以通过一个2 to 3的转换工具无缝迁移到Python 3.0。

新的Python程序建议使用Python 3.0版本的语法。除非运行环境无法安装Python 3.0或者程序本身使用了不支持Python 3.0的第三方库。不支持Python 3.0的第三方库有Django, Twisted, py2exe, PIL等。大多数第三方库都正在努力地兼容Python 3.0版本。即使无法立即使用Python 3.0,也建议编写兼容Python 3.0版本的程序,然后使用Python 2.6, Python 2.7来运行。Python 2.7被确定为最后一个Python 2.x版本,它除了支持Python 2.x语法外,还支持部分Python 3.1语法。

Python 3.0的变化主要在以下几个方面:

最引人注意的改变是print语句没有了,取而代之的是print()函数。可以使用2to3工具自动地转换print语句。Python 2.6与Python 2.7部分地支持这种形式的print语法。在Python 2.6与Python 2.7里面,以下三种形式是等价的:

print"fish"print("fish")#注意print后面有个空格print("fish")#print()不能带有任何其它参数

然而,Python 2.6实际已经支持新的print()语法。方法是:

from__future__import print_functionprint("fish","panda", sep=', ')

新的str类型表示一个Unicode字符串,相当于Python 2.x版本的unicode类型。而字节串行则用类似b"abc"的语法表示,用bytes类表示,相当于Python 2.x的str类型,两种类型不能再隐式地自动转换,因此在Python 3.x里面"fish"+b"panda"是错误。正确的写法是"fish"+b"panda".decode("utf-8")。Python 2.6可以自动地将字节串行识别为Unicode字符串,方法是:

from__future__import unicode_literalsprint(repr("fish"))

除法运算符/在Python 3.x内总是返回浮点数。而在Python 2.6内会判断被除数与除数是否是整数。如果是整数会返回整数值,相当于整除;浮点数则返回浮点数值。为了让Python 2.6统一返回浮点数值,可以:

from__future__import divisionprint(3/2)

捕获异常的语法由except exc, var改为except exc as var。使用语法except (exc1, exc2) as var可以同时捕获多种类型的异常。Python 2.6已经支持这两种语法。

字典推导式(Dictionary comprehensions){expr1: expr2 for k, v in d},这个语法等价于:

result={}for k, v in d.items(): result[expr1]=expr2return result

集合(set)的新写法:{1,2,3,4}。注意{}仍然表示空的字典(dict)。

八进制数必须写成0o777,原来的形式0777不能用了;二进制必须写成0b111。新增了一个bin()函数用于将一个整数转换成二进制字符串。Python 2.6已经支持这两种语法。

dict.keys(), dict.values(), dict.items(), map(), filter(), range(), zip()不再返回列表,而是迭代器。

如果两个对象之间没有定义明确的有意义的顺序。使用<, >, <=, >=比较它们会抛出异常。比如1 < ""在Python 2.6里面会返回True,而在Python 3.0里面会抛出异常。cmp(), instance.__cmp__()函数已经被删除。

可以注释函数的参数与返回值。此特性可方便IDE对源代码进行更深入的分析。例如:

def sendMail(from_:"nobody@example .com", \ to:"somebody@example .com", \ title:"hello", \ body:"Just say hello to you.") ->True: pass

根据PEP8,多个模块被改名:

旧的名字

新的名字

_winreg        winreg
ConfigParser        configparser
copy_reg        copyreg
Queue        queue
SocketServer        socketserver
repr        reprlib
StringIO模块被合并到新的io模块内。new, md5, gopherlib等模块被删除。Python 2.6已经支持新的io模块。

httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。

取消了exec语句,只剩下exec()函数。Python 2.6已经支持exec()函数。

基本上,可以编写出使用Python 3.0语法并运行于Python 2.6, Python 2.7的程序。

13 开发环境 编辑
●IDLE:Python内置IDE (随python安装包提供)

●PyCharm:详见百度百科PyCharm,由著名的JetBrains公司开发,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工 具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。

●Komodo和Komodo Edit:后者是前者的免费精简版

●PythonWin:ActivePython或pywin32均提供该IDE,仅适用于Windows

●SPE(Stani's Python Editor):功能较多的自由软件,基于wxPython

●Ulipad:功能较全的自由软件,基于wxPython;作者是中国Python高手limodou

●WingIDE:可能是功能最全的IDE,但不是自由软件(教育用户和开源用户可以申请免费key)

●Eric:基于PyQt的自由软件,功能强大。全名是:The Eric Python IDE

●DrPython

●PyScripter:使用Delphi开发的轻量级的开源Python IDE, 支持Python2.6和3.0。

●PyPE:一个开源的跨平台的PythonIDE。

●bpython: 类Unix操作系统下使用curses库开发的轻量级的Python解释器。语法提示功能。

●eclipse + pydev插件:方便调试程序

●emacs:自带python支持,自动补全、refactor等功能需要插件支持

●Vim: 最新7.3版编译时可以加入python支持,提供python代码自动提示支持

●Visual Studio 2003 + VisualPython:仅适用Windows,已停止维护,功能较差

●SlickEdit

●Visual Studio 2010 + Python Tools for Visual Studio

●TextMate

●Netbeans IDE

●Sublime

另外,诸如EditPlus、UltraEdit、PSPad等通用的程序员文本编辑器软件也能对Python代码编辑提供一定的支持,比如代码自动着色、注释快捷键等,但是否够得上集成开发环境的水平,尚有待评估。

14 其他相关 编辑
解释器

Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,实现了Python语法的解释程序就成为了Python的解释器。

CPython(ClassicPython,也就是原始的Python实现,需要区别于其他实现的时候才以CPython称呼;或解作C语言实现的Python)。这是最常用的Python版本。

Jython(原名JPython;Java语言实现的Python,现已正式发布)。Jython可以直接调用Java的各种函数库。

PyPy(使用Python语言写的Python)

IronPython(面向.NET和ECMA CLI的Python实现)。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。

ZhPy(周蟒)(支持使用繁/简中文语句编写程序的Python语言)

学习网站

1.PythonTab中文网

2.Python爱好者论坛

3.Pythoner在线互动交流平台

4.一人一Python

参考资料:
1.
python简单介绍
2.
Python简介
3.
初学者学习python2还是python3
扩展阅读:
1.
Python介绍
2.
Python入门介绍
3.
详细说明Python工具介绍
词条标签:
编程语言  电脑  计算机  Python  开源

[ Last edited by zzz19760225 on 2016-9-22 at 17:35 ]
作者: zzz19760225     时间: 2016-6-26 18:44
MS-DOS 5.0内核剖析

出版: 西安电子科技大学出版社
分类: TP316
书号: 7-5606-0213-4
形态: 354 章节
全文目录

第九章 DOS核心文件的编程环境
1、1基本概念
1、1、1操作系统
目录
1、1、2操作系统分类
1、2操作系统的设计思想
1、2、1研究操作系统的几种观点
1、2、2操作系统结构设计方法
1、2、3层次结构法
1、2、4DOS设计思想
1、2、5DOS与其它操作系统的兼容性
1、3DOS发展概况
1、3、1DOS的历史
1、3、2DOS的未来
1、4DOS操作系统结构
1、4、1BIOS模块
1、4、2Kernel模块
1、4、3Shell模块
1、5DOS功能概述
2、1配置命令
2、1、1BREAK
2、1、2BUFFERS
2、1、3COMMENT
2、1、4COUNTRY
2、1、5DEVICE
2、1、6DEVICEHIGH
2、1、7DOS
2、1、8DRIVPARM
2、1、10FILES
2、1、9FCBS
2、1、11INSTALL
2、1、12LASTDRIVE
2、1、13MULTITRACK
2、1、14REM
2、1、15SHELL
2、1、16STACKS
2、1、17SWITCHES
2、2可安装的设备驱动程序
2、2、1ANSI.SYS
2、2、2DISPLAY.SYS
2、2、3DRIVER.SYS
2、2、4EGA.SYS
2、2、5EMM386.EXE
2、2、6HIMEM.SYS
2、2、7PRINTER.SYS
2、2、8RAMDRIVE.SYS
第一章 引论
2、2、10SMARTDRV.SYS
2、2、9SETVER.EXE
2、3代码页
2、3、1支持代码页的设备
2、3、2代码页定义
第二章 配置系统
2、3、3为什么要用代码页
2、3、4安装代码页
2、3、5代码页的转换
2、3、6显示当前的代码页
2、3、7刷新代码页
2、3、8代码页表
3、1DOS引导过程
3、1、1ROMBIOS启动
3、1、2DOS引导记录
第三章 DOS引导过程
3、1、3SysInt—Ⅰ
3、1、4DOSKernel模块的初始化程序
3、1、5SysInt—Ⅱ
3、1、6COMMAND初始化程序
3、2数据结构
3、2、1BPB参数块
3、2、2硬盘分区信息表
3、3引导程序的源程序注释清单
4、1设备分类
4、1、1字符设备
4、1、2块设备
4、2DOS设备
4、2、1控制器、适配器和接口
4、2、2设备的程序控制
4、2、3DOS支持的软盘类型
4、3数据结构
4、3、1磁盘参数表
4、3、2设备驱动程序标题
4、3、3设备驱动程序请求标题
4、3、4BIOS驱动器参数块
4、3、5DOS驱动器参数块
4、3、6盘缓冲区
4、4设备驱动程序的结构及调用格式
4、4、1设备驱动程序的结构
4、4、2设备驱动程序的调用格式
4、5设备驱动程序的编程与调试
4、5、1设备驱动程序的编程方法
4、5、2设备驱动程序的调试
5、1微机的内存结构
5、1、1常规内存
5、1、2扩充内存
5、1、3扩展内存
第四章 设备管理
5、1、4高内存块
5、1、5高内存区
5、1、6MS-DOS5.0提供的内存管理程序
5、1、7Lotus/Intel/Microsoft扩展内存规范
5、1、8Lotus/Intel/Microsoft/AST扩充内存规范
5、2DOS内存映象
5、2、1DOS内存约定
第五章 内存管理
5、2、2MS-DOS5.0内存映象
5、3数据结构
5、3、1内存控制块
5、3、2子段控制块
5、4内存管理程序的实现
5、4、1内存分配策略
5、4、2内存分配块的释放和修改
5、5准备更多的可用内存
5、5、1使用HIMEM.SYS扩充内存管理程序
5、5、2释放常规内存
5、5、3释放扩充内存
5、5、4释放扩展内存
5、6在高内存块中运行程序
5、6、1准备在高内存块运行程序
5、6、2为使用高内存块而设置CONFIG.SYS文件
5、6、3安装EMM386.EXE管理高内存块
5、6、4获取高内存块的信息
5、6、5将程序移入高内存块
5、6、6运行启动后分配内存的设备驱动程序
5、6、7在高内存块运行内存驻留程序
5、7结束并驻留TSR编程
5、7、1TSR程序的分类
5、7、2DOS操作系统的TSR程序
5、7、3DOS支持TSR程序的功能调用
5、7、4TSR程序的编程方法
6、1DOS文件系统的特点
6、1、1文件名
6、1、2文件类型
6、1、3通配符
6、1、4文件管理方法
6、1、5文件与设备的统一管理
6、1、6DOS文件系统的不足
6、2FAT文件系统的特点
6、2、1磁盘信息格式
6、2、2文件分配表
6、3目录结构
6、3、1树型目录结构
6、3、2树型目录使用的数据结构
6、3、3树型目录结构的管理
6、4文件管理的数据结构
6、4、1文件控制块
6、4、2文件句柄
6、4、3系统文件表
6、4、4文件共享的实现
6、4、5快速打开的实现
6、4、6文件系统的数据结构之间的关系
6、5读/写操作的实现
7、1可执行文件结构
7、1、1COM文件结构
第七章 进程管理
7、1、2EXE文件结构
7、2环境块
7、2、1环境块信息
7、2、2在批文件中使用环境变量
7、2、3扩展环境块空间
7、3程序段前缀
7、4EXEC功能调用的实现
7、5几个与PSP相关的功能调用
7、6进程终止
7、6、1进程终止时的公共处理
7、6、2正常终止
7、6、3驻留结束
7、6、4被零除错误(INT00H)处理
7、6、5Ctrl+C终止处理
7、6、6严重设备错误处理
8、001DOS功能调用一览表
8、002键盘功能调用一览表
8、003面向FCB的功能调用一览表
第八章 DOS功能调用
8、004面向文件句柄的功能调用一览表
8、005设备IOCTL的功能调用一览表
8、006国家语言支持(NLS)功能调用一览表
8、007内存管理功能调用一览表
8、008进程管理功能调用一览表
8、009网络功能调用一览表
8、010文件共享功能调用一览表
8、011目录管理功能调用一览表
8、012驱动器管理功能调用一览表
8、013系统功能调用一览表
8、014已被替代的功能调用一览表
8、01500H终止程序
第六章 文件系统
8、01601H带回显的控制台输入
8、01702H显示字符
8、01803H辅助输入
8、01904H辅助输出
8、02005H打印字符
8、02106H直接控制台I/O
8、02207H无回显的直接控制台输入
8、02308H无回显控制台输入
8、02409H显示字符串
8、0250AH缓冲键盘输入
8、0260BH检查键盘状态
8、0270CH清键盘缓冲区并读键盘
8、0280DH复位磁盘
8、0290EH设置缺省驱动器号
8、0300FH用FCB打开文件
8、03110H用FCB关闭文件
8、03211H用FCB查找第一个文件
8、03312H用FCB查找下一个文件
8、03413H用FCB删除文件
8、03514H用FCB顺序读
8、03615H用FCB顺序写
8、03716H用FCB创建文件
8、03817H用FCB更换文件名
8、03919H取缺省驱动器号
8、0401AH设置盘传送区地址
8、0411BH取缺省驱动器数据
8、0421CH取指定驱动器数据
8、0431FH取缺省驱动器的DDPB
8、04421H用FCB随机读
8、04522H用FCB随机写
8、04623H用FCB取文件大小
8、04724H设置随机记录号
8、04825H设置中断向量
8、04926H创建新程序段前缀
8、05027H用FCB随机块读
8、05128H用FCB随机块写
8、05229H分析文件名
8、0532AH取系统日期
8、0542BH设置系统日期
8、0552CH取系统时间
8、0562DH设置系统时间
8、0572EH设置/复位检验(VERIFY)标志
8、0582FH取盘传送区地址
8、05930H取DOS版本号
8、06031H结束并驻留
8、06132H取指定驱动器的DDPB
8、0623300H取Ctrl+C检查状态
8、0633301H设置Ctrl+C检查状态
8、0643302H取/置Ctrl+C检查状态
8、0653305H取引导驱动器号
8、0663306H取DOS版本号和DOS的安装位置
8、06734H取InDOS标志字节单元的地址
8、06835H取中断向量
8、06936H取磁盘自由空间
8、0703700H取开关前导字符
8、07138H取/置国家信息
8、07239H创建子目录
8、0733AH删除子目录
8、0743BH改变当前目录
8、0753CH创建文件
8、0763DH打开文件
8、0773EH关闭文件
8、0783FH读文件或设备
8、07940H写文件或设备
8、08041H删除文件
8、08142H移动文件读写指针
8、0824300H取文件属性
8、0834301H设置文件属性
8、0844400H取设备信息
8、0854401H设置设备信息
8、0864402H从字符设备读取控制数据
8、0874403H向字符设备发送控制数据
8、0884404H从块设备读取控制数据
8、0894405H向块设备发送控制数据
8、0904406H取输入状态
8、0914407H取输出状态
8、0924408H测试块设备是否支持介质装卸
8、0934409H测试逻辑驱动器是本地还是远程设备
8、094440AH测试文件句柄是对应于本地还是远程设备
8、095440BH设置共享重试计数
8、096440CH字符设备的类属IOCTL请求
8、097440DH块设备的类属IOCTL请求
8、098440EH取逻辑驱动器映象
8、099440FH设置逻辑驱动器映象
8、1004410H字符设备的类属IOCTL查询
8、1014411H块设备的类属IOCTL查询
8、10245H复制文件句柄
8、10346H强迫复制文件句柄
8、10447H取当前目录
8、10548H分配内存
8、10649H释放分配的内存块
8、1074AH修改分配的内存块
8、1084B00H装入并执行程序
8、1094B01H装入程序
8、1104B03H装入覆盖
8、1114B05H设置执行状态
8、1124CH结束进程
8、1134DH取子进程的返回码
8、1144EH查找第一个文件
8、1154FH查找下一个文件
8、11650H设置活动进程的PSP段地址
8、11751H取当前活动进程的PSP段地址
8、11852H取DOS多重表指针值
8、11953H根据BPB参数块内容设置DDPB
8、12054H取检验状态
8、12155H创建程序段前缀
8、12256H更换文件名
8、1235700H取文件的日期和时间
8、1245701H设置文件的日期和时间
8、1255800H取内存分配策略
8、1265801H设置内存分配策略
8、1275802H取UMB联接状态
8、1285803H设置UMB联接状态
8、12959H取扩充错误信息
8、1305AH创建临时文件
8、1315BH创建新文件
8、1325CH锁定/开锁文件
8、1335D00H服务器功能调用
8、1345D01H提交所有文件
8、1355D02H以名字关闭共享文件
8、1365D03H关闭指定计算机的所有共享文件
8、1375D04H关闭指定计算机的特定进程的所有共享文件
8、1385D05H取共享文件的信息
8、1395D06H取DOS数据交换区的地址
8、1405D07H取打印流状态
8、1415D08H设置打印流状态
8、1425D09H截断打印流
8、1435D0AH设置扩充错误信息
8、1445E00H取机器名
8、1455E01H设置机器名
8、1465E02H设置打印机配置
8、1475E03H取打印机配置
8、1485E04H设置打印机模式
8、1495E05H取打印机模式
8、1505F00H取重定向模式
8、1515F01H设置重定向模式
8、1525F02H取重定向列表项
8、1535F03H重定向设备
8、1545F04H取消重定向
8、15560H规范化文件名
8、15662H取当前活动进程的PSP段地址
8、1576300H取DBCS引导字节表地址
8、1586501H取全国家信息表
8、1596502H/6504H取文本/文件名大写表地址
8、1606505H取文件名字符表地址
8、1616506H取对照表地址
8、1626507H取DBCS向量表地址
8、1636520H字符变大写
8、1646521H字符串变大写
8、1656522HASCIIZ字符串变大写
8、1666523H字符Yes或No检查
8、16766H取/置全局代码页
8、16867H设置文件句柄数
8、16968H/6AH提交文件
8、17069H取/置介质ID
8、1716CH扩充的打开/创建文件
8、172DOS扩充错误码表
8、173DOS扩充错误类型表
8、174DOS建议采取的措施表
8、175DOS扩充错误位置表
9、1硬件环境
9、1、1几个新增加的CPU指令
9、1、2实时时钟/CMOSRAM
9、2中断系统
9、2、1中断分类
9、2、2DOS保留中断
9、2、3DOS专用中断
9、2、4DOS可调用中断

10、1IO.SYS的编程基础
10、2IO.SYS的组成
目录
10、3IO.SYS的各个模块的功能
10、3、1Loader模块
第十章 IO.SYS源程序
10、3、2IO1模块
10、3、3IO2模块
10、3、4IO3模块
10、4IO.SYS源程序注释清单
10、4、1IO.SYS源程序的编译和连接方式
10、4、2BIO.STR的源程序清单
10、4、3Loader模块的源程序注释清单
10、4、4IO1模块的源程序注释清单
10、4、5IO2模块的源程序注释清单
10、4、6IO3模块的源程序注释清单
10、5IO.SYS源程序索引
10、5、1IO.SYS源程序的过程名索引
10、5、2IO.SYS源程序的变量名索引

11、1MSDOS.SYS的编程基础
11、2MSDOS.SYS的组成
目录
11、2、1MSDOS1模块
第十一章 MSDOS.SYS源程序
11、2、2MSDOS2模块
11、3MSDOS.SYS源程序注释清单
11、3、1MSDOS.SYS源程序的编译和连接方式
11、3、2DOS.STR的源程序清单
11、3、3MSDOS1模块的源程序注释清单
11、3、4MSDOS2模块的源程序注释清单
11、3、5INIT模块的源程序注释清单
11、4MSDOS.SYS源程序索引
11、4、1MSDOS.SYS源程序的过程名索引
11、4、2MSDOS.SYS源程序的变量名索引

[ Last edited by zzz19760225 on 2017-6-12 at 04:38 ]
作者: zzz19760225     时间: 2016-6-26 18:44    标题: MUD LPC

LPC语言 编辑
本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
LPC语言是由Lars Pensjǒ在1989年根据C语言开发的编程语言,主要是用来编写MUD游戏,使用LPC语言开发的MUD游戏被称为LPMUD。
中文名 LPC语言 外文名 Lars Pensjǒ C 开发时间 1989年 开发者 Lars Pensjǒ
目录
1 简介
2 LPC的函数分类
简介编辑
LPC类似C语言,语法大致相同,文件扩展名也为“.c”。不过LPC 是一面向对象语言,有对象(Object),但又没有类(class)的概念。和C语言相比LPC没有main()函数,但有一个create()函数,在对象载入时自动调用以完成初始化。
LPC是文字MUD游戏的编程语言,这类MUD统称LPMUD,多为解迷型,国类所有武侠MUD和神话MUD都是LPMUD。
Lpc的程序看起来和一般的C区别不大,语法基本一样,但是Lpc和一般的语言有着根本的不同,Lpc程序是编写一个一个的"Object"。这有什么区别呢?一般的程序是在执行过程中,通常有一个明显的开始和和结束,程序从一个地方开始,然后顺序执行下去,到了结束的地方就中断了。Lpc的Object不是这样的,所谓的不同的Mud,实际上是一些不同的Lpc的Object在一个Driver的上的各种不同的表现。也就说,Lpc的Object是运行在一个Driver上的,这些Object组成了LpMud的丰富多彩的世界。
例子:如果你想在MUD中加一个地区,就在该地区目录中新建一个文件。
inherit ROOM;
void create()
{
set("short", "客店二楼");
set("long", @LONG
你正走在客店二楼的走廊上,可以听到从客房里不时地呼呼的打酣声,一阵
高过一阵。不时有睡意朦胧的旅客进进出出,到楼下的掌柜处付了钱再上来睡觉。
LONG );
set("exits", ([
"down" : "/d/city/kedian",
"enter" : "/d/city/kedian3",
]));
setup();
replace_program(ROOM);
}
然后更新这个文件并在在其它地区加上这个地点的入口就可以到达了,MUD的世界就是很多这种地点的连接。
LPC的函数分类编辑
LPC语言的函数可分为以下4类:
⒈apply
在MUDLIB中定义的只能被游戏驱动(MUDOS)呼叫的函数,所有applies也都是lfuns。
⒉efun (external function)
外部函数(相对于MUDLIB定义的函数来说),也就是定义在游戏驱动中的函数。因为是直接定义在游戏驱动中,所以运行速度更快。
⒊lfun (local function)
本地函数,MUDLIB的object中自己定义的函数,为什么applies也属于lfun?因为这些函数内容也是你自己写的。
⒋sefun (simulated external function)
模拟外部函数,本质上是本地函数,但多数是把efun做了重写,这类函数属于MUDLIB的核心。

[ Last edited by zzz19760225 on 2017-6-16 at 12:47 ]
作者: zzz19760225     时间: 2016-6-26 18:50
1警告    非可移动函数指针任务在函数:main                  initgraph(640*480);
错误     太少的参数在调用'initgraph'在函数:main

[ Last edited by zzz19760225 on 2017-8-17 at 09:35 ]
作者: zzz19760225     时间: 2016-6-26 18:52
屏幕中心画点 的程序(最前端显示)
http://bbs.csdn.net/topics/310207226
http://group.gimoo.net/review/157337
画一个长宽都是1个像素的矩形就是点
http://group.gimoo.net/review/151102
同意,width和height都为1时,不管画什么,都跟一个点差不多
http://group.gimoo.net/review/40045

[ Last edited by zzz19760225 on 2017-8-17 at 09:42 ]
作者: zzz19760225     时间: 2016-6-26 18:56
【话题】这是在tc环境下显示汉字的程序,那怎么样将它改成函数用在自己的程序中来显示汉字
http://group.gimoo.net/review/8558

EasyX
http://www.easyx.cn/help/

[ Last edited by zzz19760225 on 2017-8-17 at 10:21 ]
作者: zzz19760225     时间: 2016-6-26 18:57
1
作者: zzz19760225     时间: 2016-6-26 19:00
1
作者: zzz19760225     时间: 2016-6-26 19:02
1
作者: zzz19760225     时间: 2016-6-26 19:03
1
作者: zzz19760225     时间: 2016-6-26 19:07
1
作者: zzz19760225     时间: 2016-6-26 19:07
1
作者: zzz19760225     时间: 2016-6-26 19:09
1
作者: zzz19760225     时间: 2016-6-26 19:10
1
作者: zzz19760225     时间: 2016-6-26 19:10
http://www.huzheng.org/showartic ... &&newsid=24

星际译王(StarDict)的2.4.6版新增加了Windows下屏幕取词的功能。在开发这个功能时参考了Mueller Electronic Dicionary(一个用Delphi编的词典软件)的源代码,以及网上的文档。开发语言是C,用Dev-cpp编译。
这个功能现在还不太完善,目前有以下问题:
1. 在Win2k系统下,对桌面上的英文取词时为乱码。Windows XP则没有问题。
2. 在标题栏,开始菜单及IE, FireFox, Opear等软件上取词时,获取的Y坐标值不正确。见源码包里的src/win32/TextOutHook.c的IsInsidePointW()里的注释。
3. cmd.exe(命令提示符)无法取词。见源码包里的src/win32/GetWord.c的RemoteExecute()里的注释。
4. Adobe Reader无法取词。可能要像金山词霸那样编个Adobe Reader的插件。
希望高手能帮忙解决。
现在把完整源代码贴到这里:
TextOutSpy.c
=============================
#include "TextOutSpy.h"
#include "ThTypes.h"


const int MOUSEOVER_INTERVAL = 300;
const int WM_MY_SHOW_TRANSLATION = WM_USER + 300;

HINSTANCE g_hInstance = NULL;
HANDLE hSynhroMutex = 0;
HINSTANCE hGetWordLib = 0;
typedef void (*GetWordProc_t)(TCurrentMode *);
GetWordProc_t GetWordProc = NULL;

static void SendWordToServer()
{
        if (hGetWordLib == 0) {
                hGetWordLib = LoadLibrary(GlobalData->LibName);
                if (hGetWordLib) {
                        GetWordProc = (GetWordProc_t)GetProcAddress(hGetWordLib, "GetWord");
                }
                else {
                        hGetWordLib = (HINSTANCE)-1;
                }
        }
        if (GetWordProc) {
                GlobalData->CurMod.WND = GlobalData->LastWND;
                GlobalData->CurMod.Pt = GlobalData->LastPt;
                GetWordProc(&(GlobalData->CurMod));
                if (GlobalData->CurMod.WordLen > 0) {
                        DWORD SendMsgAnswer;
                        SendMessageTimeout(GlobalData->ServerWND, WM_MY_SHOW_TRANSLATION, 0, 0, SMTO_ABORTIFHUNG, MOUSEOVER_INTERVAL, &SendMsgAnswer);
                }
        }
}

void CALLBACK TimerFunc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
        if (WaitForSingleObject(hSynhroMutex, 0) == WAIT_OBJECT_0) {
                if (GlobalData->TimerID) {
                        if (KillTimer(0, GlobalData->TimerID))
                                GlobalData->TimerID=0;
                }
                ReleaseMutex(hSynhroMutex);
        }
        if ((GlobalData->LastWND!=0)&&(GlobalData->LastWND == WindowFromPoint(GlobalData->LastPt))) {
                if (WaitForSingleObject(hSynhroMutex, 0) == WAIT_OBJECT_0) {
                        SendWordToServer();
                        ReleaseMutex(hSynhroMutex);
                }
        }
}

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
        if ((nCode == HC_ACTION) && ((wParam == WM_MOUSEMOVE) || (wParam == WM_NCMOUSEMOVE))) {
                if (WaitForSingleObject(hSynhroMutex, 0) == WAIT_OBJECT_0) {
                        if (GlobalData->TimerID) {
                                if (KillTimer(0, GlobalData->TimerID))
                                        GlobalData->TimerID=0;
                        }
                        HWND WND = WindowFromPoint(((PMOUSEHOOKSTRUCT)lParam)->pt);
                        TCHAR wClassName[64];
                        if (GetClassName(WND, wClassName, sizeof(wClassName) / sizeof(TCHAR))) {
                                        const char* DisableClasses[] = {
                                                "gdkWindowChild",
                                                "gdkWindowTemp",
                                        };
                                        int i;
                                        for (i=0; i<2; i++) {
                                                if (strcmp(wClassName, DisableClasses)==0)
                                                        break;
                                        }
                                        if (i<2) {
                                                ReleaseMutex(hSynhroMutex);
                                                return CallNextHookEx(GlobalData->g_hHookMouse, nCode, wParam, lParam);
                                        }
                        }
                        GlobalData->TimerID = SetTimer(0, 0, MOUSEOVER_INTERVAL, TimerFunc);
                        GlobalData->LastWND = WND;
                        GlobalData->LastPt = ((PMOUSEHOOKSTRUCT)lParam)->pt;
                        ReleaseMutex(hSynhroMutex);
                }
        }
        return CallNextHookEx(GlobalData->g_hHookMouse, nCode, wParam, lParam);
}

DLLIMPORT void ActivateTextOutSpying (int Activate)
{
        // After call SetWindowsHookEx(), when you move mouse to a application's window,
        // this dll will load into this application automatically. And it is unloaded
        // after call UnhookWindowsHookEx().
        if (Activate) {
                if (GlobalData->g_hHookMouse != NULL) return;
                GlobalData->g_hHookMouse = SetWindowsHookEx(WH_MOUSE, MouseHookProc, g_hInstance, 0);
        }
        else {
                if (GlobalData->g_hHookMouse == NULL) return;
                if (WaitForSingleObject(hSynhroMutex, 0) == WAIT_OBJECT_0) {
                        if (GlobalData->TimerID) {
                                if (KillTimer(0, GlobalData->TimerID))
                                        GlobalData->TimerID=0;
                        }
                        ReleaseMutex(hSynhroMutex);
                }
                UnhookWindowsHookEx(GlobalData->g_hHookMouse);
                GlobalData->g_hHookMouse = NULL;
        }
}


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
                        g_hInstance = hInst;
                        hSynhroMutex = CreateMutex(NULL, FALSE, "StarDictTextOutSpyMutex");
                        ThTypes_Init();
        break;

      case DLL_PROCESS_DETACH:
                        WaitForSingleObject(hSynhroMutex, INFINITE);
                        if (GlobalData->TimerID) {
                                if (KillTimer(0, GlobalData->TimerID))
                                        GlobalData->TimerID=0;
                        }
                        ReleaseMutex(hSynhroMutex);
                        CloseHandle(hSynhroMutex);
                        {
                        MSG msg ;
                        while (PeekMessage (&msg, 0, WM_TIMER, WM_TIMER, PM_REMOVE)) {}
                        }
                        if ((hGetWordLib != 0)&&(hGetWordLib != (HINSTANCE)(-1))) {
                                FreeLibrary(hGetWordLib);
                        }
                        Thtypes_End();
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}
=============================

TextOutSpy.h
=============================
#ifndef _TextOutSpy_H_
#define _TextOutSpy_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


DLLIMPORT void ActivateTextOutSpying (int Activate);


#endif /* _TextOutSpy_H_ */
=============================

ThTypes.c
=============================
#include "ThTypes.h"

HANDLE MMFHandle = 0;
TGlobalDLLData *GlobalData = NULL;

void ThTypes_Init()
{
        if (!MMFHandle)
                MMFHandle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(TGlobalDLLData), "StarDictTextOutHookSharedMem");
        if (!GlobalData)
                GlobalData = MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
}

void Thtypes_End()
{
        if (GlobalData) {
                UnmapViewOfFile(GlobalData);
                GlobalData = NULL;
        }
        if (MMFHandle) {
                CloseHandle(MMFHandle);
                MMFHandle = 0;
        }
}
=============================

ThTypes.h
=============================
#ifndef _ThTypes_H_
#define _ThTypes_H_

#include <windows.h>

#ifdef __cplusplus
extern "C"
{
#endif                                /* __cplusplus */

typedef struct TCurrentMode {
        HWND WND;
        POINT Pt;
        int WordLen;
        char MatchedWord[256];
        int BeginPos;
} TCurrentMode;

typedef struct TGlobalDLLData {
        HWND ServerWND;
        HHOOK g_hHookMouse;
        DWORD TimerID;
        HWND LastWND;
        POINT LastPt;
        TCurrentMode CurMod;
        char LibName[256];
} TGlobalDLLData;

extern TGlobalDLLData *GlobalData;


void ThTypes_Init();
void Thtypes_End();

#ifdef __cplusplus
}
#endif                                /* __cplusplus */

#endif
=============================

TextOutHook.c
=============================
#include "TextOutHook.h"
#include "GetWord.h"
#include "HookImportFunction.h"


typedef BOOL WINAPI (*TextOutANextHook_t)(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString);
TextOutANextHook_t TextOutANextHook = NULL;
typedef BOOL WINAPI (*TextOutWNextHook_t)(HDC hdc, int nXStart, int nYStart, LPCWSTR lpszString,int cbString);
TextOutWNextHook_t TextOutWNextHook = NULL;
typedef BOOL WINAPI (*ExtTextOutANextHook_t)(HDC hdc, int nXStart, int nYStart, UINT fuOptions, CONST RECT *lprc, LPCSTR lpszString, UINT cbString, CONST INT *lpDx);
ExtTextOutANextHook_t ExtTextOutANextHook = NULL;
typedef BOOL WINAPI (*ExtTextOutWNextHook_t)(HDC hdc, int nXStart, int nYStart, UINT fuOptions, CONST RECT *lprc, LPCWSTR lpszString, UINT cbString, CONST INT *lpDx);
ExtTextOutWNextHook_t ExtTextOutWNextHook = NULL;

typedef struct TEverythingParams {
        HWND WND;
        POINT Pt;
        int Active;
        int WordLen;
        int Unicode;
        int BeginPos;
        char MatchedWordA[256];
        wchar_t MatchedWordW[256];
} TEverythingParams;

TEverythingParams *CurParams = NULL;

static void ConvertToMatchedWordA(TEverythingParams *TP)
{
        if (TP->Unicode) {
                if (TP->WordLen>0) {
                        int BeginPos = TP->BeginPos;
                        TP->BeginPos = WideCharToMultiByte(CP_ACP, 0, TP->MatchedWordW, BeginPos, TP->MatchedWordA, sizeof(TP->MatchedWordA)-1, NULL, NULL);
                        TP->WordLen = WideCharToMultiByte(CP_ACP, 0, TP->MatchedWordW + BeginPos, TP->WordLen - BeginPos, TP->MatchedWordA + TP->BeginPos, sizeof(TP->MatchedWordA)-1 - TP->BeginPos, NULL, NULL);
                        TP->WordLen += TP->BeginPos;
                        TP->MatchedWordA[TP->WordLen] = '\0';
                } else {
                        TP->MatchedWordA[0] = '\0';
                }
                TP->Unicode = FALSE;
        } else {
                TP->MatchedWordA[TP->WordLen] = '\0';
        }
}

static int MyCopyMemory(char *a, const char *b, int len)
{
        int count = 0;
        int i;
        for (i=0; ix) && (p->x<=rec.right) && (rec.top<=p->y) && (p->y<=rec.bottom)) {
                        ZeroMemory(&info, sizeof(info));
                        info.cbSize = sizeof(info);
                        info.fMask = MIIM_TYPE | MIIM_SUBMENU;
                        info.cch = 256;
                        info.dwTypeData = malloc(256);
                        GetMenuItemInfo(menu, i, TRUE, &info);
                        if (info.cch>0) {
                                if (info.cch > 255)
                                        CurParams->WordLen = 255;
                                else
                                        CurParams->WordLen = info.cch;
                                CurParams->Unicode = FALSE;
                                CurParams->WordLen = MyCopyMemory(CurParams->MatchedWordA, info.dwTypeData, CurParams->WordLen);
                                CurParams->BeginPos = 0;
                        }
                        free(info.dwTypeData);
                }
        }
}

static void GetWordTextOutHook (TEverythingParams *TP)
{
        CurParams = TP;
        ScreenToClient(TP->WND, &(TP->Pt));
        if (TP->Pt.y<0) {
                char buffer[256];
                GetWindowText(TP->WND, buffer, sizeof(buffer)-1);
                CurParams->Active = TRUE;
                SetWindowText(TP->WND, buffer);
                CurParams->Active = FALSE;
                HMENU menu = GetMenu(TP->WND);
                if (menu) {
                        ClientToScreen(TP->WND, &(TP->Pt));
                        IterateThroughItems(TP->WND, menu, &(TP->Pt));
                }
        }
        else {
                RECT UpdateRect;
                GetClientRect(TP->WND, &UpdateRect);
                UpdateRect.top = TP->Pt.y;
                UpdateRect.bottom = TP->Pt.y + 1;
                CurParams->Active = TRUE;
                InvalidateRect(TP->WND, &UpdateRect, FALSE);
                UpdateWindow(TP->WND);
                CurParams->Active = FALSE;
        }
        CurParams = NULL;
}

char* ExtractFromEverything(HWND WND, POINT Pt, int *BeginPos)
{
        TEverythingParams CParams;
        ZeroMemory(&CParams, sizeof(CParams));
        CParams.WND = WND;
        CParams.Pt = Pt;
        GetWordTextOutHook(&CParams);
        ConvertToMatchedWordA(&CParams);
        *BeginPos = CParams.BeginPos;
        return strdup(CParams.MatchedWordA);
}

static void IsInsidePointA(const HDC DC, int X, int Y, LPCSTR Str, int Count)
{
        SIZE Size;
        if ((Count > 0) && GetTextExtentPoint32A(DC, Str, Count, &Size)) {
                DWORD Flags = GetTextAlign(DC);
                POINT Pt;
                if (Flags & TA_UPDATECP) {
                        GetCurrentPositionEx(DC, &Pt);
                } else {
                        Pt.x = X;
                        Pt.y = Y;
                }
                if (Flags & TA_CENTER) {
                        Pt.x-=(Size.cx/2);
                } else if (Flags & TA_RIGHT) {
                        Pt.x-=Size.cx;
                }
                if (Flags & TA_BASELINE) {
                        TEXTMETRIC tm;
                        GetTextMetricsA(DC, &tm);
                        Pt.y-=tm.tmAscent;
                } else if (Flags & TA_BOTTOM) {
                        Pt.y-=Size.cy;
                }
                LPtoDP(DC, &Pt, 1);
                RECT Rect;
                Rect.left = Pt.x;
                Rect.right = Pt.x + Size.cx;
                Rect.top = Pt.y;
                Rect.bottom = Pt.y + Size.cy;
                if (((Rect.left <= Rect.right) && (CurParams->Pt.x >= Rect.left) && (CurParams->Pt.x <= Rect.right)) ||
                        ((Rect.left > Rect.right) && (CurParams->Pt.x <= Rect.left) && (CurParams->Pt.x >= Rect.right))) {
                //if (PtInRect(&Rect, CurParams->Pt)) {
                        CurParams->Active = !PtInRect(&Rect, CurParams->Pt);
                        //CurParams->Active = FALSE;
                        int BegPos = round(abs((CurParams->Pt.x - Rect.left) / (Rect.right - Rect.left)) * (Count - 1));
                        while ((BegPos < Count - 1) && GetTextExtentPoint32A(DC, Str, BegPos + 1, &Size) && (Size.cx < CurParams->Pt.x - Rect.left))
                                BegPos++;
                        while ((BegPos >= 0) && GetTextExtentPoint32A(DC, Str, BegPos + 1, &Size) && (Size.cx > CurParams->Pt.x - Rect.left))
                                BegPos--;
                        if (BegPos < Count - 1)
                                BegPos++;
                        CurParams->BeginPos = BegPos;
                        if (Count > 255)
                                CurParams->WordLen = 255;
                        else
                                CurParams->WordLen = Count;
                        CurParams->Unicode = FALSE;
                        CopyMemory(CurParams->MatchedWordA, Str, CurParams->WordLen);
                }
        }
}

static void IsInsidePointW(const HDC DC, int X, int Y, LPCWSTR Str, int Count)
{
        SIZE Size;
        if ((Count > 0) && GetTextExtentPoint32W(DC, Str, Count, &Size)) {
                DWORD Flags = GetTextAlign(DC);
                POINT Pt;
                if (Flags & TA_UPDATECP) {
                        GetCurrentPositionEx(DC, &Pt);
                } else {
                        Pt.x = X;
                        Pt.y = Y;
                }
                if (Flags & TA_CENTER) {
                        Pt.x-=(Size.cx/2);
                } else if (Flags & TA_RIGHT) {
                        Pt.x-=Size.cx;
                }
                if (Flags & TA_BASELINE) {
                        TEXTMETRICW tm;
                        GetTextMetricsW(DC, &tm);
                        Pt.y-=tm.tmAscent;
                } else if (Flags & TA_BOTTOM) {
                        Pt.y-=Size.cy;
                }
                LPtoDP(DC, &Pt, 1);
                RECT Rect;
                Rect.left = Pt.x;
                Rect.right = Pt.x + Size.cx;
                Rect.top = Pt.y;
                Rect.bottom = Pt.y + Size.cy;
                // Bug: We don't check Pt.y here, as don't call PtInRect() directly, because
                // in Title bar, Start Menu, IE, FireFox, Opera etc., the Rect.top and Rect.bottom will be wrong.
                // I try to use GetDCOrgEx(DC, &Pt), but they are not normal HDC that Pt.x and Pt.y will equal to 0 in these cases.
                // And use GetWindowRect() then get Rect.left and Rect.top is only useful on Title bar.
                if (((Rect.left <= Rect.right) && (CurParams->Pt.x >= Rect.left) && (CurParams->Pt.x <= Rect.right)) ||
                        ((Rect.left > Rect.right) && (CurParams->Pt.x <= Rect.left) && (CurParams->Pt.x >= Rect.right))) {
                //if (PtInRect(&Rect, CurParams->Pt)) {
                        CurParams->Active = !PtInRect(&Rect, CurParams->Pt);
                        //CurParams->Active = FALSE;
                        int BegPos = round(abs((CurParams->Pt.x - Rect.left) / (Rect.right - Rect.left)) * (Count - 1));
                        while ((BegPos < Count - 1) && GetTextExtentPoint32W(DC, Str, BegPos + 1, &Size) && (Size.cx < CurParams->Pt.x - Rect.left))
                                BegPos++;
                        while ((BegPos >= 0) && GetTextExtentPoint32W(DC, Str, BegPos + 1, &Size) && (Size.cx > CurParams->Pt.x - Rect.left))
                                BegPos--;
                        if (BegPos < Count - 1)
                                BegPos++;
                        CurParams->BeginPos = BegPos;
                        if (Count > 255)
                                CurParams->WordLen = 255;
                        else
                                CurParams->WordLen = Count;
                        CurParams->Unicode = TRUE;
                        CopyMemory(CurParams->MatchedWordW, Str, CurParams->WordLen * sizeof(wchar_t));
                }
        }
}

BOOL WINAPI TextOutACallbackProc(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString, int cbString)
{
        if (CurParams && CurParams->Active)
                IsInsidePointA(hdc, nXStart, nYStart, lpszString, cbString);
        return TextOutANextHook(hdc, nXStart, nYStart, lpszString, cbString);
}

BOOL WINAPI TextOutWCallbackProc(HDC hdc, int nXStart, int nYStart, LPCWSTR lpszString, int cbString)
{
        if (CurParams && CurParams->Active)
                IsInsidePointW(hdc, nXStart, nYStart, lpszString, cbString);
        return TextOutWNextHook(hdc, nXStart, nYStart, lpszString, cbString);
}

BOOL WINAPI ExtTextOutACallbackProc(HDC hdc, int nXStart, int nYStart, UINT fuOptions, CONST RECT *lprc, LPCSTR lpszString, UINT cbString, CONST INT *lpDx)
{
        if (CurParams && CurParams->Active)
                IsInsidePointA(hdc, nXStart, nYStart, lpszString, cbString);
        return ExtTextOutANextHook(hdc, nXStart, nYStart, fuOptions, lprc, lpszString, cbString, lpDx);
}

BOOL WINAPI ExtTextOutWCallbackProc(HDC hdc, int nXStart, int nYStart, UINT fuOptions, CONST RECT *lprc, LPCWSTR lpszString, UINT cbString, CONST INT *lpDx)
{
        if (CurParams && CurParams->Active)
                IsInsidePointW(hdc, nXStart, nYStart, lpszString, cbString);
        return ExtTextOutWNextHook(hdc, nXStart, nYStart, fuOptions, lprc, lpszString, cbString, lpDx);
}

static void InstallTextOutHooks()
{
        HookAPI("gdi32.dll", "TextOutA", (PROC)TextOutACallbackProc, (PROC*)&TextOutANextHook);
        HookAPI("gdi32.dll", "TextOutW", (PROC)TextOutWCallbackProc, (PROC*)&TextOutWNextHook);
        HookAPI("gdi32.dll", "ExtTextOutA", (PROC)ExtTextOutACallbackProc, (PROC*)&ExtTextOutANextHook);
        HookAPI("gdi32.dll", "ExtTextOutW", (PROC)ExtTextOutWCallbackProc, (PROC*)&ExtTextOutWNextHook);
}

static void UninstallTextOutHooks()
{
        if (TextOutANextHook)
                HookAPI("gdi32.dll", "TextOutA", (PROC)TextOutANextHook, NULL);
        if (TextOutWNextHook)
                HookAPI("gdi32.dll", "TextOutW", (PROC)TextOutWNextHook, NULL);
        if (ExtTextOutANextHook)
                HookAPI("gdi32.dll", "ExtTextOutA", (PROC)ExtTextOutANextHook, NULL);
        if (ExtTextOutWNextHook)
                HookAPI("gdi32.dll", "ExtTextOutW", (PROC)ExtTextOutWNextHook, NULL);
}

DLLIMPORT void GetWord (TCurrentMode *P)
{
        TCHAR wClassName[64];
        if (GetClassName(P->WND, wClassName, sizeof(wClassName) / sizeof(TCHAR))==0)
                wClassName[0] = '\0';
        TKnownWndClass WndClass = GetWindowType(P->WND, wClassName);
        char *p = TryGetWordFromAnyWindow(WndClass, P->WND, P->Pt, &(P->BeginPos));
        if (p) {
            P->WordLen = strlen(p);
                strcpy(P->MatchedWord, p);
                free(p);
        } else {
                P->WordLen = 0;
        }
}


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
                        //ThTypes_Init();
                        InstallTextOutHooks();
        break;

      case DLL_PROCESS_DETACH:
                        UninstallTextOutHooks();
                        //Thtypes_End();
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}
=============================

TextOutHook.h
=============================
#ifndef _TextOutHook_H_
#define _TextOutHook_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

#include "ThTypes.h"

char* ExtractFromEverything(HWND WND, POINT Pt, int *BeginPos);

DLLIMPORT void GetWord (TCurrentMode *P);


#endif /* _TextOutHook_H_ */
=============================

GetWord.c
=============================
#include "GetWord.h"
#include "TextOutHook.h"

TKnownWndClass GetWindowType(HWND WND, const char* WNDClass)
{
        const char* StrKnownClasses[] = {
                "RICHEDIT20A",
                "RICHEDIT20W",
                "RICHEDIT",
                "EDIT",
                "INTERNET EXPLORER_SERVER",
                "CONSOLEWINDOWCLASS", // NT
                "TTYGRAB", // 9x
                };
        TKnownWndClass KnownClasses[] = {
                kwcRichEdit,
                kwcRichEdit,
                kwcRichEdit,
                kwcMultiLineEdit,
                kwcInternetExplorer_Server,
                kwcConsole,
                kwcConsole,
        };
        int i;
        for (i=0; i<7; i++) {
                if (strcasecmp(WNDClass, StrKnownClasses)==0)
                        break;
        }
        if (i<7) {
                if (KnownClasses == kwcMultiLineEdit) {
                        if ((GetWindowLong(WND, GWL_STYLE) & ES_MULTILINE) == 0)
                                return kwcSingleLineEdit;
                }
                return KnownClasses;
        } else
                return kwcUnknown;
}

static char* ExtractWordFromRichEditPos(HWND WND, POINT Pt, int *BeginPos)
{
        return ExtractFromEverything(WND, Pt, BeginPos);
}
/*
typedef struct TEditParams {
        HWND WND;
        POINT Pt;
        char Buffer[256];
} TEditParams;

static int ExtractWordFromEditPosPack(TEditParams *params)
{
        int Result = 0;
        int BegPos;
        BegPos = SendMessage(params->WND, EM_CHARFROMPOS, 0, params->Pt.x | params->Pt.y << 16);
        if (BegPos == -1)
                return Result;
        int MaxLength;
        MaxLength = SendMessage(params->WND, EM_LINELENGTH, BegPos & 0xFFFF, 0);
        if (MaxLength <= 0)
                return Result;
        char *Buf;
        Buf = GlobalAlloc(GMEM_FIXED, MaxLength + 1);
        if (Buf) {
                *Buf = MaxLength;
                MaxLength = SendMessage(params->WND, EM_GETLINE, BegPos >> 16, (int)Buf);
                Buf[MaxLength] = '\0';
                BegPos = (BegPos & 0xFFFF) - SendMessage(params->WND, EM_LINEINDEX, BegPos >> 16, 0) - 1;
                int EndPos;
                EndPos = BegPos;
                while ((BegPos >= 0) && IsCharAlpha(Buf[BegPos]))
                        BegPos--;
                while ((EndPos < MaxLength) && IsCharAlpha(Buf[EndPos]))
                        EndPos++;
                MaxLength = EndPos - BegPos - 1;
                if (MaxLength >= 0) {
                        if (255 >= MaxLength) {
                                Buf[EndPos] = '\0';
                                lstrcpy(params->Buffer, Buf + BegPos + 1);
                                Result = MaxLength;
                        }
                }
                GlobalFree(Buf);
        }
        return Result;
}
*/
static char* ExtractWordFromEditPos(HWND hEdit, POINT Pt, int *BeginPos)
{
        return ExtractFromEverything(hEdit, Pt, BeginPos);
/*        TEditParams *TP;
        TP = malloc(sizeof(TEditParams));
        TP->WND = hEdit;
        TP->Pt = Pt;
        TP->Buffer[0] = '\0';
        ScreenToClient(hEdit, &(TP->Pt));
        int MaxLength;
        MaxLength = ExtractWordFromEditPosPack(TP);
        char *Result;
        if (MaxLength>0) {
                Result = strdup(TP->Buffer);
        } else {
                Result = NULL;
        }
        free(TP);
        return Result;
*/
}

static char* ExtractWordFromIE(HWND WND, POINT Pt, int *BeginPos)
{       
        return ExtractFromEverything(WND, Pt, BeginPos);
}

typedef struct TConsoleParams {
        HWND WND;
        POINT Pt;
        RECT ClientRect;
        char Buffer[256];
} TConsoleParams;

static int GetWordFromConsolePack(TConsoleParams *params)
{
        HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
        if (hStdOut != INVALID_HANDLE_VALUE) {
                CONSOLE_SCREEN_BUFFER_INFO csbi;
                if (GetConsoleScreenBufferInfo(hStdOut, &csbi)) {
                        COORD CurPos;
                        CurPos.X = csbi.srWindow.Left + params->Pt.x * (csbi.srWindow.Right - csbi.srWindow.Left + 1) / params->ClientRect.right;
                        CurPos.Y = csbi.srWindow.Top + params->Pt.y * (csbi.srWindow.Bottom - csbi.srWindow.Top + 1) / params->ClientRect.bottom;
                        if ((CurPos.X >= 0) && (CurPos.X <= csbi.dwSize.X - 1) && (CurPos.Y >= 0) && (CurPos.Y <= csbi.dwSize.Y - 1)) {
                                int BegPos;
                                BegPos = CurPos.X;
                                CurPos.X = 0;
                                char *Buf = GlobalAlloc(GMEM_FIXED, csbi.dwSize.X + 1);
                                if (Buf) {
                                        DWORD ActualRead;
                                        if ((ReadConsoleOutputCharacter(hStdOut, Buf, csbi.dwSize.X, CurPos, &ActualRead)) && (ActualRead == csbi.dwSize.X)) {
                                                OemToCharBuff(Buf, Buf, csbi.dwSize.X);
                                                int WordLen;
                                                if (csbi.dwSize.X > 255)
                                                        WordLen = 255;
                                                else
                                                        WordLen = csbi.dwSize.X;
                                                strncpy(params->Buffer, Buf, WordLen);
                                                GlobalFree(Buf);
                                                return WordLen;
                                        }
                                }
                        }
                }
        }
        return 0;
}
static void GetWordFromConsolePackEnd() {}

static BOOL RemoteExecute(HANDLE hProcess, void *RemoteThread, DWORD RemoteSize, void *Data, int DataSize, DWORD *dwReturn)
{
        void *pRemoteThread = VirtualAllocEx(hProcess, NULL, RemoteSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
        if (!pRemoteThread)
                return FALSE;
        if (!WriteProcessMemory(hProcess, pRemoteThread, RemoteThread, RemoteSize, 0)) {
                VirtualFreeEx(hProcess, pRemoteThread, RemoteSize, MEM_RELEASE);
                return FALSE;
        }
        void *pData = VirtualAllocEx(hProcess, NULL, DataSize, MEM_COMMIT, PAGE_READWRITE);
        if (!pData) {
                VirtualFreeEx(hProcess, pRemoteThread, RemoteSize, MEM_RELEASE);
                return FALSE;
        }
        if (!WriteProcessMemory(hProcess, pData, Data, DataSize, 0)) {
                VirtualFreeEx(hProcess, pRemoteThread, RemoteSize, MEM_RELEASE);
                VirtualFreeEx(hProcess, pData, DataSize, MEM_RELEASE);
                return FALSE;
        }
        // Bug: I don't know why the next line will fail in Windows XP, so get word from cmd.exe can't work presently.
        HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, pData, 0, 0);
        WaitForSingleObject(hThread, INFINITE);
        GetExitCodeThread(hThread, dwReturn);
        ReadProcessMemory(hProcess, pData, Data, DataSize, 0);
        VirtualFreeEx(hProcess, pRemoteThread, RemoteSize, MEM_RELEASE);
        VirtualFreeEx(hProcess, pData, DataSize, MEM_RELEASE);
        if (hThread) {
                CloseHandle(hThread);
                return TRUE;
        } else {
                return FALSE;
        }
}

static char* GetWordFromConsole(HWND WND, POINT Pt, int *BeginPos)
{
        TConsoleParams *TP;
        TP = malloc(sizeof(TConsoleParams));
        TP->WND = WND;
        TP->Pt = Pt;
        ScreenToClient(WND, &(TP->Pt));
        GetClientRect(WND, &(TP->ClientRect));
        DWORD pid;
        GetWindowThreadProcessId(GetParent(WND), &pid);
        DWORD MaxWordSize;
        if (pid != GetCurrentProcessId()) {
                // The next line will fail in Win2k, but OK in Windows XP.
                HANDLE ph = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, pid);
                if (ph) {
                        if (!RemoteExecute(ph, GetWordFromConsolePack, (DWORD)GetWordFromConsolePackEnd - (DWORD)GetWordFromConsolePack, TP, sizeof(TConsoleParams), &MaxWordSize))
                                MaxWordSize = 0;
                        CloseHandle(ph);
                }
        } else {
                MaxWordSize = GetWordFromConsolePack(TP);
        }
        char *Result;
        if (MaxWordSize > 0) {
                Result = strdup(TP->Buffer);
        } else {
                Result = NULL;
        }
        free(TP);
        return Result;
}

char* TryGetWordFromAnyWindow(TKnownWndClass WndType, HWND WND, POINT Pt, int *BeginPos)
{
        typedef char* (*GetWordFunction_t)(HWND, POINT, int*);
        const GetWordFunction_t GetWordFunction[]= {
                ExtractFromEverything,
                ExtractWordFromRichEditPos,
                ExtractWordFromEditPos,
                ExtractWordFromEditPos,
                ExtractWordFromIE,
                GetWordFromConsole,
        };
        return GetWordFunction[WndType](WND, Pt, BeginPos);
}
=============================

GetWord.h
=============================
#ifndef _GetWord_H_
#define _GetWord_H_

#include <windows.h>

typedef enum TKnownWndClass {
        kwcUnknown,
        kwcRichEdit,
        kwcMultiLineEdit,
        kwcSingleLineEdit,
        kwcInternetExplorer_Server,
        kwcConsole,
} TKnownWndClass;

TKnownWndClass GetWindowType(HWND WND, const char* WNDClass);
char* TryGetWordFromAnyWindow(TKnownWndClass WndType, HWND WND, POINT Pt, int *BeginPos);

#endif
=============================

HookImportFunction.c
=============================
#include "HookImportFunction.h"
#include<tlhelp32.h>


// These code come from: http://dev.csdn.net/article/2/2786.shtm
// I fixed a bug in it and improved it to hook all the modules of a program.

#define MakePtr(cast, ptr, AddValue) (cast)((DWORD)(ptr)+(DWORD)(AddValue))

static PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportModule)
{
        if ((szImportModule == NULL) || (hModule == NULL))
                return NULL;
        PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hModule;
        if (IsBadReadPtr(pDOSHeader, sizeof(IMAGE_DOS_HEADER)) || (pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE)) {
                return NULL;
        }
        PIMAGE_NT_HEADERS pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDOSHeader, pDOSHeader->e_lfanew);
        if (IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) || (pNTHeader->Signature != IMAGE_NT_SIGNATURE))
                return NULL;
        if (pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0)
                return NULL;
        PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDOSHeader, pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
        while (pImportDesc->Name) {
                PSTR szCurrMod = MakePtr(PSTR, pDOSHeader, pImportDesc->Name);
                if (stricmp(szCurrMod, szImportModule) == 0)
                        break;
                pImportDesc++;
        }
        if (pImportDesc->Name == (DWORD)0)
                return NULL;
        return pImportDesc;
}

static BOOL IsNT()
{
        OSVERSIONINFO stOSVI;
        memset(&stOSVI, 0, sizeof(OSVERSIONINFO));
        stOSVI.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        BOOL bRet = GetVersionEx(&stOSVI);
        if (FALSE == bRet) return FALSE;
        return (VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId);
}

static BOOL HookImportFunction(HMODULE hModule, LPCSTR szImportModule, LPCSTR szFunc, PROC paHookFuncs, PROC* paOrigFuncs)
{
        if (!IsNT() && ((DWORD)hModule >= 0x80000000))
                return FALSE;
        PIMAGE_IMPORT_DESCRIPTOR pImportDesc = GetNamedImportDescriptor(hModule, szImportModule);
        if (pImportDesc == NULL)
                return FALSE;
        PIMAGE_THUNK_DATA pOrigThunk = MakePtr(PIMAGE_THUNK_DATA, hModule, pImportDesc->OriginalFirstThunk);
        PIMAGE_THUNK_DATA pRealThunk = MakePtr(PIMAGE_THUNK_DATA, hModule, pImportDesc->FirstThunk);
        while (pOrigThunk->u1.Function) {
                if (IMAGE_ORDINAL_FLAG != (pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG)) {
                        PIMAGE_IMPORT_BY_NAME pByName = MakePtr(PIMAGE_IMPORT_BY_NAME, hModule, pOrigThunk->u1.AddressOfData);
                        // When hook EditPlus, read pByName->Name[0] will case this dll terminate, so call IsBadReadPtr() here.
                        if (IsBadReadPtr(pByName, sizeof(IMAGE_IMPORT_BY_NAME))) {
                                pOrigThunk++;
                                pRealThunk++;
                                continue;                               
                        }
                        if ('\0' == pByName->Name[0]) {
                                pOrigThunk++;
                                pRealThunk++;
                                continue;
                        }
                        BOOL bDoHook = FALSE;
                        if ((szFunc[0] == pByName->Name[0]) && (strcmpi(szFunc, (char*)pByName->Name) == 0)) {
                                if (paHookFuncs)
                                        bDoHook = TRUE;
                        }
                        if (bDoHook) {
                                MEMORY_BASIC_INFORMATION mbi_thunk;
                                VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
                                VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);
                                if (paOrigFuncs)
                                        *paOrigFuncs = (PROC)pRealThunk->u1.Function;
                                pRealThunk->u1.Function = (DWORD)paHookFuncs;
                                DWORD dwOldProtect;
                                VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, mbi_thunk.Protect, &dwOldProtect);
                                return TRUE;
                        }
                }
                pOrigThunk++;
                pRealThunk++;
        }
        return FALSE;
}

BOOL HookAPI(LPCSTR szImportModule, LPCSTR szFunc, PROC paHookFuncs, PROC* paOrigFuncs)
{
        if ((szImportModule == NULL) || (szFunc == NULL)) {
                return FALSE;
        }
        HANDLE hSnapshot;
        hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
        MODULEENTRY32 me = {sizeof(MODULEENTRY32)};
        BOOL bOk = Module32First(hSnapshot,&me);
        while (bOk) {
                HookImportFunction(me.hModule, szImportModule, szFunc, paHookFuncs, paOrigFuncs);
                bOk = Module32Next(hSnapshot,&me);
        }
        return TRUE;
}
=============================

HookImportFunction.h
=============================
#ifndef _HookImportFunction_H_
#define _HookImportFunction_H_

#include <windows.h>


BOOL HookAPI(LPCSTR szImportModule, LPCSTR szFunc, PROC paHookFuncs, PROC* paOrigFuncs);

#endif
=============================

mouseover.c
=============================
/*
* This file part of StarDict - A international dictionary for GNOME.
* http://stardict.sourceforge.net
*
* Copyright (C) 2006 Hu Zheng
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/

#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#include "../stardict.h"
#include "../conf.h"
#include <glib/gi18n.h>

#include "mouseover.h"
#include "ThTypes.h"

// StarDict's Mouseover feature get the example delphi source code from Mueller Electronic Dicionary.
// Homepage: http://vertal1.narod.ru/mueldic.html E-mail: svv_soft@mail.ru

const int WM_MY_SHOW_TRANSLATION = WM_USER + 300;

void Mouseover::NeedSpyDll()
{
        if (fSpyDLL == 0) {
                fSpyDLL = LoadLibrary((gStarDictDataDir+G_DIR_SEPARATOR+"TextOutSpy.dll").c_str());
                if (fSpyDLL==0) {
                        fSpyDLL = (HINSTANCE)-1;
                } else {
                        ActivateSpy_func = (ActivateSpy_func_t)GetProcAddress(fSpyDLL, "ActivateTextOutSpying");
                }
        }
}

HWND Mouseover::Create_hiddenwin()
{
        WNDCLASSEX wcex;
        TCHAR wname[32];

        strcpy(wname, "StarDictMouseover");

        wcex.cbSize = sizeof(WNDCLASSEX);

        wcex.style                = 0;
        wcex.lpfnWndProc        = (WNDPROC)mouseover_mainmsg_handler;
        wcex.cbClsExtra                = 0;
        wcex.cbWndExtra                = 0;
        wcex.hInstance                = stardictexe_hInstance;
        wcex.hIcon                = NULL;
        wcex.hCursor                = NULL,
        wcex.hbrBackground        = NULL;
        wcex.lpszMenuName        = NULL;
        wcex.lpszClassName        = wname;
        wcex.hIconSm                = NULL;

        RegisterClassEx(&wcex);

        // Create the window
        return (CreateWindow(wname, "", 0, 0, 0, 0, 0, GetDesktopWindow(), NULL, stardictexe_hInstance, 0));
}

void Mouseover::ShowTranslation()
{
        if (bIsPureEnglish(GlobalData->CurMod.MatchedWord)) {
                gpAppFrame->SmartLookupToFloat(GlobalData->CurMod.MatchedWord, GlobalData->CurMod.BeginPos, true);
    } else {
                char *str1 = g_locale_to_utf8(GlobalData->CurMod.MatchedWord, GlobalData->CurMod.BeginPos, NULL, NULL, NULL);
                char *str2 = g_locale_to_utf8(GlobalData->CurMod.MatchedWord + GlobalData->CurMod.BeginPos, GlobalData->CurMod.WordLen - GlobalData->CurMod.BeginPos, NULL, NULL, NULL);
                GlobalData->CurMod.BeginPos = strlen(str1);
                char *str = g_strdup_printf("%s%s", str1, str2);
                g_free(str1);
                g_free(str2);
                gpAppFrame->SmartLookupToFloat(str, GlobalData->CurMod.BeginPos, true);
                g_free(str);
        }
}

LRESULT CALLBACK Mouseover::mouseover_mainmsg_handler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
        switch (msg) {
                case WM_MY_SHOW_TRANSLATION:
                        ShowTranslation();
                        break;
                default:
                        /*nothing*/;
        }

        return DefWindowProc(hwnd, msg, wparam, lparam);
}

Mouseover::Mouseover()
{
        fSpyDLL = 0;
        ActivateSpy_func = NULL;
}

void Mouseover::Init()
{
        ThTypes_Init();
        ZeroMemory(GlobalData, sizeof(TGlobalDLLData));
        strcpy(GlobalData->LibName, (gStarDictDataDir+G_DIR_SEPARATOR+"TextOutHook.dll").c_str());
        GlobalData->ServerWND = Create_hiddenwin();
}

void Mouseover::End()
{
        if ((fSpyDLL!=0)&&(fSpyDLL!=(HINSTANCE)-1)) {
                stop();
                FreeLibrary(fSpyDLL);
        }
        DestroyWindow(GlobalData->ServerWND);
        Thtypes_End();
}

void Mouseover::start()
{
        NeedSpyDll();
        if (ActivateSpy_func)
                ActivateSpy_func(true);
}

void Mouseover::stop()
{
        if (ActivateSpy_func)
                ActivateSpy_func(false);
}
=============================

mouseover.h
=============================
#ifndef __SD_MOUSEOVER_H__
#define __SD_MOUSEOVER_H__


#include <windows.h>

class Mouseover
{
private:
        typedef void (*ActivateSpy_func_t)(bool);
        ActivateSpy_func_t ActivateSpy_func;
        HINSTANCE  fSpyDLL;
        void NeedSpyDll();
        HWND Create_hiddenwin();
        static void ShowTranslation();
        static LRESULT CALLBACK mouseover_mainmsg_handler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

public:
        Mouseover();
        void Init();
        void End();
        void start();
        void stop();
};

#endif
=============================

stardict.cpp
=============================
bool AppCore::SmartLookupToFloat(const gchar* sWord, int BeginPos, bool bShowIfNotFound)
{
        if (sWord==NULL || sWord[0]=='\0')
                return true;
        char *SearchWord = g_strdup(sWord);
        char *P1 = SearchWord + BeginPos;
        P1 = g_utf8_next_char(P1);
        while (*P1 && !g_unichar_isspace(g_utf8_get_char(P1)))
                P1 = g_utf8_next_char(P1);
        *P1='\0';
        P1 = SearchWord + BeginPos;
        if (BeginPos) {
                if (g_unichar_isspace(g_utf8_get_char(P1)))
                        P1 = g_utf8_prev_char(P1);
                while (P1>SearchWord && !g_unichar_isspace(g_utf8_get_char(g_utf8_prev_char(P1))))
                        P1 = g_utf8_prev_char(P1);
        }

        const gchar **ppWord = (const gchar **)g_malloc(sizeof(gchar *) * oLibs.ndicts());
        gchar **ppWordData = (gchar **)g_malloc(sizeof(gchar *) * oLibs.ndicts());
       
        int SearchTimes = 2;
        while (SearchTimes) {
                glong iIndex;
                bool bFound = false;
                for (int iLib=0;iLibSearchWord && isascii(*(P3-1)) && g_ascii_isupper(*(P3-1)))
                                                        P3--;
                                        } else if (g_ascii_islower(*P2)){
                                                P2++;
                                                while (*P2 && g_ascii_islower(*P2))
                                                        P2++;
                                        }
                                        if (*P2) {
                                                *P2='\0';
                                        } else {
                                                if (P3==P1)
                                                        break;
                                        }
                                        P1=P3;
                                } else {
                                        while (P3>SearchWord && isascii(*(P3-1)) && g_ascii_isupper(*(P3-1)))
                                                P3--;
                                        if (P3==P1)
                                                break;
                                }
                        } else if (g_ascii_islower(*P2)) {
                                char *P3 = SearchWord + BeginPos;
                                while (P3>SearchWord && isascii(*(P3-1)) && g_ascii_islower(*(P3-1)))
                                        P3--;
                                if (P3>SearchWord && isascii(*(P3-1)) && g_ascii_isupper(*(P3-1)))
                                        P3--;
                                P2++;
                                while (*P2 && g_ascii_islower(*P2))
                                        P2++;
                                if (*P2) {
                                        *P2='\0';
                                } else {
                                        if (P3==P1)
                                                break;
                                }
                                P1=P3;
                        } else {
                                break;
                        }
                } else {
                        if (P1==SearchWord + BeginPos) {
                                char *EndPointer=P1+strlen(P1);
                                EndPointer = g_utf8_prev_char(EndPointer);
                                if (EndPointer!=P1) {
                                        *EndPointer='\0';
                                        SearchTimes = 2;
                                }
                                else {
                                        break;
                                }
                        } else {
                                P1 = SearchWord + BeginPos;
                                SearchTimes = 2;
                        }
                }
        }
        g_free(ppWord);
        g_free(ppWordData);
       
        // not found
        if (bShowIfNotFound) {
                ShowNotFoundToFloatWin(P1,_(""), false);
                oTopWin.InsertHisList(P1); //really need?
        }
        g_free(SearchWord);
        return false;       
}
=============================

[ Last edited by zzz19760225 on 2017-7-20 at 23:37 ]
作者: zzz19760225     时间: 2016-6-26 19:11
gcc绘图 ?!?
在linux下安装dosemu,再下载Turbo C,应该可以尝试一些WIN C的制图了。

[ Last edited by zzz19760225 on 2017-7-25 at 21:03 ]
作者: zzz19760225     时间: 2016-6-26 19:14
#include<stdio.h>
int main()
{
        /* 菜鸟C语言在线编辑器 http://www.runoob.com/try/runcod ... lloworld&type=c ×/
        /* 菜鸟教程C语言   http://www.runoob.com/cprogramming/c-tutorial.html */
        /* 一  ;C 语言教程,始 */
        printf("http://www.runoob.com/cprogramming/c-tutorial.html\n");
        printf("一  ;1.1;C 语言教程\n");
        printf("C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。\n");
        printf("C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。\n");
        printf("---------------------------------------------------- \n");
        printf("#include <stdio.h>\n");
        printf("int main()\n");
        printf("{\n");
        printf("    /* \n");
        printf("    第一个 C 程序 \n");
        printf("    */ \n");
        printf("    printf(“Hello, World!”);\n");
         /* 程序分号"原本是英文下的,输入法切换为中文下的”就可以显示了 */
        printf("    return 0;\n");
        printf("}\n");
        printf("--------------------------------------------------- \n");
         /* 一  ;C 语言教程,终 */
    return 0;
}

--------------------------------------------------------------------------------------------------------------
#include <stdio.h>
int main(void)
{
        printf("#include <stdio.h> \n");
        printf("int main(void) \n");
        printf("{ \n");
        printf("        printf(\"c1.c\"); \n");
        printf("        return 0; \n");
        printf("} \n");
        return 0;
}
-------------------------------------------------------------------------------------------------------------

[ Last edited by zzz19760225 on 2017-7-7 at 17:24 ]
作者: zzz19760225     时间: 2016-6-26 19:17    标题: C语言象棋

棋子棋盘标准
规则计算逻辑路径模块
独立电脑操作程序
独立本机人操作程序
独立网络操作程序

语音报对方走棋
语音按序报棋局上棋子
棋局放大镜
输入指令和输入对战程序
一个文本有90个字,每字本来是空格字符,开局修改为有的空格有的是指定字符,如新局布局和残局,复盘。
每个棋局进行一次操作记录一次棋局文本


五个数组或存储单位,
第一个存储单位显示相对固定的棋盘和记录期盼变化,最后统计结果输出。
第二个存储独立的棋子字符信息和运动相互关系,以及多棋子组合关系,在组合关系丰富下发展对手关系(也许可以两人以上的多人混战)。
第三个程序学习和错误改错正确化,一个会知错改错并增进与人非棋局交流的文化程序,将小学中学大学和人生道理被认为是善信息,在交流中可以被拒绝的参与交流。或者是一个边聊天边互相形式学习的棋局对手。
第四个
第五个后期延伸,换地图,换棋子,换规则的其他模拟,类似大战略类兵棋推演,人生旅程的能量聚散

字符信息定义                 存取和路径,文件夹标准                   逻辑 循环?
每一个棋盘位都是一个相对独立的信息组,其中的棋子信息可以存取,棋盘部分不可以存取的只读,所有棋盘位组成一个棋盘。棋盘外有操作台,就是走棋和计棋的内容。
双电脑程序,在人机机主对战电脑的时候,一个辅助电脑程序合伙合谋打另一个电脑,也许两者合力也会败给另一方,但是可以通过给对手程序掺问题字符,经常悔棋但是不同意电脑悔棋,将电脑思维逻辑内容减少等等非正面作战方法,取得非竞赛的优势(一般情况下就不要这样,因为练不到棋艺)。
一个命令组:为什么。当问电脑为什么的时候,电脑将已有逻辑分析显示出来。
信息位的信息,棋盘位信息,棋子信息,规则量增减信息,棋子在棋盘上增减量信息。
        电脑与机主进行一步逻辑比较。这一步与下一步之间有一个选择,假设选择为无穷循环或5次有限循环后选择第一逻辑方案;方案的中间与两头随机选择一次,方案的两头选择头尾的随机选择一次,方案的头尾之一的排序仅靠的前两个进行随机选择;对时间进行毫秒到秒到分到时天月年,逐步从小到大后退寻找最后按键和命令截取时系统时间数字的最后一位时单双或零,毫秒为零则退后到秒,若有非零,根据截取时的单双进行先后随机选择的参数,单为1,双为2,方案的几个选择需要几次时间截取。当只有一个方案,则随机选择程序条件不满足,只选择仅有的方案。             电脑对已有双方棋子现状进行记录,下一步可能运动和吃子点,以及可能运动和吃子点的再次运动和吃子的落脚点分析收集,对这些组合进行互相内部比较,寻找伤对方棋子多,我方棋子损失少的一些再次随机选择。
        周期扫描表,类似仓库汇总表的天周月季年表。少的时候只针对轮流走棋的一个子扫描变化差异,子多,规则变化的时候,可以对同步走棋进行扫描汇总比较分析选择。
        周期规则下只记录一步,一步根据棋子预设运行和吃子规则进行,棋子被主观主动和客观被动的几个除第一局外已有比较的选择,规律选择,模仿不规律随机三类方案选择,一共三类选择多种交错组合成选择思维组。
         人机棋局时效回合下的暂停按钮。
         自由棋子和无赖小偷强盗恶霸土匪独断强势的多种坏情节参与,还有主动好情节的参与,作为随机性格情绪内容,参合在对话的互动中,不确定这个自由选择的开关,机主随时可以打开可以关闭。棋子可以兵回走,马走非日形,仕可以出宫,象可以走马,跑可以打多棋子之后的目标,可以跑出棋盘,可以隐身,可以复活,可以假装象棋程序出错等等。
        己方环境模糊统计,己方本身模糊统计,己方核心威胁统计,对方,己方与对方比较。己方统计,对方统计,己方与对方统计的比较选择。

[ Last edited by zzz19760225 on 2017-8-1 at 21:30 ]
作者: zzz19760225     时间: 2016-6-26 19:19
19         29         39         49         59         69         79         89         99
18         28         38         48         58         68         78         88         98
17         27         37         47         57         67         77         87         97
16         26         36         46         56         66         76         86         96
15         25         35         45         55         65         75         85         95
14         24         34         44         54         64         74         84         94
13         23         33         43         53         63         73         83         93
12         22         32         42         52         62         72         82         92
11         21         31         41         51         61         71         81         91   
10         20         30         40         50         60         70         80         90


19     22419 车                 29     22529 马                 39     22639 象                  49     22749 士                 59     22859 将                 69     22969 士                  79     23079 象                 89     23189 马                99     23299 车     

18                                       28                                       38                                       48                                       58                                       68                                       78                                       88                                      98        

17                                       27     22227 炮                 37                                       47                                       57                                       67                                       77                                       87     22387 炮                 97

16     21716 兵                 26                                       36     21836 兵                  46                                       56     21956 兵                 66                                       76     22076 兵                 86                                      96     22196 兵         

15                                       25                                       35                                       45                                       55                                       65                                       75                                       85                                      95

14                                       24                                       34                                       44                                       54                                       64                                       74                                       84                                      94

13     11213 卒                 23                                       33     11333 卒                  43                                       53     11453 卒                 63                                       73     11573 卒                 83                                      93     11693 卒     

12                                       22     11022 砲                 32                                       42                                       52                                       62                                       72                                       82     11182 砲                 92

11                                       21                                       31                                       41                                       51                                       61                                       71                                       81                                      91   

10     10110 車                 20     10220 馬                 30     10330 相                  40     10440 仕                 50     10550 帅                  60     10660 仕                 70     10770 相                 80     10880 馬                 90     10990 車     
            



10 + 01 + 10 = 21           21 + 01 + 10 = 32           32 + 01 +10 = 43               43 + 01 + 10 = 54           54 + 01 + 10 = 65             65 + 01 + 10 = 76            76 + 01 + 10 = 87            87 + 01 + 10 = 98            98 + 01 = 99   

99 - 01 =98          98 - 01 - 10 = 87              87 - 01 -10 = 76               76 - 01 - 10 = 65                 65 - 01 - 10 = 54              54 - 01 - 10 = 43                43 - 01 - 10 = 32               32 - 01 - 10 = 21               21 - 01 - 10 = 10
               


車  101  10  + 01~09 = 101  19  - 01~09              車  101  10  + 10~90 = 101  90  - 10~90        



10110=10110;2017071613:40:19;10110 + 01 = 10110;2017071613:40:20;10111 + 50 = 10110;2017071613:40:21;10161
棋子信息 + 选择信息(棋局对手双方人机逻辑判断系统) + 供选择信息(棋子规则范围)+ 走棋信息 + 时间信息 = 下一步和周期的棋子信息
棋子信息=初始棋子信息+增量棋子信息-减量棋子信息
棋子信息=棋子角色+棋子序数+棋盘位置纵横=1~2 + 1~32 + 10~99(10~90,01~09)
      x=10 ~ 99 = 90
      x=x{+1}[+1](+1)<1> ---- 0 ~ 1  红黑双方轮流的执子                            \*时间纵横坐标数值为零则不动*\
                |       |      |-----  0 ~ 9  ±  0 ~ 9         
                |       |----------  1 ~ 9  ±  0 ~ 9
                |----------------  时间增减                                             动作序数+时间记录组成流水账

      x=x(16=55+1+1+1)  
      x=x(16=55-1-1-1)  
      x=x(16=55+0+0+0)  
               |----32定义棋子专用序号

      +1         -1         0
     ----   +   ----  +  ----  =  11.11   (分开计算合并显示,浮点计算的分开法可不可以用在这里?)
      +1         -1         0

      rain  [x]  [y]      
                |      |----0 ~ 9
                |---------1 ~ 9

       pizpo
     [xy] [z]---- 1 ~ 32
       | |---------- 0 ~ 9
       |------------1 ~ 9
   

周期扫描表
     123456789
9   000000000     
8   100000000
7   000000000
6   000000000
5   000000000
4   000000000
3   000000000
2   000000000
1   000000000
0   000000000

12=1+增量+减量=2+增量+减量=条件满足终止。
轮流12开头进行周期时间回合
运动和吃子的增减量信息
条件判断    22859和10550是否还在
---------------------------------------------------------------------------------------------------------- >

棋子规则
1兵卒  卒11333 在可移动方案范围里选一个,检查条件:不能 - 01,如果后面数字大于4则可以± 10 ,如果前面数字为1则不能 - 10 ,如果前面数字为9则不能 + 10。
                             运动,可运动范围为前 + 01 位置,+ 10和 - 10的左右,因后面数字为4,不大于4,所以不能进行左右± 10的选择,只能进行+01的操作。
                                        判断前面+01位置是否有棋子信息,无信息进行运动。
                             判断前面+01位置有棋子信息,进行替换,就是吃子。
                             记录和比较分析报告,存储到历史记录和电脑程序的信息库中。

[ Last edited by zzz19760225 on 2017-7-21 at 16:36 ]
作者: zzz19760225     时间: 2016-6-26 19:26
一个文本与sed,还有shell命令,组成一个循环的结构棋局,直到条件完成。

一步棋按照规则行走,行走结束后输出一个规则命令,成为下一步的输入命令参与。

a > b       a步骤完成,输出一个规则结果为b文件  +  总体分析
b > c       b步骤完成,输出一个规则结果为c文件   + 总体分析

[ Last edited by zzz19760225 on 2017-7-15 at 19:11 ]
作者: zzz19760225     时间: 2016-6-26 19:27
1
作者: zzz19760225     时间: 2016-6-26 19:28
1
作者: zzz19760225     时间: 2016-6-26 19:33
1
作者: zzz19760225     时间: 2016-6-26 19:34
1
作者: zzz19760225     时间: 2016-6-26 19:35
1
作者: zzz19760225     时间: 2016-6-26 19:37
1
作者: zzz19760225     时间: 2016-6-26 19:38
1
作者: zzz19760225     时间: 2016-6-26 19:38
1
作者: zzz19760225     时间: 2016-6-26 19:40
目录

历史
前言
I. C语言入门

    1. 程序的基本概念

        1. 程序和编程语言
        2. 自然语言和形式语言
        3. 程序的调试
        4. 第一个程序

    2. 常量、变量和表达式

        1. 继续Hello World
        2. 常量
        3. 变量
        4. 赋值
        5. 表达式
        6. 字符类型与字符编码

    3. 简单函数

        1. 数学函数
        2. 自定义函数
        3. 形参和实参
        4. 全局变量、局部变量和作用域

    4. 分支语句

        1. if语句
        2. if/else语句
        3. 布尔代数
        4. switch语句

    5. 深入理解函数

        1. return语句
        2. 增量式开发
        3. 递归

    6. 循环语句

        1. while语句
        2. do/while语句
        3. for语句
        4. break和continue语句
        5. 嵌套循环
        6. goto语句和标号

    7. 结构体

        1. 复合类型与结构体
        2. 数据抽象
        3. 数据类型标志
        4. 嵌套结构体

    8. 数组

        1. 数组的基本概念
        2. 数组应用实例:统计随机数
        3. 数组应用实例:直方图
        4. 字符串
        5. 多维数组

    9. 编码风格

        1. 缩进和空白
        2. 注释
        3. 标识符命名
        4. 函数
        5. indent工具

    10. gdb

        1. 单步执行和跟踪函数调用
        2. 断点
        3. 观察点
        4. 段错误

    11. 排序与查找

        1. 算法的概念
        2. 插入排序
        3. 算法的时间复杂度分析
        4. 归并排序
        5. 线性查找
        6. 折半查找

    12. 栈与队列

        1. 数据结构的概念
        2. 堆栈
        3. 深度优先搜索
        4. 队列与广度优先搜索
        5. 环形队列

    13. 本阶段总结

II. C语言本质

    14. 计算机中数的表示

        1. 为什么计算机用二进制计数
        2. 不同进制之间的换算
        3. 整数的加减运算

            3.1. Sign and Magnitude表示法
            3.2. 1's Complement表示法
            3.3. 2's Complement表示法
            3.4. 有符号数和无符号数

        4. 浮点数

    15. 数据类型详解

        1. 整型
        2. 浮点型
        3. 类型转换

            3.1. Integer Promotion
            3.2. Usual Arithmetic Conversion
            3.3. 由赋值产生的类型转换
            3.4. 强制类型转换
            3.5. 编译器如何处理类型转换

    16. 运算符详解

        1. 位运算

            1.1. 按位与、或、异或、取反运算
            1.2. 移位运算
            1.3. 掩码
            1.4. 异或运算的一些特性

        2. 其它运算符

            2.1. 复合赋值运算符
            2.2. 条件运算符
            2.3. 逗号运算符
            2.4. sizeof运算符与typedef类型声明

        3. Side Effect与Sequence Point
        4. 运算符总结

    17. 计算机体系结构基础

        1. 内存与地址
        2. CPU
        3. 设备
        4. MMU
        5. Memory Hierarchy

    18. x86汇编程序基础

        1. 最简单的汇编程序
        2. x86的寄存器
        3. 第二个汇编程序
        4. 寻址方式
        5. ELF文件

            5.1. 目标文件
            5.2. 可执行文件

    19. 汇编与C之间的关系

        1. 函数调用
        2. main函数和启动例程
        3. 变量的存储布局
        4. 结构体和联合体
        5. C内联汇编
        6. volatile限定符

    20. 链接详解

        1. 多目标文件的链接
        2. 定义和声明

            2.1. extern和static关键字
            2.2. 头文件
            2.3. 定义和声明的详细规则

        3. 静态库
        4. 共享库

            4.1. 编译、链接、运行
            4.2. 动态链接的过程
            4.3. 共享库的命名惯例

        5. 虚拟内存管理

    21. 预处理

        1. 预处理的步骤
        2. 宏定义

            2.1. 函数式宏定义
            2.2. 内联函数
            2.3. #、##运算符和可变参数
            2.4. 宏展开的步骤

        3. 条件预处理指示
        4. 其它预处理特性

    22. Makefile基础

        1. 基本规则
        2. 隐含规则和模式规则
        3. 变量
        4. 自动处理头文件的依赖关系
        5. 常用的make命令行选项

    23. 指针

        1. 指针的基本概念
        2. 指针类型的参数和返回值
        3. 指针与数组
        4. 指针与const限定符
        5. 指针与结构体
        6. 指向指针的指针与指针数组
        7. 指向数组的指针与多维数组
        8. 函数类型和函数指针类型
        9. 不完全类型和复杂声明

    24. 函数接口

        1. 本章的预备知识

            1.1. strcpy与strncpy
            1.2. malloc与free

        2. 传入参数与传出参数
        3. 两层指针的参数
        4. 返回值是指针的情况
        5. 回调函数
        6. 可变参数

    25. C标准库

        1. 字符串操作函数

            1.1. 初始化字符串
            1.2. 取字符串的长度
            1.3. 拷贝字符串
            1.4. 连接字符串
            1.5. 比较字符串
            1.6. 搜索字符串
            1.7. 分割字符串

        2. 标准I/O库函数

            2.1. 文件的基本概念
            2.2. fopen/fclose
            2.3. stdin/stdout/stderr
            2.4. errno与perror函数
            2.5. 以字节为单位的I/O函数
            2.6. 操作读写位置的函数
            2.7. 以字符串为单位的I/O函数
            2.8. 以记录为单位的I/O函数
            2.9. 格式化I/O函数
            2.10. C标准库的I/O缓冲区
            2.11. 本节综合练习

        3. 数值字符串转换函数
        4. 分配内存的函数

    26. 链表、二叉树和哈希表

        1. 链表

            1.1. 单链表
            1.2. 双向链表
            1.3. 静态链表
            1.4. 本节综合练习

        2. 二叉树

            2.1. 二叉树的基本概念
            2.2. 排序二叉树

        3. 哈希表

    27. 本阶段总结

III. Linux系统编程

    28. 文件与I/O

        1. 汇编程序的Hello world
        2. C标准I/O库函数与Unbuffered I/O函数
        3. open/close
        4. read/write
        5. lseek
        6. fcntl
        7. ioctl
        8. mmap

    29. 文件系统

        1. 引言
        2. ext2文件系统

            2.1. 总体存储布局
            2.2. 实例剖析
            2.3. 数据块寻址
            2.4. 文件和目录操作的系统函数

        3. VFS

            3.1. 内核数据结构
            3.2. dup和dup2函数

    30. 进程

        1. 引言
        2. 环境变量
        3. 进程控制

            3.1. fork函数
            3.2. exec函数
            3.3. wait和waitpid函数

        4. 进程间通信

            4.1. 管道
            4.2. 其它IPC机制

        5. 练习:实现简单的Shell

    31. Shell脚本

        1. Shell的历史
        2. Shell如何执行命令

            2.1. 执行交互式命令
            2.2. 执行脚本

        3. Shell的基本语法

            3.1. 变量
            3.2. 文件名代换(Globbing):* ? []
            3.3. 命令代换:`或 $()
            3.4. 算术代换:$(())
            3.5. 转义字符\
            3.6. 单引号
            3.7. 双引号

        4. bash启动脚本

            4.1. 作为交互登录Shell启动,或者使用--login参数启动
            4.2. 以交互非登录Shell启动
            4.3. 非交互启动
            4.4. 以sh命令启动

        5. Shell脚本语法

            5.1. 条件测试:test [
            5.2. if/then/elif/else/fi
            5.3. case/esac
            5.4. for/do/done
            5.5. while/do/done
            5.6. 位置参数和特殊变量
            5.7. 函数

        6. Shell脚本的调试方法

    32. 正则表达式

        1. 引言
        2. 基本语法
        3. sed
        4. awk
        5. 练习:在C语言中使用正则表达式

    33. 信号

        1. 信号的基本概念
        2. 产生信号

            2.1. 通过终端按键产生信号
            2.2. 调用系统函数向进程发信号
            2.3. 由软件条件产生信号

        3. 阻塞信号

            3.1. 信号在内核中的表示
            3.2. 信号集操作函数
            3.3. sigprocmask
            3.4. sigpending

        4. 捕捉信号

            4.1. 内核如何实现信号的捕捉
            4.2. sigaction
            4.3. pause
            4.4. 可重入函数
            4.5. sig_atomic_t类型与volatile限定符
            4.6. 竞态条件与sigsuspend函数
            4.7. 关于SIGCHLD信号

    34. 终端、作业控制与守护进程

        1. 终端

            1.1. 终端的基本概念
            1.2. 终端登录过程
            1.3. 网络登录过程

        2. 作业控制

            2.1. Session与进程组
            2.2. 与作业控制有关的信号

        3. 守护进程

    35. 线程

        1. 线程的概念
        2. 线程控制

            2.1. 创建线程
            2.2. 终止线程

        3. 线程间同步

            3.1. mutex
            3.2. Condition Variable
            3.3. Semaphore
            3.4. 其它线程间同步机制

        4. 编程练习

    36. TCP/IP协议基础

        1. TCP/IP协议栈与数据包封装
        2. 以太网(RFC 894)帧格式
        3. ARP数据报格式
        4. IP数据报格式
        5. IP地址与路由
        6. UDP段格式
        7. TCP协议

            7.1. 段格式
            7.2. 通讯时序
            7.3. 流量控制

    37. socket编程

        1. 预备知识

            1.1. 网络字节序
            1.2. socket地址的数据类型及相关函数

        2. 基于TCP协议的网络程序

            2.1. 最简单的TCP网络程序
            2.2. 错误处理与读写控制
            2.3. 把client改为交互式输入
            2.4. 使用fork并发处理多个client的请求
            2.5. setsockopt
            2.6. 使用select

        3. 基于UDP协议的网络程序
        4. UNIX Domain Socket IPC
        5. 练习:实现简单的Web服务器

            5.1. 基本HTTP协议
            5.2. 执行CGI程序

A. 字符编码

    1. ASCII码
    2. Unicode和UTF-8
    3. 在Linux C编程中使用Unicode和UTF-8

B. GNU Free Documentation License Version 1.3, 3 November 2008
参考书目

[ Last edited by zzz19760225 on 2017-12-8 at 13:18 ]
作者: zzz19760225     时间: 2016-6-26 19:41
网络蜘蛛爬虫的简单字词搜索软件,一个方框,输入拼音或笔画,画出来的字,然后点搜索按钮,把相关的内容输出到一个txt文本中,并直接显示在傍边,有上下滑动按钮。

[ Last edited by zzz19760225 on 2017-7-16 at 20:17 ]
作者: zzz19760225     时间: 2016-6-26 19:42    标题: 芯片加工场

1

[ Last edited by zzz19760225 on 2016-12-10 at 21:34 ]
作者: zzz19760225     时间: 2016-6-26 19:42
1
作者: zzz19760225     时间: 2016-6-26 19:43
1
作者: zzz19760225     时间: 2016-6-26 19:44
1
作者: zzz19760225     时间: 2016-6-26 19:44
1
作者: zzz19760225     时间: 2016-6-26 19:46
1
作者: zzz19760225     时间: 2016-6-26 19:47
1
作者: zzz19760225     时间: 2016-6-26 19:49
1
作者: zzz19760225     时间: 2016-6-26 19:50
1
作者: zzz19760225     时间: 2016-6-26 19:51
1
作者: zzz19760225     时间: 2016-6-26 19:51
1
作者: zzz19760225     时间: 2016-6-26 19:52
1
作者: zzz19760225     时间: 2016-6-26 19:53
1
作者: zzz19760225     时间: 2016-6-26 19:53
1
作者: zzz19760225     时间: 2016-6-26 19:54
1
作者: zzz19760225     时间: 2016-6-26 19:55    标题: 沙盘游戏

C++
the powder toy                                       : jacob1
https://github.com/ThePowderToy/The-Powder-Toy

http://www.dooccn.com/cpp/

游戏构建了解与知识的联系,数学知识?
中文汉字的构建考虑
外延人概念环境的游戏副本延伸
例如事情演化的形象化,人机表达为历史预测的参考,与辦花叶的双单差不多

输入汉字和英文识别的元素,与鼠标键盘点击的选项,软件机器人下载的别人元素实验单位模块。

[ Last edited by zzz19760225 on 2017-12-1 at 08:49 ]
作者: zzz19760225     时间: 2016-6-26 19:56
windows下面使用awk、sed、grep、gnuplot
http://blog.sciencenet.cn/home.php?mod=space&uid=858128&do=blog&quickforward=1&id=994394

[ Last edited by zzz19760225 on 2017-12-7 at 02:02 ]
作者: zzz19760225     时间: 2016-6-26 19:56
WIN环境,
1 汉字批处理bat计算器。  
算.bat
----------------------------------------  
:计算器
pause
set /a var=1+1
pause
set /a var=2-1
pause
set /a var=2*2
pause
set /a var=9/3
pause
goto 计算器         (有个小问题,为什么不进行计算呢?)
---------------------------------------

---------------------------------
:1
set a=12
set b=12
pause
set /a c=a+b
pause
set /a d=a-b
pause
set /a e=a*b
pause
set /a f=a/b
pause
goto 1
---------------------------------

同一个文件中的顺序命令执行的信息提供,搜索自身外提供信息的文件
  
2 用批处理做象棋和其他规则的棋牌游戏,用户自制定义规则的游戏。
以兵棋推演的规则事务用户控制的逐步或全程自我逻辑进行,用户将事务变化的内容补充输入。
人生棋局游戏(对应人生信息)。
象棋不同棋子的文件名称和文件内容,文件内容包含特定的数学公式,就是走步规则。有限定义范围,与单位范围组合延伸的棋局,1~10与1~9,象棋棋盘应该在1~10,0~9范围。
1个棋子,名称和定义步子计算,其周围有没有可延伸的点位,如棋局回合内外和边界,有自身棋子或对手棋子,没有限制的可行点位。
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
在假设的30个字符位置,其中位数为1的字符位置为变量,其他的都是常量不变,变量为棋子移动位置。
现有棋子的总量=上一回合棋子总量-选择方案里规则增减的棋子增加减少数字(悔棋和正反顺序复盘)

3 *-/\--进度条的时钟。在字符命令模式下的时间串联存在,以及天连续的记忆文本,天进程。
100年,10年,1年,1旬,1天;
24小时,15分钟刻,一分钟,秒,微秒。动态的模型考虑。

4 搜索网页翻译信息,整理信息内容为文本,对文本内容做成批处理外文翻译的资料库。


5 标准安装文件夹,文件,文件内信息,恢复初始状态,设定一个文件夹文件文件信息的方案编制,恢复到方案;自动进行文件分类归类,你要找的在这里哦,一个使用习惯或几个习惯可以选择。

6 对赌游戏,模式和积分保存。
算卦游戏。
针对两难问题的双赢设置和双输设置选择,丰富双输赢的程度,延伸到平常,减弱输赢影响,减弱结果为一切的循环习惯,增加源头起源缘起,过程实在自在,加上结果的自私私有和无私公有等等选择。
按钮制作,
按钮选择系统时间,输送到一个文本;time > t.txt
对系统时间进行单双处理,选择最后一位数字进行条件设置,奇数偶数。
获取TIME,删除非数字字符,截取最后一个数字,对数字进行逻辑转化为01,01对应输赢字符输出。

单双结果进行奖罚选择,
输出奖罚选择结果,
显示奖罚结果对应的积分,
单机多帐号积分累积。

7 年计划,季计划,月计划,旬计划,周计划,天计划的计划群循环,成功学的电脑化。收购或兴趣比较制作出的计划模版,,游戏比赛普及模版,好模版的提醒。主要是实现人的天信息连接积累,减少信息损失损耗。

8 两个批处理对话的可能,假设一方为用户的需求范围,主要是新手小白,另一个批处理综合程序对问题进行结构分析和选择回应。电脑的正确和错误信息类似,命令帮助注释,字典显示。

9 批处理的CHM字典和档案文件库,人生信息(主要是通用部分,大部分人可能会怎么选择,对个体的可能参考作用)

Linux,汉字字符文本等等
10 转化为其他操作系统的软件层面实现

电脑平台,人事物心身,群体等等
11 转化为其他硬件层面实现 !!!

12 27字母拼音汉字的组合矩阵铺开来列表
单位点阵的铺开列表

13 拼音和汉字的翻译器,显示翻译出来的内容列表,寻找拼音准确化的可能。

14 摩斯密码滴滴声调控
莫斯1和0到GB18030中文
循环连续发声
将定义的两个字符作为指定发声规则,在数字信息结构中寻找两字符发出声音,可以写一段两字符组合,也可以针对字典编写。
定义01两字符(通常以01为内容)
编写字符文(一般由01组成)
读取
听效果
录制播放
通过声音反向转化为大概的字符文
1个滴和2个滴对应01

随时手动选择01输入对应声音

做26个字母对应的bat,第27个总的选择输入,听拼音莫斯密码的声音。
用GB18030中文字符的16进制数字,做成滴答声,输入汉字,就发出对应的音符串。

24小时滴答报时
每15分钟一刻种报一次声音^g,第一刻到第四刻的24小时听显,或者12时辰8刻。

15 内存硬盘存储等输入二进制十六进制,再取出的单字点阵字符显示和应用探索,需要用点阵字库。
存储存取实现;一个命令行显示一个单字或多个单字,或句子;定义字的定字和积累的点阵字体。

16 可以在CMD下建立一个批处理的,命令行文本编辑工具。

17 用批处理做一个屏幕提示文字的电脑工作闹钟。

18 字典文章对应序号问答器。



功能状态实现:

1 输入状态
等待输入,进行计算的内容,由里面的定义加减+ - 等组成引导。
1加1,自动将加字前后的数字进行+处理,整行的加减乘除进行先后顺序排序,再加上括号,方程式子母开方次方啥的,非常无限和小数点等浮点计算(极限数字范围)。

2 等待状态     pause
3 循环状态     :1  goto 1
4 或者选择     
5 信息存入     help > 5.txt     help >> 5.txt
6 信息读取     type 5.txt (?)
7 选择退出,继续
8 形成仓位的变量形式  A=X

[ Last edited by zzz19760225 on 2018-1-4 at 19:05 ]
作者: zzz19760225     时间: 2016-6-26 19:57
重复执行循环   
:loop
go to loop
是goto
:loop
goto loop

1.bat
--------------------
:1
dir
pause
help
pause
2.bat
goto 1
--------------------

2.bat
--------------------
:2
dir
pause
help
pause
1.bat
goto 2
--------------------
循环执行的关闭?

10.bat
-------------------
1.bat
2.bat
3.bat
4.bat
5.bat
6.bat
7.bat
8.bat
9.bat
0.bat
---------------------

@echo off
pause
set /a var=1+1
echo 1+1=
echo %var%
pause
set /a var=2-1
echo 2-1=
echo %var%
pause
set /a var=2*2
echo 2*2=
echo %var%
pause
set /a var=9/3
echo 9/3=
echo %var%
pause
goto 计算器

如何依次执行一个个常用规则文件,并输送结果为互动。1给2结果,2给3结果,,,。
1用户输入界面
2操作过程
3文本信息存取库

120年内某种时间和条件规则循环的命令文件。
提醒节假日

do %0

把时间输出到s.txt的循环
----------------------------------
:s
time >>s.txt <nul
pause
goto s
----------------------------------
!:1 goto 1 循环打开文件之间,最好加个pause暂停,否则容易搞死机器,就算调出进程窗口,也会被打开的文件挡住,不好操作。常用pause,预防麻烦以管用。在虚拟机中除外。

[ Last edited by zzz19760225 on 2017-12-17 at 14:49 ]
作者: zzz19760225     时间: 2016-6-26 19:58
始终用pause间隔命令,有个回合。
pause
dir
pause
help
pause
dir > x.txt
pause
help > y.txt
pause


-----------------------------------------------------------
@echo off
:1
set /p Code=Please scan Code:
set /p output=%code%>>my.txt<nul
goto 1
----------------------------------------------------------


[求助]set /p 多出2個字符,求解                :Lying
http://www.cn-dos.net/forum/viewthread.php?tid=52524&sid=USPLKx

[ Last edited by zzz19760225 on 2017-12-9 at 11:12 ]
作者: zzz19760225     时间: 2016-6-26 19:59    标题: 加减乘除批处理计算器

set /a var=x+y
set /a var=x-y
set /a var=x*y
set /a var=x/y

x加y
x减y
x乘y
x除y

x+y=
x-y=
x*y=
x/y=

算.bat     作为计算中心,复制其他计算文件内容(其他文件没必要bat,作为bat可以考虑并行计算)
加.bat
减.bat
乘.bat
除.bat

用户选择 --->  用户输入  --->  x=?  y=?  --->  x+y=z  --->  z=?

输入内容,收集到一个文本作为信息仓库,等待取用。
--------------------------------------------
:1
@echo off
set /p Code=写:
echo %code% >>my.txt
goto 1
--------------------------------------------

[ Last edited by zzz19760225 on 2017-12-11 at 17:47 ]
作者: zzz19760225     时间: 2016-6-26 20:00
批处理莫斯密码发声调控
----------------------------
:1
^g
pause
goto 1
---------------------------

---------------------------
:1
^g
pause
echo g
goto 2
:2
^g^g
pause
goto 3
:3
echo g
echo g
goto 4
:4
^g^g^g
pause
goto 1
-----------------------------
输入等待:
z
if z=1 >>z.txt do %x
if z=0 >>z.txt do %y
x=^6
y=无

或者输入选择
选1,选0

1.bat
----------------------------
:1
pause
start 2.bat
pause
start 2.bat
start 2.bat
pause
pause
goto 1
---------------------------

2.bat
------------------
^g & exit
------------------

-------------------------------------------v
:1
for /l %%i in (1 1 2) do (
ping -n 2 localhost >nul
call echo %%time%%
)
^g
for /l %%i in (1 1 2) do (
ping -n 2 localhost >nul
call echo %%time%%
)
^g^g
for /l %%i in (1 1 2) do (
ping -n 2 localhost >nul
call echo %%time%%
)
^g^g^g
goto 1

-------------------------------------------^
type 1.txt (1.txt 为^g)
1111   ^g^g   ^g^g   ^g^g   ^g^g
0000   ^g       ^g       ^g       ^g

两个滴之外的为标点符号分割音。
0=*    1=.   隔离=,  3    文章句号=。  4 (防止数字冲突空格隔离,段落隔离,文章结束句号)
* * * * / . . . . / * . * . / . * . * / * * . . / . . * * / * * * . / . . . * / . * * * / * . . . / 。
约定俗成和墨守陈规的数学矩阵间距,1~10的诗句断句,四字,五字,不足位数的空白,用三个滴代替。

[求助]批处理能做摩斯代码转换吗?                        :DOS2BAT
http://www.cn-dos.net/forum/viewthread.php?tid=52224&fpage=1&highlight=%E6%91%A9%E6%96%AF
【挑战】批处理实现摩尔斯码加解密                         :batman
http://bbs.bathome.net/thread-6467-1-2.html

(^g需要在命令行中输入ctrl+g产生,换成文本就是一个小黑点,一个文本1.txt,命令行输入echo ^g > 1.txt ,然后打开1.txt ,复制那个黑点,间隔修改为2,听起来有效果)

0000 0111        7        07        BEL        ␇        响铃

523066680关于时钟的批处理

见一个名字叫^g.bat的文件。(!不行 ?)

一个音,调节-n后面的数字,变化时间间隔。
3.bat
--------
^g
-----------------------------------
:1
type 3.bat
ping -n 2 localhost >nul
goto 1
-----------------------------------

两个按键,一个是执行1次,一个是执行2次,每个后面跟一个时间空档的调节。
用start抛出声音

输入1为一个单位,输入2为2个单位,需要不加上回车键
-----------------------------------
:x
set /p a=
if %a%==1 goto 1
if %a%==2 goto 2
goto end
:1
echo 1
^g
goto end
:2
echo 2
^g^g
:end
goto x
------------------------------------

加上@echo off,就从两个音转为一个音。
直接
--------
^g
exit
-------
放再多音还是只有一个。

-----------------------------------
@echo off
:1
^g
ping -n 2 localhost >nul
goto 1
-----------------------------------

[ Last edited by zzz19760225 on 2017-12-26 at 22:31 ]
作者: zzz19760225     时间: 2016-6-26 20:00    标题: 批处理WIN7屏幕显示文字的闹钟提示功能

1 一小时一个提示弹窗,并显示几点
显示,直接显示系统时间,或用专门文本显示
若系统时间等于8:00,则弹出一个提示符窗口。
if time =x8                                    start & echo x8 & pause
x=x1;x2;x3;x4;x5;x6;x7;x8;x9;x10;x11;x12
x1=1:00
x2=2:00
------------------------------------------------------------------------------------------
刻15分
半小时30分
1小时60分
1时辰120分

读取系统时间
规则计划表
规则计划表中的变量文字单位,作息表,日程表需要显示提示的内容
计划的循环周期节奏范围,百年,十年,年,季,月,周,天,辰,时,半,刻,分


-------------------------------------------------------------------------------------------

huahua0919:

@echo off
for /l %%i in (1 1 20) do (
ping -n 2 localhost >nul
call echo %%time%%
)

sea1112:

@echo off
:s
title %date:~0,10%     %time%&goto s

如何在bat执行过程中 动态显示系统时间                      :rs369007
http://www.cn-dos.net/forum/viewthread.php?tid=44741&fpage=1&highlight=%E6%98%BE%E7%A4%BA%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%97%B4


-------------------------------------------------------------------------------------------------------
@echo off
title 动态时钟
mode con cols=20 lines=8 & color 1f
echo.
echo      珍惜时间             
echo.
echo  %date%
echo      %time:~0,-3%
ping -n 2 127.0.0.1 > nul
cls
%0

百度经验:批处理命令 如何用批处理命令做动态时钟              : princerat         
https://jingyan.baidu.com/article/73c3ce28edf592e50343d9e4.html
-------------------------------------------------------------------------------------------------------
453625978:

hello
start "" "c:\client.exe"
connect
ping 127.0 /n 60>nul
goto hello
rem /n后面可以设置时间,以上保存为bat

ffihy:

你的问题不太清楚不好给你做,那就告诉你方法你自己做吧。
1 在win7下有一个命令是timeout
TIMEOUT [/T] timeout [/NOBREAK]
描述:
这个工具接受超时参数,等候一段指定的时间(秒)或等按任意键。它还接受
一个参数,忽视按键。
参数列表:
/T timeout 指定等候的秒数。有效范围从 -1 到 99999 秒。
/NOBREAK 忽略按键并等待指定的时间。
/? 显示此帮助消息。
注意: 超时值 -1 表示无限期地等待按键。
示例:
TIMEOUT /?
TIMEOUT /T 10
TIMEOUT /T 300 /NOBREAK
TIMEOUT /T -1
2 通用的就是ping命令了
ping 127.1 -n 60 >nul
上面那句就是ping自己60次 ping自己一次是一秒钟 60次就是一分钟
在写p的时候只要循环运行的代码中加入这一句就有延迟效果

百度知道:如何做写一个批处理文件,能每隔一定的时间自动运行同样的命令        :new12345671
https://zhidao.baidu.com/question/206203396.html?fr=exp_relate
---------------------------------------------------------------------------------------------------------

@echo off
for /l %%i in (1 1 1) do (
ping -n 2 localhost >nul
call echo %%time%% >> 1.txt
)

[ Last edited by zzz19760225 on 2017-12-17 at 15:09 ]
作者: zzz19760225     时间: 2016-6-26 20:01
文章字典问答显示批处理

1文章字典文本                  
千字文和新华字典,或者大百科全书

千字文.txt         
qianziwen.txt     
qzw.txt

2问的文字范围文本



3批处理的问种类


自动回复的邮件规则代表
一个字典文字搜索 ?

[ Last edited by zzz19760225 on 2018-1-4 at 20:04 ]
作者: zzz19760225     时间: 2016-6-26 20:06
dosemu下循环bat批处理文件如何退出?             ctrl+c  (进入yes or no 的询问,按y就可以了)
dosemu下不断弹出start新窗口会怎么样呢?

[ Last edited by zzz19760225 on 2018-1-18 at 20:31 ]
作者: zzz19760225     时间: 2016-6-26 20:07
1
作者: zzz19760225     时间: 2016-6-26 20:08
1
作者: zzz19760225     时间: 2016-6-26 20:09
523066680:
『第 27 楼』:  个人写的记事工具

CODE:  [Copy to clipboard]
@echo off
::::::::::::::::::::::::::::::::::::::::::::::::::
:: 临时记事,code by 523066680@cn-dos.net
::
:: 参数: add 记事内容         添加记事内容到记事列表
:: 参数: del 编号1 编号2 .... 删除指定编号的记事
:: 参数为空                   直接读取记事文本
::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal enabledelayedexpansion
set notebook=notebook.x
set arg_del=del
set arg_add=add
set arg_=type

if not exist "%notebook%" (
   echo %notebook% 不存在,将建立
   type nul>>notebook.x
   exit /b
)

if not defined arg_%1 (
   echo 指令 %1 不存在
   exit /b
) else (
   if "%1"=="" (goto :func_)
)

:read_it
::如果参数不为空就来到这里,增加项目编号和删除项目,都要先读取文本信息
::text format: $number $date $note , range of number : [0-99]
set /a note_n=0
for /f "tokens=1,2,*" %%a in ('type %notebook%') do (
   set note_info_#%%a=%%b %%c
   set /a note_n+=1
)
::然后才跳转到功能块
goto :func_%1


:func_
  type %notebook%
  exit /b

:func_del
  set /a x=-1
  if "%2"=="" (echo arg2 = NULL &exit /b)
  if not defined note_info_#%2 (echo no this item. &exit /b)
  ::假设删除一个以上项目,参数以空格的方式隔开,以总参数为字符串,用于判断
  for /f "tokens=1,*" %%a in ("%*") do (set note_items=%%b)
  ::像10这样的,删除的是0,单纯替换0以后也会变化,后面判断将进行删除,所以是危险的,增加判断因素
  set note_items=#%note_items: =#%#
  echo,>%notebook%
  for /f "tokens=2,* delims==#" %%a in ('set note_info_#') do (
    if "!note_items:#%%a#=!"=="!note_items!" (
       set /a x+=1
       set xnum=  !x!
       set xnum=!xnum:~-2!
       echo !xnum! %%b>>%notebook%
    ) else (
       echo 删除项 - %%a %%b
    )
  )
  echo %notebook% 重新排列 , 现状 :
  type %notebook%
  exit /b
:func_add
   if "%2"=="" (echo 附加信息为空 &exit /b)
   set xnum=  %note_n%
   set xnum=!xnum:~-2!
   set strnow=%*
   ::::cut string - "add "
   set strnow=%strnow:~4%
   (echo %xnum% %date:~0,10% %strnow%)>>%notebook%
   echo %notebook% 现状 :
   type %notebook%
   exit /b
测试:

  Quote:
c:\test>note add 这是个测试项
notebook.x 现状 :

0 2010-06-08 快递代收货款未到
1 2010-06-08 物料未清点
2 2010-06-09 制作一份供应商地址电话信息表
3 2010-06-09 这是个测试项

c:\test>note del 1 2
删除项 - 1 2010-06-08 物料未清点
删除项 - 2 2010-06-09 制作一份供应商地址电话信息表
notebook.x 重新排列 , 现状 :

0 2010-06-08 快递代收货款未到
1 2010-06-09 这是个测试项

c:\test>

http://www.cn-dos.net/forum/viewth ... ghlight=&page=2

[ Last edited by zzz19760225 on 2017-12-26 at 13:38 ]
作者: zzz19760225     时间: 2016-6-26 20:10
26933062:

@echo off&mode con: cols=100 lines=30
echo.&color 1f&title 天佑中华
set var=abcdef
set /p= <nul>●
setlocal enabledelayedexpansion
for /f "skip=22 delims=" %%a in ('type "%~0"') do (
  set /a m+=1
  call :loop %%a
  echo.
  if !m! equ 11 echo.&echo.&echo.
)
pause>nul&exit
:loop
if "%1"=="" goto :eof
set /a w=%random%%%5+1
set h=!var:~%w%,1!
for /f "tokens=1,2 delims=-" %%a in ("%~1") do (
  for /l %%l in (1 1 %%a) do set /p= <nul
  for /l %%l in (1 1 %%b) do findstr /a:%h% . ●*
)
shift
goto loop
7-1 4-1 14-1 6-4 6-9 12-1 4-1
7-1 4-1 2-1 6-5 2-1 4-1 14-1 12-11
5-1 6-1 4-1 6-1 8-4 14-1 18-1 6-1
5-9 4-1 8-1 4-1 14-1 16-1 2-1 2-1 4-1
3-2 6-1 12-4 2-1 2-2 4-11 4-3 4-3
1-1 2-1 6-1 20-1 21-1 16-1 2-1 4-1 2-1
5-1 6-2 10-9 12-1 2-1 12-4 2-5
5-1 4-1 4-1 16-1 20-1 2-1
5-1 4-1 4-1 10-7 12-1 6-1 10-1 2-1 2-1 4-2
5-1 2-1 8-1 14-1 16-1 10-1 8-1 2-1 4-1 2-1 2-1
5-2 12-1 2-11 2-2 14-2 2-1 4-6 2-1
5-1 6-1 18-1 2-1 2-1 16-1 18-1 4-1
5-1 6-1 10-4 4-1 4-1 14-1 16-1 6-1 4-1
5-9 8-1 4-1 12-9 6-2 6-1 2-1
3-2 6-1 10-11 4-1 6-1 6-1 4-1 2-1 4-3 4-1
3-2 4-1 18-1 4-1 12-1 6-1 6-1 8-3 2-1 6-1
1-1 2-1 4-5 10-1 2-2 4-1 6-1 6-1 6-1 8-1 6-1 0-4
5-1 2-2 6-1 8-3 2-1 2-1 8-9 14-1
5-2 2-1 6-1 4-2 2-1 6-1 18-1 12-11
5-1 4-1 6-1 10-1 4-2 4-1 12-1 22-1
5-1 4-1 6-1 10-3 4-1 2-1 12-1 22-1
5-1 4-5 6-3 10-2 12-1 22-1

--------------------------------------------------------------------------------------------------------
eddf:
怎样用点阵列数字样本显示当前的系统时间,请教高手解答,用批处理实现。以下是点阵列数字样本的批处理文本。

@echo off
cls
echo.
rem  根据黄金分割比,此程序的每个数字的宽乘以高为10×16个点阵列。
color 0E
echo.
echo.
echo.
echo.
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.               ██████████
echo.
echo.
echo.
echo.
echo.               ██████████
echo.               ██████████
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██████████
echo.               ██████████
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.               ██████████
echo.               ██████████
echo.
echo.
echo.
echo.
echo.               ████
echo.               ████
echo.               ████
echo.               ████
echo.
echo.
echo.
echo.               ████
echo.               ████
echo.               ████
echo.               ████
echo.
echo.
echo.
echo.
echo.               ██████████
echo.               ██████████
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██████████
echo.               ██████████
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██████████
echo.               ██████████
echo.
echo.
echo.
echo.
echo.               ██████████
echo.               ██████████
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.               ██████████
echo.               ██████████
echo.               ██
echo.               ██
echo.               ██
echo.               ██
echo.               ██
echo.               ██████████
echo.               ██████████
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██████████
echo.               ██████████
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.               ██████████
echo.               ██████████
echo.               ██
echo.               ██
echo.               ██
echo.               ██
echo.               ██
echo.               ██████████
echo.               ██████████
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.               ██████████
echo.               ██████████
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.               ██    ██
echo.               ██    ██
echo.               ██    ██
echo.               ██    ██
echo.               ██    ██
echo.               ██    ██
echo.               ██    ██
echo.               ██████████
echo.               ██████████
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.               ██████████
echo.               ██████████
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.               ██████████
echo.               ██████████
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.               ██████████
echo.               ██████████
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.               ██████████
echo.               ██████████
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.                               ██
echo.               ██████████
echo.               ██████████
echo.               ██
echo.               ██
echo.               ██
echo.               ██
echo.               ██
echo.               ██████████
echo.               ██████████
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.                       ██
echo.                     ███
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                       ██
echo.                     ████
echo.                     ████
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.
echo.               ██████████
echo.               ██████████
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██            ██
echo.               ██████████
echo.               ██████████
echo.
echo.
echo.
echo.
pause

[日期时间] 批处理日历、时钟3.0版(2010-05-02更新)                    :zcydez
http://www.bathome.net/thread-7077-1-1.html

[ Last edited by zzz19760225 on 2017-12-17 at 14:18 ]
作者: zzz19760225     时间: 2016-6-26 20:12
http://www.cn-dos.net/forum/search.php?searchid=382218&orderby=lastpost&ascdesc=desc&searchsubmit=yes&sid=1zvpF9


bat-zw:

@echo off&color 9f&mode con cols=90 lines=15&setlocal EnableDelayedExpansion
:begin
set tu=★★★★★★★★★★★★★★★■■■■■■■■■■■■■■■
for /l %%a in (1,1,30) do (
    call :delay %%a
)
cls&echo.&echo 原始图案为:%tu%
echo.&echo 注意前面有15个五角星后面有15个方块,等下记得数一下哦!
echo.&echo 为了方便重复练习没有设置退出,要退出请直接关闭窗口。&ping -n 4 127.1 >nul
:choice
cls&echo.&set /p select=请选择(默认回车为1)? (1.从前往后截取 2.从后向前截取)
if "%select%"=="" goto choice1
if "%select%"=="1" goto choice1
if "%select%"=="2" goto choice3
if not "%select%"=="1" goto p
if not "%select%"=="2" goto p
:choice1
cls&echo.&set /p var1=请输入从前面第几位开始截取(请输入0~29内的数字,默认回车为1):
if "%var1%"=="" set var1=1
if %var1% gtr 29 goto p1
:choice2
cls&echo.&set /p var2=请输入往后截取几位(请输入1~30内的数字,默认回车为1):
if "%var2%"=="" set var2=1
if %var2% gtr 30 goto p2
if %var2% lss 1 goto p2
cls&echo.&echo 通过你的输入生成字符截取命令为:%%tu:~%var1%,%var2%%%
echo.&echo 从第%var1%位向后截取%var2%位后的图案为:
echo.&echo !tu:~%var1%,%var2%!&pause
goto begin
:choice3
cls&echo.&set /p var1=请输入从后向前截取几位(请输入1~30内的数字,默认回车为30):
if "%var1%"=="" set var1=30
if %var1% gtr 30 goto p3
if %var1% lss 1 goto p3
:choice4
cls&echo.&set /p var2=请输入丢弃后面几位(请输入0~29内并小于前面输入的数字,默认回车为1):
if "%var2%"=="" set var2=1
if %var2% gtr %var1% goto p4
if %var2% gtr 29 goto p4
cls&echo.&echo 通过你的输入生成字符截取命令为:%%tu:~-%var1%,-%var2%%%
echo.&echo 从后面向前截取%var1%位并丢弃后面%var2%位后的图案为:
echo.&echo !tu:~-%var1%,-%var2%!&pause
goto begin
:p
cls&echo.&echo 数字输入无效,请重新输入!&ping -n 2 127.1 >nul&cls&goto choice
:p1
cls&echo.&echo 数字输入无效,请重新输入!&ping -n 2 127.1 >nul&cls&goto choice1
:p2
cls&echo.&echo 数字输入无效,请重新输入!&ping -n 2 127.1 >nul&cls&goto choice2
:p3
cls&echo.&echo 数字输入无效,请重新输入!&ping -n 2 127.1 >nul&cls&goto choice3
:p4
cls&echo.&echo 数字输入无效,请重新输入!&ping -n 2 127.1 >nul&cls&goto choice4
:delay
cls&echo.&echo 原始图案为:!tu:~0,%1!&ping -n 1 127.1 >nul&cls
goto :eof

[ Last edited by zzz19760225 on 2017-12-6 at 02:45 ]
作者: zzz19760225     时间: 2016-6-26 20:12    标题: 一个微盘下载的文件

http://upload.cn-dos.net/img/2311.zip



/*
* sh.c是UNIX V6下的一个shell解释器实现,源码位于http://minnie.tuhs.org/Archive/P ... research/Dennis_v6/
* UNIX v6是受BSD许可证保护的自由软件,其中sh.c的原作者是Ken Thompson(1943 - )于1971年初步实现,于1975年移植到Unix V6。
* 本人主要工作是对源码进行重新注解,并将K&R C转成ANSI C,除此之外未做任何改动。
* 该文件在gcc-4.4.3下通过编译,但本人不能担保该shell应用于任何交互引起的任何问题。
* 任何人可用作学习、改写或者重新发布等其它用途,请遵循BSD许可协议。
* 最近修订时间:  2013-4-15
* 修订人:  Leo Ma
* 联系方式: begeekmyfriend@gmail.com
*/
#include <stdlib.h>

#define NULL        ((void *)0)

#define        INTR        2        /* 进程终止信号*/
#define        QUIT        3        /* 同上*/

#define LINSIZ 1000        /* 命令参数行缓冲空间*/
#define ARGSIZ 50        /* Token指针列表 */
#define TRESIZ 100        /* 语法树所有节点空间*/

#define QUOTE 0200        /* 引用字符标志位,表明该字符前缀为斜杠或引号,限制字符集为ascii,八进制 */

/* 以下为语法树节点的属性标识,用于DFLG字段*/
#define FAND 1                /* And: 该命令以后台异步进程方式执行*/
#define FCAT 2                /* Catenate: 以追加方式重定向输出,相当于>> 符号*/
#define FPIN 4                /* Pipe in: 命令输入重定向到管道线,即从左子树流入*/
#define FPOU 8                /* Pipe out: 命令输出重定向到管道线,即向右子树流出*/
#define FPAR 16                /* Parentheses: 标识复合命令中最后一个简单命令,即右括弧前的命令。Shell会为每个外部
                                              命令(非内置)fork一个子进程上执行,但复合命令中最后一个子命令仍在原来的进程上执行。*/
#define FINT 32                /* Interrupt: 如果命令是后台异步执行,则忽略进程终止信号。*/
#define FPRS 64                /* Print string: 以字符串的形式打印后台进程的pid */

/* 以下为语法树节点的类型声明,用于DTYP字段 */
#define TCOM 1                /* Command: 简单命令*/
#define TPAR 2                /* Parentheses: 复合命令,包含在圆形括弧中的命令序列集合 */
#define TFIL 3                /* Filter: 过滤器或者管道线,由单独的'|'或'^'符号表示 */
#define TLST 4                /* List: 命令序列,多个简单命令集合,由单独的; 或'&'或'\n'符号分隔 */

/* 以下为语法树节点的各个字段,指定了节点大小*/
#define DTYP 0                /* 节点类型,唯一标识*/
#define DLEF 1                /* 左子树节点,视当前节点的类型而定*/
#define DRIT 2                /* 右子树节点,视当前节点的类型而定*/
#define DFLG 3                /* 节点属性,影响所属命令的状态和执行方式*/
#define DSPR 4                /* 若是复合命令类型,该字段为子语法树节点*/
#define DCOM 5                /* 命令参数字符串 */

#define        ENOMEM        12        /* 命令执行失败,内存空间不足*/
#define        ENOEXEC 8        /* 命令执行失败,找不到可执行文件*/

char        *dolp;                        /* Dollar: 指向以'$'开头的特殊变量*/
char        pidp[6];                        /* 字符串形式存储进程pid */
char        **dolv;                        /* 以空格分隔的命令行参数序列*/
int        dolc;                        /* 命令行参数个数*/
char        *promp;                        /* 输入提示符,不为空即交互模式,为空即非交互模式*/
char        *linep;                        /* 命令参数缓冲指针,存放下一个字符位置*/
char        *elinep;                        /* 命令参数缓冲区末端*/
char        **argp;                        /* Token列表指针,存放下一个token的位置*/
char        **eargp;                        /* Token列表末端*/
int        *treep;                        /* 语法树列表指针,存放下一个节点位置*/
int        *treeend;                /* 语法树列表末端*/
char        peekc;                        /* 预读一个字符缓冲*/
char        gflg;                        /* 两种用途:  列表指针溢出标记,通配符标记*/
char        error;                        /* 错误计数*/
char        acctf;                        /*  */
char        uid;                                /* User id */
char        setintr;                        /* 忽略中断信号标识*/
char        *arginp;                        /* 当存在选项'-c'时,从该指针指向的字串中扫描命令参数*/
int        onelflg;                        /* 当存在选项'-t'时,从标准输入中扫描命令参数*/

/* 中断信号消息列表*/
char        *mesg[] = {
        0,
        "Hangup",
        0,
        "Quit",
        "Illegal instruction",
        "Trace/BPT trap",
        "IOT trap",
        "EMT trap",
        "Floating exception",
        "Killed",
        "Bus error",
        "Memory fault",
        "Bad system call",
        0,
        "Sig 14",
        "Sig 15",
        "Sig 16",
        "Sig 17",
        "Sig 18",
        "Sig 19",
};

/* 记录系统时间*/
struct stime {
        int proct[2];
        int cputim[2];
        int systim[2];
} timeb;

char        line[LINSIZ];                /* 命令参数缓冲区*/
char        *args[ARGSIZ];        /* Token列表缓冲区*/
int        trebuf[TRESIZ];        /* 语法树节点缓冲区*/

void main1();
void word();
char getc();
int *syntax(char **p1, char **p2);
int *syn1(char **p1, char **p2);
int *syn2(char **p1, char **p2);
int *syn3(char **p1, char **p2);
void execute(int *t, int *pf1, int *pf2);
void texec(char *f, int *at);
void err(char *s);
void prs(char *as);
void prn(int n);
void pwait(int i, int *t);
void acct(int *t);
void enacct(char *as);
void put(int c);

/* Shell入口*/
void main(int c, char **av)
{
        int f;
        char *acname, **v;

        for(f=2; f<15; f++)                /* close_on_exec,因为shell可能来自外部进程或自身fork */
                close(f);
        if((f=dup(1)) != 2)                /* 将stdout重定向到stderr,dup()将返回尚未打开的最小文件句柄*/
                close(f);
        dolc = getpid();                        /* 记录当前进程pid */
        for(f=4; f>=0; f--) {
                pidp[f] = dolc%10+'0';                /* itoa */
                dolc = dolc/10;
        }
        v = av;
        acname = "/usr/adm/sha";                /* SHA加密序列,目前Unix版本已废弃*/
        promp = "% ";                        /* 普通用户交互提示符*/
        if(((uid = getuid())&0377) == 0)
                promp = "# ";                                /* root用户交互提示符*/
        acctf = open(acname, 1);
        if(c > 1) {
                promp = 0;        /* 进入非交互模式*/
                if (*v[1]=='-') {        /* 存在选项*/
                        **v = '-';                /* 用第一个序列字符临时标记*/
                        if (v[1][1]=='c' && c>2)                /* '-c'选项,从arginp中扫描*/
                                arginp = v[2];
                        else if (v[1][1]=='t')                /* '-t'选项,从stdin中扫描*/
                                onelflg = 2;
                } else {                /* 直接从命令文件中扫描*/
                        close(0);
                        f = open(v[1], 0);                /* 重定向stdin到文件*/
                        if(f < 0) {
                                prs(v[1]);
                                err(": cannot open");
                        }
                }
        }
        if(**v == '-') {
                setintr++;                /* 非交互模式下带选项,则初始化忽略所有信号*/
                signal(QUIT, 1);
                signal(INTR, 1);
        }
        dolv = v+1;
        dolc = c-1;

loop:         /* 每次loop执行一次shell语句解释,直到遇上换行符,无限循环除非整个shell进程终止 */
        if(promp != 0)
                prs(promp);                /* 打印交互提示符*/
        peekc = getc();                /* 对于I/O流,预读一个字符,以便将来再次读取*/
        main1();                                /* 进入解释器 */
        goto loop;
}

/*
* 该函数包含一次shell交互的整个解释过程
* Preprocessor: 对输入的命令参数进行预处理
* Lexical scanning: 对命令参数进行词法分析,分割成token列表
* Syntax parser: 构建语法树
* Semantic analyzer: 设置语法树节点属性,I/O等
* Executor: 为每个命令分配进程并执行
*/
void main1()
{
        char c, *cp;
        int *t;

        argp = args;
        eargp = args+ARGSIZ-5;        /* 初始化token列表*/
        linep = line;
        elinep = line+LINSIZ-5;        /* 初始化命令参数缓冲区*/
        error = 0;                     /* 错误计数清零*/
        gflg = 0;                      /* 溢出标志位清零*/
        do {
                cp = linep;
                word();
        } while(*cp != '\n');          /* 扫描所有命令参数,生成token列表,遇上换行符终止*/
        treep = trebuf;
        treeend = &trebuf[TRESIZ];     /* 语法树缓冲区清零*/
        if(gflg == 0) {
                if(error == 0) {
                        setexit();
                        if (error)
                                return;
                        t = syntax(args, argp);        /* Scanner没有发生缓冲溢出,没有错误计数,对token列表建立语法树 */
                }
                if(error != 0)
                        err("syntax error"); else                 /* 语法分析发生错误,提示并退出shell */
                        execute(t, NULL, NULL);        /* 没有错误计数,从根节点开始进行语义分析 */
        }
}

/*
* 对命令参数扫描并分割token
* readc直接从流中读取一个字符,getc对前者的字符进行预处理
*/
void word()
{
        char c, c1;

        *argp++ = linep;         /* 将当前命令参数作为一个token放入列表,以'\0'结束,argp指向下一个token位置 */

loop:
        switch(c = getc()) {

        case ' ':
        case '\t':
                goto loop;         /* 过滤空格和tab字符 */

        case '\'':
        case '"':
                c1 = c;
                while((c=readc()) != c1) {         /* 多读一个字符,判断是否成对(如引号) */
                        if(c == '\n') {
                                error++;         /* 引用未结束遇上换行符,错误计数 */
                                peekc = c;         /* 推回预读字符 */
                                return;
                        }
                        *linep++ = c|QUOTE; /* 加上引用标识 */
                }
                goto pack; /* 引用结束,跳转至pack */

        case '&':
        case ';':
        case '<':
        case '>':
        case '(':
        case ')':
        case '|':
        case '^':
        case '\n':
                *linep++ = c;
                *linep++ = '\0';         /* 元字符等特殊字符单独作为一个token返回 */
                return;
        }

        peekc = c;         /* 若为普通字符,推回预读 */

pack:
        for(;;) {
                c = getc();
                if(any(c, " '\"\t;&<>()|^\n")) {         /* 遇上元字符、分隔符等特殊字符 */
                        peekc = c;         /* 推回预读字符 */
                        if(any(c, "\"'"))
                                goto loop;         /* 遇上引用字符,跳转到loop继续扫描 */
                        *linep++ = '\0';         /* 分割一个token出来 */
                        return;
                }
                *linep++ = c;
        }
}

/* 分配一个语法树节点,大小根据n指定,为n*4字节 */
int* tree(int n)
{
        int *t;

        t = treep;
        treep += n;
        if (treep>treeend) {
                prs("Command line overflow\n"); /* 空间不足 */
                error++;
                reset();
        }
        return(t);
}

/*
* 读取一个字符,并做一些预处理
* 1.从预读缓存中读取
* 2.从流中直接读取
*/
char getc()
{
        char c;

        if(peekc) {
                c = peekc;         /* 如果有预读缓存,读取缓存并返回 */
                peekc = 0;         /* 清除预读缓存 */
                return(c);
        }
        if(argp > eargp) {         /* Token列表溢出 */
                argp -= 10;
                while((c=getc()) != '\n'); /* 取完换行符前所有字符 */
                argp += 10;
                err("Too many args");
                gflg++;
                return(c);
        }
        if(linep > elinep) { /* 命令参数缓存溢出 */
                linep -= 10;
                while((c=getc()) != '\n'); /* 取完换行符之前所有字符 */
                linep += 10;
                err("Too many characters");
                gflg++;
                return(c);
        }
getd:
        if(dolp) {         /* 存在带'$'前缀的命令参数字符 */
                c = *dolp++;
                if(c != '\0')
                        return(c);
                dolp = 0;         /* 带'$'前缀的参数扫描完毕,dolp清零 */
        }
        c = readc(); /* 从流中读取一个字符 */       
        if(c == '\\') {
                c = readc();         /* 遇到转义符,继续读取下一个字符 */
                if(c == '\n')
                        return(' ');         /* 斜杠在行末,返回空格接续下一行 */
                return(c|QUOTE);         /* 引用该字符 */
        }
        if(c == '$') {
                c = readc();         /* 遇到'$',继续读取一个字符 */
                if(c>='0' && c<='9') {         /* 位置变量 */
                        if(c-'0' < dolc)         /* 位置参数在合法范围内 */
                                dolp = dolv[c-'0'];         /* dolp指向替代的命令参数字符 */
                        goto getd;         /* 跳转getd处理 */
                }
                if(c == '$') {         /* 当前进程pid */
                        dolp = pidp;         /* dolp指向之前记录的pid字符串 */
                        goto getd;         /* 跳转getd处理 */
                }
        }
        return(c&0177);         /* 普通字符直接返回,限定在ascii */
}

/*
* 从流中读取一个字符
* arginp!=NULL(onelflg==0):带"-c"选项,从后面附加的字符串中扫描
* arginp==1(oneflg==0):带"-c"选项,扫描终止,退出shell进程
* onelflg==2(arginp==NULL): 带"-t"选项,从stdin中扫描
* onelflg==1(arginp==NULL): 带"-t"选项,扫描终止,退出shell进程
*/
int readc()
{
        char cc;
        int c;

        if (arginp) { /* "-c"选项 */
                if (arginp == (void *)1)
                        exit(-1);         /* 没有新的命令参数,退出shell进程 */
                if ((c = *arginp++) == 0) {
                        arginp = (void *)1;         /* 扫描终止 */
                        c = '\n';         /* 追加换行符返回 */
                }
                return(c);
        }
        if (onelflg==1)
                exit(0); /* "-t"选项,扫描终止,退出shell进程 */
        if(read(0, &cc, 1) != 1) /* 从标准输入中读取一个字符 */
                exit(-1);
        if (cc=='\n' && onelflg)         /* onelflg == 2,"-t"选项 */
                onelflg--;         /* 扫描一行完毕 */
        return(cc);
}

/*
* syntax
*        empty
*        syn1
*
* 从这里开始构建语法树,遍历之前扫描生成的token列表
* p1指向token列表头部,p2指向token列表末尾的下一个
* 自顶向下三级结构: syn1、syn2、syn3,函数调用关系如下
* 1.左子树:左边列表递进一层
* 2.右子树:右边列表回溯或者递归
* 3.找不到符号:所有列表递进一层
* 4.生成节点:直接返回
*/
int *syntax(char **p1, char **p2)
{

        while(p1 != p2) {
                if(any(**p1, ";&\n"))        /* 列表前缀为命令序列分隔字符,过滤掉该token,对syntax回溯中碰到*/
                        p1++; else
                        return(syn1(p1, p2));        /* 所有列表递进一层至syn1 */
        }
        return(0);
}

/*
* syn1
*        syn2
*        syn2 & syntax
*        syn2 ; syntax
*
* syn1生成命令序列节点,查找分隔符,
* 自顶向下生成左子树,回溯生成右子树。
* p1指向token列表头部,p2指向token列表末尾的下一个。
*/
int *syn1(char **p1, char **p2)
{
        char **p;
        int *t, *t1;
        int l;

        l = 0;
        for(p=p1; p!=p2; p++)
        switch(**p) {

        case '(':
                l++;
                continue;        /* 此处等同于break */

        case ')':
                l--;
                if(l < 0)
                        error++;
                continue;

        case '&':
        case ';':
        case '\n':
                if(l == 0) { /* 没有圆括弧嵌套 */
                        l = **p;
                        t = tree(4);
                        t[DTYP] = TLST;        /* 生成命令序列节点*/
                        t[DLEF] = (int)syn2(p1, p);        /* 左边列表递进一层生成左子树节点*/
                        t[DFLG] = 0;  /* 命令序列节点不设置任何标志位*/
                        if(l == '&') {
                                t1 = (int *)t[DLEF];
                                t1[DFLG] |= FAND|FPRS|FINT;        /* 若有后台进程,其属性下推到左子树节点*/
                        }
                        t[DRIT] = (int)syntax(p+1, p2);        /* 右边列表回溯到syntax生成右子树节点*/
                        return(t);
                }
        }
        if(l == 0)
                return(syn2(p1, p2));        /* 没有找到命令分隔符,所有列表递进一层至syn2 */
        error++;                /* 如果嵌套不归零发生错误*/
}

/*
* syn2
*        syn3
*        syn3 | syn2
*
* syn2负责构建管道线节点,搜索管道线符号,
* 自顶向下生成左子树,递归生成右子树。
* p1指向token列表头部,p2指向token列表末尾的下一个。
*/
int *syn2(char **p1, char **p2)
{
        char **p;
        int l, *t;

        l = 0;
        for(p=p1; p!=p2; p++)
        switch(**p) {

        case '(':
                l++;
                continue;        /* 此处等同于break */

        case ')':
                l--;
                continue;

        case '|':
        case '^':
                if(l == 0) { /* 没有圆括弧嵌套 */
                        t = tree(4);
                        t[DTYP] = TFIL;        /* 建立管道线节点*/
                        t[DLEF] = (int)syn3(p1, p);        /* 左边列表递进一层生成左子树节点*/
                        t[DRIT] = (int)syn2(p+1, p2);        /* 右边递归生成右子树节点*/
                        t[DFLG] = 0;        /* 标志位继承自上层节点*/
                        return(t);
                }
        }
        return(syn3(p1, p2));        /* 没有找到管道线,所有列表递进一层,不需要判断嵌套是否归零*/
}

/*
* syn3
*        ( syn1 ) [ < in  ] [ > out ]
*        word word* [ < in ] [ > out ]
*
* syn3负责构建复合命令和简单命令节点,前者以圆括号标记,括号内所有token列表回溯至syn1构建子命令节点;
* 简单命令是语法树叶子,其左右子树节点为I/O重定向文件,并存储命令参数字符串,生成节点后直接返回。
* p1指向token列表头部,p2指向token列表末尾的下一个。
*/
int *syn3(char **p1, char **p2)
{
        char **p;
        char **lp, **rp;
        int *t;
        int n, l, i, o, c, flg;

        flg = 0;
        if(**p2 == ')')
                flg |= FPAR;        /* 复合命令中最后一个子命令不需要fork子进程*/
        lp = 0;        /* 子命令开头*/
        rp = 0;        /* 子命令末尾*/
        i = 0;        /* 输入文件路径*/
        o = 0;        /* 输出文件路径*/
        n = 0;        /* 字符计数*/
        l = 0;        /* 嵌套层数*/
        for(p=p1; p!=p2; p++)
        switch(c = **p) {

        case '(':
                if(l == 0) {
                        if(lp != 0)
                                error++;
                        lp = p+1;        /* 当前嵌套最外层,lp指向子命令第一个字符*/
                }
                l++;
                continue;        /* 同break */

        case ')':
                l--;
                if(l == 0)
                        rp = p;        /* 当前嵌套最外层,rp指向子命令后面的')' */
                continue;

        case '>':
                p++;
                if(p!=p2 && **p=='>')        /* 追加模式FCAT标识*/
                        flg |= FCAT; else
                        p--;
/* 注意这里没有break,继续往下走*/
        case '<':
                if(l == 0) {
                        p++;
                        if(p == p2) {
                                error++;         /* 后面没有字符,发生错误 */
                                p--;
                        }
                        if(any(**p, "<>("))         /* 非法字符 */
                                error++;
                        if(c == '<') {
                                if(i != 0)
                                        error++;
                                i = (int)*p;        /* 重定向到输入文件,只对简单命令有效*/
                                continue;
                        }
                        if(o != 0)
                                error++;
                        o = (int)*p;        /* 重定向到输出文件,只对简单命令有效*/
                }
                continue;

        default:
                if(l == 0)
                        p1[n++] = *p;        /* 命令参数前移清除以往记录,并用n计数*/
        }
        if(lp != 0) {
                if(n != 0)
                        error++;                /* 复合命令,n必须为0 */
                t = tree(5);
                t[DTYP] = TPAR;        /* 分配复合命令类型节点*/
                t[DSPR] = (int)syn1(lp, rp);        /* 括号内所有token列表回溯至syn1构建子命令节点 */
                goto out;
        }
        if(n == 0)
                error++;                /* 简单命令,n必须不为0 */
        p1[n++] = 0;                /* 字符串结束*/
        t = tree(n+5);        /* 分配简单命令节点,大小为5个字段(DSPR字段为空)加上命令字符数*/
        t[DTYP] = TCOM;
        for(l=0; l<n; l++)
                t[l+DCOM] = (int)p1[l];
out:
        t[DFLG] = flg;        /* 固有属性或者继承自上层节点属性*/
        t[DLEF] = i;        /* 对于简单命令,左右子树是重定向的I/O文件*/
        t[DRIT] = o;        /* 对于复合命令,左右子树为空*/
        return(t);
}

/* 用函数指针f扫描所有字符 */
void scan(int *at, int (*f)())
{
        char *p, c;
        int *t;

        t = at+DCOM;
        while(p = (char *)*t++)
                while(c = *p)
                        *p++ = (*f)(c);
}

/* 查找通配符*/
int tglob(int c)
{

        if(any(c, "[?*"))
                gflg = 1;  
        return(c);
}

/* 解除引用标识*/
int trim(int c)
{

        return(c&0177);
}

/*
* 该函数从根节点开始深度优先遍历整个语法树,为每个命令创建进程并执行
* pf1和pf2是管道线I/O句柄,pf1表示命令输入端,pf2表示命令输出端
* pf1[0]: 管道线输入端句柄
* pf1[1]: 闲置
* pf2[0]: 闲置
* pf2[1]: 管道线输出端句柄
*/
void execute(int *t, int *pf1, int *pf2)
{
        int i, f, pv[2];
        int *t1;
        char *cp1, *cp2;
        extern int errno;

        if(t != 0)
        switch(t[DTYP]) {

        case TCOM:
                cp1 = (char *)t[DCOM];
                /* 以下为内置命令*/
                if(equal(cp1, "chdir")) {
                        if(t[DCOM+1] != 0) {
                                if(chdir(t[DCOM+1]) < 0)
                                        err("chdir: bad directory");
                        } else
                                err("chdir: arg count");
                        return;
                }
                if(equal(cp1, "shift")) {
                        if(dolc < 1) {
                                prs("shift: no args\n");
                                return;
                        }
                        dolv[1] = dolv[0];
                        dolv++;
                        dolc--;
                        return;
                }
                if(equal(cp1, "login")) {
                        if(promp != 0) {
                                close(acctf);
                                execv("/bin/login", t+DCOM);
                        }
                        prs("login: cannot execute\n");
                        return;
                }
                if(equal(cp1, "newgrp")) {
                        if(promp != 0) {
                                close(acctf);
                                execv("/bin/newgrp", t+DCOM);
                        }
                        prs("newgrp: cannot execute\n");
                        return;
                }
                if(equal(cp1, "wait")) {
                        pwait(-1, 0);
                        return;
                }
                if(equal(cp1, ":"))
                        return;
/* 注意,这里没有break,筛选掉内置命令后,外部命令会继续往下走*/
        case TPAR:
                f = t[DFLG];
                i = 0;
                if((f&FPAR) == 0)        /* 除了复合命令中最后一个子命令,其它一律fork子进程*/
                        i = fork();
                if(i == -1) {
                        err("try again");
                        return;
                }
                if(i != 0) {        /* 父进程代码*/
                        if((f&FPIN) != 0) {
                                close(pf1[0]);        /* fork之后,子进程获得父进程的管道线句柄拷贝,我们要在父进程中关闭它,以免资源泄漏*/
                                close(pf1[1]); /* 注意,这里只关闭pf1,因为pf1、pf2都是pv的镜像,因此关闭pf1就是关闭pf2 */
                        }
                        if((f&FPRS) != 0) {/* 打印子进程pid */
                                prn(i);
                                prs("\n");
                        }
                        if((f&FAND) != 0)        /* 后台异步进程无需等待*/
                                return;
                        if((f&FPOU) == 0)        /* 节点为管道线末端,等待子进程终止*/
                                pwait(i, t);
                        return;
                }
/* 以下为子进程代码,或者FPAR属性节点命令进程*/
                if(t[DLEF] != 0) {
                        close(0);
                        i = open(t[DLEF], 0);        /* 重定向stdin到左子树节点*/
                        if(i < 0) {
                                prs((char *)t[DLEF]);
                                err(": cannot open");
                                exit(-1);
                        }
                }
                if(t[DRIT] != 0) {
                        if((f&FCAT) != 0) {
                                i = open(t[DRIT], 1);
                                if(i >= 0) {
                                        seek(i, 0, 2);                /* 追加模式*/
                                        goto f1;
                                }
                        }
                        i = creat(t[DRIT], 0666);        /* 创建新的文件句柄*/
                        if(i < 0) {
                                prs((char *)t[DRIT]);
                                err(": cannot create");
                                exit(-1);
                        }
                f1:
                        close(1);
                        dup(i);                /* 重定向stdout到右子树节点*/
                        close(i);
                }
                if((f&FPIN) != 0) {
                        close(0);
                        dup(pf1[0]);        /* 重定向stdin到管道线输入端*/
                        close(pf1[0]);
                        close(pf1[1]);        /* 子进程关闭管道线句柄*/
                }
                if((f&FPOU) != 0) {
                        close(1);
                        dup(pf2[1]);        /* 重定向stdout  到管道线输出*/
                        close(pf2[0]);
                        close(pf2[1]);        /* 子进程关闭管道线句柄*/  
                }
                if((f&FINT)!=0 && t[DLEF]==0 && (f&FPIN)==0) {
                        close(0);        /* 若忽略中断,且不存在管道线输入,则关闭stdin并重定向到位桶*/
                        open("/dev/null", 0);        /* 以免来自其它进程stdin干扰,但stdout是保留的*/
                }
                if((f&FINT) == 0 && setintr) {
                        signal(INTR, 0);        /* 无FINT标识,则恢复中断信号响应(默认是忽略的) */
                        signal(QUIT, 0);
                }
                if(t[DTYP] == TPAR) {        /* 如果是复合类型,则执行子命令,同时下推FINT标识*/
                        if(t1 = (int *)t[DSPR])
                                t1[DFLG] |= f&FINT;
                        execute(t1, NULL, NULL);
                        exit(0);
                }
                close(acctf);
                gflg = 0;
                scan(t, &tglob);        /* 扫描通配符*/
                if(gflg) {
                        t[DSPR] = (int)"/etc/glob";
                        execv(t[DSPR], t+DSPR);        /* 包含通配符的命令在/etc/glob中执行*/
                        prs("glob: cannot execute\n");
                        exit(-1);
                }
                scan(t, &trim);        /* 解除引用标识*/
                *linep = 0;
                texec((char *)t[DCOM], t);        /* 最先执行当前目录下的命令*/
                cp1 = linep;
                cp2 = "/usr/bin/";
                while(*cp1 = *cp2++)         /* strcpy,cp1停在'\0'位置 */
                        cp1++;
                cp2 = (char *)t[DCOM];
                while(*cp1++ = *cp2++);         /* strcpy,'\0'结束 */
                texec(linep+4, t);        /* 接着执行/bin目录下的命令*/
                texec(linep, t);        /* 最后执行/usr/bin目录下的命令*/
                prs((char *)t[DCOM]);         /* 若进程异常退出,表示找不到命令,退出shell */
                err(": not found");
                exit(-1);

        case TFIL:
                f = t[DFLG];
                pipe(pv);        /* 创建管道线,pv[0]为输入句柄,pv[1]为输出句柄*/
                t1 = (int *)t[DLEF];
                t1[DFLG] |= FPOU | (f&(FPIN|FINT|FPRS));
                execute(t1, pf1, pv);        /* 对于左子树节点,pv[1]作为管道线输出句柄传入,pv[0]闲置*/
                t1 = (int *)t[DRIT];
                t1[DFLG] |= FPIN | (f&(FPOU|FINT|FAND|FPRS));        /* 只有管道线末端命令才能继承FAND属性,与FPOU排斥*/
                execute(t1, pv, pf2);        /* 对于右子树节点,pv[0]作为管道线输入句柄传入,pv[1]闲置*/
                return;

        case TLST:
                f = t[DFLG]&FINT;                /* 对于命令序列节点,下推FINT属性到左右子树*/
                if(t1 = (int *)t[DLEF])
                        t1[DFLG] |= f;
                execute(t1, NULL, NULL);                 /* 先左后右依次执行 */
                if(t1 = (int *)t[DRIT])
                        t1[DFLG] |= f;
                execute(t1, NULL, NULL);
                return;

        }
}

/*
* 执行命令
* f为可执行文件路径
* at为语法树节点
*/
void texec(char *f, int *at)
{
        extern int errno;
        int *t;

        t = at;
        execv(f, t+DCOM);        /* 重新加载并执行命令,不需要设置环境*/
        if (errno==ENOEXEC) {
                if (*linep)
                        t[DCOM] = (int)linep;
                t[DSPR] = (int)"/bin/sh";
                execv(t[DSPR], t+DSPR);        /* 找不到命令可执行文件*/
                prs("No shell!\n");
                exit(-1);
        }
        if (errno==ENOMEM) {
                prs((char *)t[DCOM]);
                err(": too large");        /* 内存不足*/
                exit(-1);
        }
}

/* 打印错误,非交互模式则清空stdin缓存并退出shell进程*/
void err(char *s)
{
        prs(s);
        prs("\n");
        if(promp == 0) {
                seek(0, 0, 2);
                exit(-1);
        }
}

/* 打印字符串*/
void prs(char *as)
{
        char *s;

        s = as;
        while(*s)
                put(*s++);
}

/* 输出一个字符*/
void put(int c)
{

        write(2, &c, 1);
}

/* itoa */
void prn(int n)
{
        int a;

        if(a=n/10)
                prn(a);
        put(n%10+'0');
}

/* 字符串中是否包含某个字符*/
int any(int c, char *as)
{
        char *s;

        s = as;
        while(*s)
                if(*s++ == c)
                        return(1);
        return(0);
}

/* 字符串比较*/
int equal(char *as1, char *as2)
{
        char *s1, *s2;

        s1 = as1;
        s2 = as2;
        while(*s1++ == *s2)
                if(*s2++ == '\0')
                        return(1);
        return(0);
}

/*
* 父进程等待子进程终止
* i为子进程pid,-1表示等待所有子进程
* t为语法树节点
*/
void pwait(int i, int *t)
{
        int p, e;
        int s;

        if(i != 0)
        for(;;) {
                times(&timeb);
                time(timeb.proct);
                p = wait(&s);
                if(p == -1)         /* 等待失败 */
                        break;
                e = s&0177;         /* 保留状态环境 */
                if(mesg[e] != 0) {         /* 子进程异常终止 */
                        if(p != i) {
                                prn(p);
                                prs(": ");
                        }
                        prs(mesg[e]);         /* 打印对应的消息 */
                        if(s&0200)         /* 内核奔溃 */
                                prs(" -- Core dumped");
                }
                if(e != 0)
                        err("");         /* 等待正常终止 */
                if(i == p) {
                        acct(t);
                        break;
                } else
                        acct(0);
        }
}

void acct(int *t)
{
        if(t == 0)
                enacct("**gok"); else
        if(*t == TPAR)
                enacct("()"); else
        enacct((char *)t[DCOM]);
}

void enacct(char *as)
{
        struct stime timbuf;
        struct {
                char cname[14];
                char shf;
                char uid;
                int datet[2];
                int realt[2];
                int bcput[2];
                int bsyst[2];
        } tbuf;
        int i;
        char *np, *s;

        s = as;
        times(&timbuf);
        time(timbuf.proct);
        lsub(tbuf.realt, timbuf.proct, timeb.proct);
        lsub(tbuf.bcput, timbuf.cputim, timeb.cputim);
        lsub(tbuf.bsyst, timbuf.systim, timeb.systim);
        do {
                np = s;
                while (*s != '\0' && *s != '/')
                        s++;
        } while (*s++ != '\0');
        for (i=0; i<14; i++) {
                tbuf.cname = *np;
                if (*np)
                        np++;
        }
        tbuf.datet[0] = timbuf.proct[0];
        tbuf.datet[1] = timbuf.proct[1];
        tbuf.uid = uid;
        tbuf.shf = 0;
        if (promp==0)
                tbuf.shf = 1;
        seek(acctf, 0, 2);
        write(acctf, &tbuf, sizeof(tbuf));
}

[ Last edited by zzz19760225 on 2016-12-11 at 00:32 ]