sre编译
① 关于C语言的一个程序~~~出现了几个错误但是我不会改,请高手帮帮忙
楼上那答案我无语。。。您是学编程的么?
下面正题!!
大佬,我服您了,一学期课看来您连半学期都没听过。。。成哥也太放纵你了。。。
错误一:srelen()函数用来计算字符串长度,你用它来做什么?而且前面取非,请明示。PS:(IF等逻辑语句最好用“{}”括起来有效语句,咱的编译器不至于因为几个符号撑爆了)
错误二:malloc函数不是那么用嘀~~~~多的也不给你讲了,给你个现成的:temp
=
(People
*)malloc(sizeof(People));。
错误三:拜托下次写代码认真些,既然定义的结构体用大写了,为什么后面就忘了呢?看看自己那结构体定义吧,里面的那个指针节点,你用的是“struct
People
*next”么?
其他的都是由于错误三导致的,如果还运行不过去你再贴上来吧,哥答辩通过,明天就走了,剩下的就只有祝你好运了
最后劝你一句:C语言假期好好看看吧,就你现在这水平,下学期比挂两科(c++,数据库)!
② sre是什么意思
SRE是指Site Reliability Engineer (网站可靠性工程师)。他是软件工程师和系统管理员的结合,一个SRE工程师基本上需要掌握很多知识:算法,数据结构,编程能力,网络编程,分布式系统,可扩展架构,故障排除。
SRE起源于国外大型互联网公司,直接掌管着互联网公司的机器和服务,保证网站不宕机是他们的使命。SRE基本是从软件研发工程师转型,有很强的编程算法能力,同时具备系统管理员的技能,熟悉网络架构等,是一个要求非常高的职业。
工作内容
1、 指导程序员的工作。
2、 参与软件工程系统的设计、开发、测试等过程。
3 、协助工程管理人保证项目的质量。
4 、负责工程中主要功能的代码实现。
5 、解决工程中的关键问题和技术难题。
6 、协调各个程序员的工作,并能与其它软件工程师协作工作。
7、还要编写各种各样的软件说明书,如:需求说明书,概要说明书等。
8、考试科目工程师是中级职称,考试的题目包括了计算机体系结构、软件工程、数据库、数据结构、编译原理等计算机学科的基础课程。
③ 关于汇编语言~~
在关于汇编语言2~~中已作说明,改了那两个错误就可以了,要是还有问题,给我发消息吧。
④ python 常用的系统函数有哪些
1.常用内置函数:(不用import就可以直接使用)
help(obj) 在线帮助, obj可是任何类型
callable(obj) 查看一个obj是不是可以像函数一样调用
repr(obj) 得到obj的表示字符串,可以利用这个字符串eval重建该对象的一个拷贝
eval_r(str) 表示合法的python表达式,返回这个表达式
dir(obj) 查看obj的name space中可见的name
hasattr(obj,name) 查看一个obj的name space中是否有name
getattr(obj,name) 得到一个obj的name space中的一个name
setattr(obj,name,value) 为一个obj的name space中的一个name指向vale这个object
delattr(obj,name) 从obj的name space中删除一个name
vars(obj) 返回一个object的name space。用dictionary表示
locals() 返回一个局部name space,用dictionary表示
globals() 返回一个全局name space,用dictionary表示
type(obj) 查看一个obj的类型
isinstance(obj,cls) 查看obj是不是cls的instance
issubclass(subcls,supcls) 查看subcls是不是supcls的子类
类型转换函数
chr(i) 把一个ASCII数值,变成字符
ord(i) 把一个字符或者unicode字符,变成ASCII数值
oct(x) 把整数x变成八进制表示的字符串
hex(x) 把整数x变成十六进制表示的字符串
str(obj) 得到obj的字符串描述
list(seq) 把一个sequence转换成一个list
tuple(seq) 把一个sequence转换成一个tuple
dict(),dict(list) 转换成一个dictionary
int(x) 转换成一个integer
long(x) 转换成一个long interger
float(x) 转换成一个浮点数
complex(x) 转换成复数
max(...) 求最大值
min(...) 求最小值
用于执行程序的内置函数
complie 如果一段代码经常要使用,那么先编译,再运行会更快。
2.和操作系统相关的调用
系统相关的信息模块 import sys
sys.argv是一个list,包含所有的命令行参数.
sys.stdout sys.stdin sys.stderr 分别表示标准输入输出,错误输出的文件对象.
sys.stdin.readline() 从标准输入读一行 sys.stdout.write("a") 屏幕输出a
sys.exit(exit_code) 退出程序
sys.moles 是一个dictionary,表示系统中所有可用的mole
sys.platform 得到运行的操作系统环境
sys.path 是一个list,指明所有查找mole,package的路径.
操作系统相关的调用和操作 import os
os.environ 一个dictionary 包含环境变量的映射关系 os.environ["HOME"] 可以得到环境变量HOME的值
os.chdir(dir) 改变当前目录 os.chdir('d:\\outlook') 注意windows下用到转义
os.getcwd() 得到当前目录
os.getegid() 得到有效组id os.getgid() 得到组id
os.getuid() 得到用户id os.geteuid() 得到有效用户id
os.setegid os.setegid() os.seteuid() os.setuid()
os.getgruops() 得到用户组名称列表
os.getlogin() 得到用户登录名称
os.getenv 得到环境变量
os.putenv 设置环境变量
os.umask 设置umask
os.system(cmd) 利用系统调用,运行cmd命令
操作举例:
os.mkdir('/tmp/xx') os.system("echo 'hello' > /tmp/xx/a.txt") os.listdir('/tmp/xx')
os.rename('/tmp/xx/a.txt','/tmp/xx/b.txt') os.remove('/tmp/xx/b.txt') os.rmdir('/tmp/xx')
用python编写一个简单的shell
#!/usr/bin/python
import os, sys
cmd = sys.stdin.readline()
while cmd:
os.system(cmd)
cmd = sys.stdin.readline()
用os.path编写平台无关的程序
os.path.abspath("1.txt") == os.path.join(os.getcwd(), "1.txt")
os.path.split(os.getcwd()) 用于分开一个目录名称中的目录部分和文件名称部分。
os.path.join(os.getcwd(), os.pardir, 'a', 'a.doc') 全成路径名称.
os.pardir 表示当前平台下上一级目录的字符 ..
os.path.getctime("/root/1.txt") 返回1.txt的ctime(创建时间)时间戳
os.path.exists(os.getcwd()) 判断文件是否存在
os.path.expanser('~/dir') 把~扩展成用户根目录
os.path.expandvars('$PATH') 扩展环境变量PATH
os.path.isfile(os.getcwd()) 判断是否是文件名,1是0否
os.path.isdir('c:\Python26\temp') 判断是否是目录,1是0否
os.path.islink('/home/huaying/111.sql') 是否是符号连接 windows下不可用
os.path.ismout(os.getcwd()) 是否是文件系统安装点 windows下不可用
os.path.samefile(os.getcwd(), '/home/huaying') 看看两个文件名是不是指的是同一个文件
os.path.walk('/home/huaying', test_fun, "a.c")
遍历/home/huaying下所有子目录包括本目录,对于每个目录都会调用函数test_fun.
例:在某个目录中,和他所有的子目录中查找名称是a.c的文件或目录。
def test_fun(filename, dirname, names): //filename即是walk中的a.c dirname是访问的目录名称
if filename in names: //names是一个list,包含dirname目录下的所有内容
print os.path.join(dirname, filename)
os.path.walk('/home/huaying', test_fun, "a.c")
文件操作
打开文件
f = open("filename", "r") r只读 w写 rw读写 rb读二进制 wb写二进制 w+写追加
读写文件
f.write("a") f.write(str) 写一字符串 f.writeline() f.readlines() 与下read类同
f.read() 全读出来 f.read(size) 表示从文件中读取size个字符
f.readline() 读一行,到文件结尾,返回空串. f.readlines() 读取全部,返回一个list. list每个元素表示一行,包含"\n"\
f.tell() 返回当前文件读取位置
f.seek(off, where) 定位文件读写位置. off表示偏移量,正数向文件尾移动,负数表示向开头移动。
where为0表示从开始算起,1表示从当前位置算,2表示从结尾算.
f.flush() 刷新缓存
关闭文件
f.close()
regular expression 正则表达式 import re
简单的regexp
p = re.compile("abc") if p.match("abc") : print "match"
上例中首先生成一个pattern(模式),如果和某个字符串匹配,就返回一个match object
除某些特殊字符metacharacter元字符,大多数字符都和自身匹配。
这些特殊字符是 。^ $ * + ? { [ ] \ | ( )
字符集合(用[]表示)
列出字符,如[abc]表示匹配a或b或c,大多数metacharacter在[]中只表示和本身匹配。例:
a = ".^$*+?{\\|()" 大多数metachar在[]中都和本身匹配,但"^[]\"不同
p = re.compile("["+a+"]")
for i in a:
if p.match(i):
print "[%s] is match" %i
else:
print "[%s] is not match" %i
在[]中包含[]本身,表示"["或者"]"匹配.用
和
表示.
^出现在[]的开头,表示取反.[^abc]表示除了a,b,c之外的所有字符。^没有出现在开头,即于身身匹配。
-可表示范围.[a-zA-Z]匹配任何一个英文字母。[0-9]匹配任何数字。
\在[]中的妙用。
\d [0-9]
\D [^0-9]
\s [ \t\n\r\f\v]
\S [^ \t\n\r\f\v]
\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\t 表示和tab匹配, 其他的都和字符串的表示法一致
\x20 表示和十六进制ascii 0x20匹配
有了\,可以在[]中表示任何字符。注:单独的一个"."如果没有出现[]中,表示出了换行\n以外的匹配任何字符,类似[^\n].
regexp的重复
{m,n}表示出现m个以上(含m个),n个以下(含n个). 如ab{1,3}c和abc,abbc,abbbc匹配,不会与ac,abbbc匹配。
m是下界,n是上界。m省略表下界是0,n省略,表上界无限大。
*表示{,} +表示{1,} ?表示{0,1}
最大匹配和最小匹配 python都是最大匹配,如果要最小匹配,在*,+,?,{m,n}后面加一个?.
match object的end可以得到匹配的最后一个字符的位置。
re.compile("a*").match('aaaa').end() 4 最大匹配
re.compile("a*?").match('aaaa').end() 0 最小匹配
使用原始字符串
字符串表示方法中用\\表示字符\.大量使用影响可读性。
解决方法:在字符串前面加一个r表示raw格式。
a = r"\a" print a 结果是\a
a = r"\"a" print a 结果是\"a
使用re模块
先用re.compile得到一个RegexObject 表示一个regexp
后用pattern的match,search的方法,得到MatchObject
再用match object得到匹配的位置,匹配的字符串等信息
RegxObject常用函数:
>>> re.compile("a").match("abab") 如果abab的开头和re.compile("a")匹配,得到MatchObject
<_sre.SRE_Match object at 0x81d43c8>
>>> print re.compile("a").match("bbab")
None 注:从str的开头开始匹配
>>> re.compile("a").search("abab") 在abab中搜索第一个和re_obj匹配的部分
<_sre.SRE_Match object at 0x81d43c8>
>>> print re.compile("a").search("bbab")
<_sre.SRE_Match object at 0x8184e18> 和match()不同,不必从开头匹配
re_obj.findall(str) 返回str中搜索所有和re_obj匹配的部分.
返回一个tuple,其中元素是匹配的字符串.
MatchObject的常用函数
m.start() 返回起始位置,m.end()返回结束位置(不包含该位置的字符).
m.span() 返回一个tuple表示(m.start(), m.end())
m.pos(), m.endpos(), m.re(), m.string()
m.re().search(m.string(), m.pos(), m.endpos()) 会得到m本身
m.finditer()可以返回一个iterator,用来遍历所有找到的MatchObject.
for m in re.compile("[ab]").finditer("tatbxaxb"):
print m.span()
高级regexp
| 表示联合多个regexp. A B两个regexp,A|B表示和A匹配或者跟B匹配.
^ 表示只匹配一行的开始行首,^只有在开头才有此特殊意义。
$ 表示只匹配一行的结尾
\A 表示只匹配第一行字符串的开头 ^匹配每一行的行首
\Z 表示只匹配行一行字符串的结尾 $匹配第一行的行尾
\b 只匹配词的边界 例:\binfo\b 只会匹配"info" 不会匹配information
\B 表示匹配非单词边界
示例如下:
>>> print re.compile(r"\binfo\b").match("info ") #使用raw格式 \b表示单词边界
<_sre.SRE_Match object at 0x817aa98>
>>> print re.compile("\binfo\b").match("info ") #没有使用raw \b表示退格符号
None
>>> print re.compile("\binfo\b").match("\binfo\b ")
<_sre.SRE_Match object at 0x8174948>
分组(Group) 示例:re.compile("(a(b)c)d").match("abcd").groups() ('abc', 'b')
#!/usr/local/bin/python
import re
x = """
name: Charles
Address: BUPT
name: Ann
Address: BUPT
"""
#p = re.compile(r"^name:(.*)\n^Address:(.*)\n", re.M)
p = re.compile(r"^name:(?P.*)\n^Address:(?P.*)\n", re.M)
for m in p.finditer(x):
print m.span()
print "here is your friends list"
print "%s, %s"%m.groups()
Compile Flag
用re.compile得到RegxObject时,可以有一些flag用来调整RegxObject的详细特征.
DOTALL, S 让.匹配任意字符,包括换行符\n
IGNORECASE, I 忽略大小写
LOCALES, L 让\w \W \b \B和当前的locale一致
MULTILINE, M 多行模式,只影响^和$(参见上例)
VERBOSE, X verbose模式
⑤ pb的配置文件如何应用
每次系统登陆,把当前登陆的用户、密码保存到配置文件,不管自动的还是手动的,都保存。
open的时候:
if now() < time'09:00:00' then
//取配置文件里的用户、密码
//登陆
//用户、密码保存配置文件。(当然,自动登陆保存配置文件可以不做,只手动做)
end if从用途方面分析,PB包含两种配置文件。分别是源码配置文件和镜像配置文件。
一、源码配置文件
源码配置文件用于编译源码时使用。这里的源码是指Windows
CE公开的源码,如驱动程序、系统应用程序等。PB在编译平台时将这些公开的源码即时编译并将编译链接后的文件复制到平台工程子目录里。记得前面讲过PB在开始编译时调用cebuild.bat批处理文件,cebuild.bat执行的一个步骤是针对_DEPTREES变量指定的所有目录执行build.exe和sysgen.bat。build.exe在编译源码文件时会寻找当前目录下存放的源码配置文件,根据配置文件的信息来编译和链接,产生EXE、DLL、LIB文件。CE的源码文件所在的目录中都包含了相应的配置文件,这些配置文件只对当前目录或者子目录的源码有效,具体分为三种:
DIRS文件:文件内容和解释如下:
DIRS:指定哪个子目录的源码要被编译
DIRS_CE:只有为CE编写的源码才被编译
OPTIONAL_DIRS:指定可选的目录(很少使用这个选项),可以只编译指定目录而不是全部编译。
SOURCES文件:通过宏定义来指定编译和链接涉及到的文件,文件内容和解释如下:
TARGETNAME:指定编译链接产生的主文件名
TARGETTYPE:指定编译链接产生的文件的类型(决定了扩展名)。文件共分三种:.lib(LIBRARY)和.dll(DYNLINK)和.exe(PROGRAM)。
TARGETLIBS:定义.lib链接文件,链接时需要这个文件。
SOURCES:源码文件。包含扩展名为*.c或*.h
或*.cpp的文件。
EXEENTRY:.exe文件的执行代码入口点。
sources.cmn文件是通用的SOURCES文件。在这个文件中可以指定作用于所有源码文件的配置选项。
MAKEFILE文件:包含默认的编译和链接选项
整个编译和链接过程:build.exe收集编译和链接需要的数据(源码文件、链接文件、编译和链接选项)产生一系列的内部环境变量,然后调用nmake.exe,nmake.exe根据内部环境变量执行编译、链接,最后产生最终文件(*.lib
*.exe *.dll)。
二、镜像配置文件:
镜像配置文件用于在制作CE镜像文件时使用。CE的镜像文件扩展名为.bin。制作镜像工具romimage.exe除了能够产生.bin文件外,还能够产生.abx和.sre文件。整个镜像的制作过程由makeimg.exe控制,它调用cenlscmp.exe、fmerge.exe、res2.exe、txt2ucde.exe、regcomp.exe、romimage.exe等。这些工具大部分在前面已经介绍过了。镜像配置文件类型有.bib、.reg、.db、.dat、.str。如果主文件名为Common,表示是通用的配置文件。如果主文件名为Platform,表示是某一个BSP的配置文件。如果主文件名是Project,表示是定制的一个平台的配置文件。在PB中修改配置文件前如果没有把握最好先做好备份。
.bib(Binary image builder)
定义包含在内核镜像中的文件和模块的名称、加载位置。主要的bib文件有Common.bib,Config.bib, Project.bib,
Platform.bib等。.bib文件内部分为几个部分:
【MEMORY】用于定义有效的物理内存块,在此将整个RAM分为几个部分。
格式: 名称 首地址 大小 内存类型
名称: 内存区域的唯一名称(RESERVE是预定义名称,可以用多次,表示此区域保留)
首地址: 内存区域的首地址(十六进制表示)
大小: 内存区域的大小(十六进制表示)
内存类型:分为三种。
RAM: 运行所有进程的内存区域(整个区域必须是连续的,且不能含空洞)
RAMIMAGE:专用于保存镜像的内存区域。(每个.bin中只能指定一个RAMIMAGE)
RESERVED:保留内存区域(这样的区域一般用于驱动程序使用,如显卡缓冲区、DMA缓冲区)
举例:
;名称 首地址 大小 内存类型
IF IMGRAM64
NK 80220000 009E0000 RAMIMAGE
RAM 80C00000 03000000 RAM
UMABUF 83C00000 00400000 RESERVED
ENDIF
注:整个内核的地址都是从0x8000 0000开始的。如果是x86系列的CPU,那么物理内存地址与虚拟地址映射关系在oeminit.asm中指定。
【CONFIG】类似环境变量,PB预设置了一些配置变量。常用的配置及说明如下:
AUTOSIZE:
格式:AUTOSIZE = OFF | ON
默认值为OFF。在config.bib中的MEMORY部分定义了有效的内存区域,其中两部分RAM、RAMIMAGE分别用于进程使用区域和保存镜像区域。如果为ON,romimage.exe在创建nk.bin时将RAM和RAMIMAGE两部分合并成一个部分,然后从最低地址开始保留RAMIMAGE大小的内存,其余都作为RAM使用。
BOOTJUMP:
格式:BOOTJUMP = address | NONE
默认值为NONE。每次重新启动CE内核,默认执行的代码从RAMIMAGE的首地址开始。如果在BOOTJUMP指定一个地址(必须在RAMIMAGE范围内),那么将从指定的地址开始执行。
COMPRESSION:
格式:COMPRESSION = OFF | ON
默认值为ON。romimage.exe在创建内核时默认压缩所有可写部分。对于文件,默认全部压缩。对于模块(.exe、.dll),默认压缩可写部分。模块的可写部分包括数据段,也就是在模块运行时一定加载到内存中的部分。如果模块在.bib中定义时具有C属性(表明压缩模块所有部分),那么当前这个选项就忽略了。
FSRAMPERCENT:
格式:FSRAMPERCENT = number
默认值为0x80808080。指定为文件系统分配的内存的百分比。number分为四个字节,由十六进制表示。
byte0的值(单位为4KB)表示在第一个2MB中,其中每1MB包含的4KB的整数倍。
byte1的值(单位为4KB)表示在第二个2MB中,其中每1MB包含的4KB的整数倍。
byte2的值(单位为4KB)表示在第三个2MB中,其中每1MB包含的4KB的整数倍。
byte3的值(单位为4KB)表示在剩下的内存中,每1MB包含的4KB的整数倍。
计算一下默认值0x80808080表示的百分比:0x80*4K/1M = 0.5,因为每个字节都等于0.5,所以整个占用的百分比是50%。
KERNELFIXUPS:
格式:KERNELFIXUPS = OFF | ON
默认值为ON。如果为ON,romimage.exe创建内核前重定位内核到RAM的开始位置。
OUTPUT:
格式:OUTPUT = path
指定romimaeg.exe将创建完成的内核文件nk.bin放置到的路径。一般放置到%_FLATRELEASEDIR%下。
ROMFLAGS
格式:ROMFLAGS = Flags
设置内核选项的位掩码,多个位掩码可以组合使用。
0x0001 禁止按需分页:EXE和DLL默认是按需分页的。
0x0002
禁止全内核模式:进程运行在两种模式下,用户模式和内核模式。全内核模式下所有线程运行在内核模式。全内核模式能够提高执行效率,但会增加系统的不稳定性。如果允许执行用户程序,那么不适合采用全内核模式。
0x00000010
只信任来自ROM的模块(DLL、EXE)。默认ROM中的模块和所有文件系统的模块都是内核信任的。OEM能够在OAL层实现对所有运行模块的检查,这个标志将忽略对来自ROM保存的模块的检查。
0x00000020 停止刷新TLB。这个标志仅用于运行在x86CPU上的内核。TLB(Translation Look-aside
Buffer),有人翻译成变换索引缓冲区,它的作用是在虚拟地址和物理地址之间转换。对于具有实时性的内核,这个标志应该设置。
0x00000040 按照/base链接选项中的地址加载DLL。这样内核将不采用重定位加载DLL。不建议采用。
ROMSIZE
格式:ROMSIZE = size
指定内核镜像的大小
ROMSTART
格式:ROMSTART = address
指定内核镜像的首地址
ROMWIDTH
格式:ROMWIDTH = width
指定数据宽度,一般为32位
ROMOFFSET
格式:ROMOFFSET = address
指定偏移地址。
SRE
格式:SRE = OFF | ON
指定romimage.exe是否产生.src文件,一般烧录ROM的程序能够识别此文件。
注:config中绝大多数【CONFIG】选项不需要修改。凡是配置文件都可以使用IF/ENDIF
条件语句。
【MODULES】定义镜像要包含的模块并指定模块(DLL、EXE)如何被加载到内存表中。
格式:模块名称 路径 内存块 类型
模块名称一般为模块的真实名称;路径为当前文件所处的位置(路径中指定的文件名和前面模块名称最好一致);内存块是指这个模块将被存放到哪个内存块中,内存块的定义见前面MEMORY部分;类型指定这个模块将被存放的属性,具体类型如下:
S:系统文件
H:隐藏文件
R:只压缩模块的资源部分(默认模块是不压缩的)
C:压缩模块所有部分
D:禁止调试
N:标志模块是非信任的
P:忽略CPU类型
K:指定romimage.exe修正模块(仅用于调试或者内核跟踪)
X:指定romimage.exe对
⑥ keil编译出错 遥控.C(41): error C129: missing ';' before '1' 怎么回事啊,求高手解答
delay 1 ms(uint t)//编译出错是指这里,1的前面(和后面)有空格
//应该为delay1ms(uint t)
{
for(i=0;1<t;i++)//这个地方有笔误,1应该为i,不过编译能通过
for(j=0;j<120;j++)
;
}
难道没有看到吗?函数名delay 1 ms的1前后有空格,这是错误的,应该把空格去掉,为delay1ms。
⑦ C语言初学问题
main()
{
printf("There is a C program!\n");
getchar();
}
因为有些环境下运行程序,特别是windows,dos窗口到程序结束后就自动关闭, 你的程序输出一行文本后就会结束了,所以窗口会一闪而过,加入getchar()或system("pause");,可以让程序等待. 就不会跳出了,getchar()是从键盘读入一个字符,在用户按回车之前,程序一直会卡在这部不继续下去
你不要用快捷键了,试试在菜单那选择 Run->User Sreen . 另外编译的快捷键是ctrl+f9还是alt+f9? 没用过TC2.网上查似乎是ctrl+f9.最好全部在菜单里面找. 编译是compile,运行是run或者execute