Saturday, 1 May 2010
matlab把matrix 写成文本文件——dlmwrite
DLMWRITE('FILENAME',M) writes matrix M into FILENAME using ',' as the
delimiter to separate matrix elements.
DLMWRITE('FILENAME',M,'DLM') writes matrix M into FILENAME using the
character DLM as the delimiter.
DLMWRITE('FILENAME',M,'DLM',R,C) writes matrix M starting at
offset row R, and offset column C in the file. R and C are zero-based,
so that R=C=0 specifies the first value in the file.
DLMWRITE('FILENAME',M,'ATTRIBUTE1','VALUE1','ATTRIBUTE2','VALUE2'...)
An alternative calling syntax that uses attribute value pairs for
specifying optional arguments to DLMWRITE. The order of the
attribute-value pairs does not matter, as long as an appropriate value
follows each attribute tag.
DLMWRITE('FILENAME',M,'-append') appends the matrix to the file.
without the flag, DLMWRITE overwrites any existing file.
DLMWRITE('FILENAME',M,'-append','ATTRIBUTE1','VALUE1',...)
Is the same as the previous syntax, but accepts attribute value pairs,
as well as the '-append' flag. The flag can be placed in the argument
list anywhere between attribute value pairs, but not between an
attribute and its value.
USER CONFIGURABLE OPTIONS
ATTRIBUTE : a quoted string defining an Attribute tag. The following
attribute tags are valid -
'delimiter' => Delimiter string to be used in separating matrix
elements.
'newline' => 'pc' Use CR/LF as line terminator
'unix' Use LF as line terminator
'roffset' => Zero-based offset, in rows, from the top of the
destination file to where the data it to be
written.
'coffset' => Zero-based offset, in columns, from the left side
of the destination file to where the data is to be
written.
'precision' => Numeric precision to use in writing data to the
file, as significant digits or a C-style format
string, starting with '%', such as '%10.5f'. Note
that this uses the operating system standard
library to truncate the number.
EXAMPLES:
DLMWRITE('abc.dat',M,'delimiter',';','roffset',5,'coffset',6,...
'precision',4) writes matrix M to row offset 5, column offset 6, in
file abc.dat using ; as the delimiter between matrix elements. The
numeric precision is of the data is set to 4 significant decimal
digits.
DLMWRITE('example.dat',M,'-append') appends matrix M to the end of
the file example.dat. By default append mode is off, i.e. DLMWRITE
overwrites the existing file.
DLMWRITE('data.dat',M,'delimiter','\t','precision',6) writes M to file
'data.dat' with elements delimited by the tab character, using a precision
of 6 significant digits.
DLMWRITE('file.txt',M,'delimiter','\t','precision','%.6f') writes M
to file file.txt with elements delimited by the tab character, using a
precision of 6 decimal places.
DLMWRITE('example2.dat',M,'newline','pc') writes M to file
example2.dat, using the conventional line terminator for the PC
platform.
Monday, 5 April 2010
matlab中计算程序运行时间的方法
于是就要计算一下不同方法的运行时间了。以下就是从网上找的一些方法:
----------------------------------
1、tic和toc组合(使用最多的)
计算tic和toc之间那段程序之间的运行时间,它的经典格式为
tic
。。。。。。。。。。
toc
2、etime(t1,t2)并和clock配合
来计算t1,t2之间的时间差,它是通过调用windows系统的时钟进行时间差计算得到运行时间的,应用的形式
t1=clock;
。。。。。。。。。。。
t2=clock;
etime(t2,t1)
3、cputime函数来完成
使用方法和etime相似,只是这个是使用cpu的主频计算的,和前面原理不同,使用格式如下
t0=cputime
。。。。。。。。。。。。。
t1=cputime-t0
复制代码
Matlab官方推荐使用tic/toc组合,When timing the duration of an event, use the tic and toc functions instead of clock or etime.
Wednesday, 26 August 2009
matlab7(R14) load/save mat file的一个bug
对于某些save的mat file, 用load无法打开
提示:???Error using ==> load
Unable to read MAT file /home/$dir
File may be corrupt.
解决方法在这里:http://www.mathworks.com/support/solutions/data/1-12L88C.html?solution=1-12L88C
需要下载 matzerofix.m 和
matcat.m
good = matcat(yourmatfile.mat) 如果good = 0 就说明mat file是 corrupt了
用matzerofix(yourmatfile.mat,'fix')就处理就好了。
matlab之后的版本ms没有这个问题
Wednesday, 3 June 2009
matlab 显示图像
使用matlab显示图像的时候,
选择imshow() 或者 imwrite()
需要注意图像矩阵的数据类型
如果是0-255的,需要是uint8型的
如果是0-1的,需要是double型的
imshow(uint8(bg))
imwrite(double(bg))
imshow(I_w,[0.0,1.0])
Thursday, 21 May 2009
matlab中的各种取整函数
B = floor(A) 返回小于或等于A的整数值,对于复数来说,分别对A的实部和虚部进行运算。
B = ceil(A) 返回大于或等于A的整数值,对于复数来说,分别对A的实部和虚部进行运算。
Y = round(X) 返回距离X最近的整数值。
B = fix(A) 返回A的整数部分,小数部分为0
Wednesday, 20 May 2009
matlab 基本知识
保留的常数
eps—机器的浮点运算误差限。PC机上eps的默认值为2.2204*10^-16,若某个量的绝对值小于eps,则可以认为这个量为0。
i
和j—若i或j量不被改写,则它们表示纯虚数量j。但在MATLAB程序编写过程中经常事先改写这两个变量的值,如在循环过程中常用这两个变量来表示循环
变量,所以应该确认使用这两个变量时没被改写。如果想恢复该变量,则可以用语句i=sqrt(-1)设置,即对-1求平方根。
Inf—无穷大
量+∞的MATLAB表示,也可以写成inf。同样地,-∞可以表示为-Inf。在MATLAB程序执行时,即使遇到了以0为除数的运算,也不会终止程序
的运行,而只给出一个“除0”警告,并将结果赋成Inf,这样的定义方式符合IEEE的标准。从数值运算编程角度看,这样的实现形式明显优于C这样的非专
业语言。
NaN—不定式(not a number),通常由0/0运算、Inf/Inf及其他可能的运算得出。NaN是一个很奇特的量,如NaN与Inf的乘积仍为NaN。
pi—圆周率π的双精度浮点表示。
lasterr—存放最新一次的错误信息。此变量为字符串型,如果在本次执行过程中没出现这错误,则此变量为空字符串。
lastwarn—存放最新的警告信息。若未出现过警告,则此变量为空字符串。
保留的变量
ans—存放最近一次无赋值变量语句的运算结果。
end—最后一行(列)
nargin—函数输入变量的实际个数
nargout—函数返回变量的实际个数
保留字
%—后接注释
数据结构
一、 数值型结构
MATLAB
语言中最常用的数值量为双精度浮点数,占8个字节(PS:与JAVA的double型相同)(64位),遵从IEEE记数法,有11个指数位、53位尾数
及一个符号位,值域的近似范围为-1.7*10^308至1.7*10^308,其MATLAB表示为double()。考虑到一些特殊的应
用,MATLAB语言还引入了无符号的8位整形数据类型,其MATLAB表示为uint8(),其值域为0至255。此外,在MATLAB中还可以使用其
他的数据类型,如int8(),int16(),int32(),uint16(),uint32()等,每一个类型后面的数字表示其位数。
二、 符号型结构
MATLAB还定义了“符号”型变量,以区别于常规的数值型变量,可以用于公式推导和数学问题的解析解法。申明语句为syms var_list var_props 。穑与型数值可以通过变精度算法函数vpa()以任意指定的精度显示出来。
三、 其他数据结构
1.字符串型数据 MATLAB支持字符串变量,可以用它来存储相关的信息。和C语言等程序设计语言不同,MATLAB字符串是用单引号括起来的,而不是用双引号。
2.多维数组 三维数组是一般矩阵的直接拓展。在直接编程中还可以使用维数更高的数组。
3.单元数据 单元数组是矩阵的直接扩展,其存储格式类似于普通的矩阵,而矩阵的每个元素不是数值,可以认为能存储任意类型的信息,这样每个元素称为“单元”(cell)。
4.类与对象 MATLAB允许用户自己编写包含各种复杂详细的变量,亦即类变量。该变量可以包含各种下级的信息,还可以重新对类定义其计算,这在控制系统描述中特别有用。
基本语句结构
一、 直接赋值语句
赋值变量=赋值表达式
这一过程把等号右边的表达式直接赋给左边的赋值变量,并返回到MATLAB的工作空间。如果赋值表达式后面没有分号,则将在MATLAB命令窗口中表示表达式的运算结果。
二、 函数调用语句
[返回变量列表]=函数名(输入变量列表)
三、 冒号表达式
v=s1:s2:s3
该
函数将生成一个行向量v,其中s1为向量的起始值,s2为步距,该向量将从s1出发,每隔步距s2取一个点,直至不超过s3的最大值就可以构成一个向量。
若省略s2,则步距取默认值1。(PS:“不超过”取决s2,若s2>0则为<=s3,否则为>=s3)
四、 子矩阵提取表达式
B=A(v1,v2)
v1向量表示子矩阵要包含的行号构成的向量,v2表示要包含的列号构成的向量,这样从A矩阵中提取有关的行和列,就可以构成子矩阵B了。若v1为:,则表示要提取所有的行,v2亦然。
矩阵的代数运算
一、 矩阵转置
MATLAB中用A’可以求出A矩阵的Hermit转置(共轭转置),矩阵的转置则可以由A.’求出。
二、 加减法运算
假设在MATLAB工作环境下有两个矩阵A和B,则可以由C=A+B和C=A-B命令执行矩阵加减法。若A和B矩阵的维数相同,它会自动地将A和B矩阵的相应元素相加减,并赋给C变量。若二者之一为标量,则将其遍加(减)于另一个矩阵。其它情况下,MATLAB将报错。
三、 矩阵乘法
MATLAB语言中两个矩阵的乘法由C=A*B直接求出,且这里并不需要指定A和B矩阵的维数。若A和B矩阵的维数不相容(A列数不等于B行数),则将报错。
四、 矩阵的左除
MATLAB中用“\”运算符号表示两个矩阵的左除,A\B为方程AX=B的解X。若A为非奇异方阵,则X=A-1B。
五、 矩阵的右除
MATLAB中定义了“/”符号,用于右除,相当于求方程XA=B的解。
B/A=(A’\B’)’
六、 矩阵翻转
MATLAB提供了一些矩阵翻转处理命令。
七、 矩阵乘方运算
在MATLAB中统一表示成F=A^x。
八、 点运算
两个矩阵之间的点运算是它们对应元素的直接运算,例如.*,.^等。
矩阵的逻辑运算
在MATLAB语言中,如果一个数的值为0,则可以认为它为逻辑0,否则为逻辑1。(PS:包括负数和复数)。
一、 矩阵的与运算
在MATLAB下用&号表示矩阵的与运算
二、 矩阵的或运算
在MATLAB下用|号表示矩阵的或运算
三、 矩阵的非运算
在MATLAB下用~号表示矩阵的非运算
四、 矩阵的异或运算
在MATLAB下矩阵A和B的异或运算可以表示成xor(A,B)。
矩阵的比较运算
< = > <= >= == ~=
Friday, 1 May 2009
python 编码转换
**常见的编码转换分为以下几种情况:**
===== unicode 转换为其它编码(GBK, GB2312等) =====
例如:a为unicode编码 要转为gb2312。a.encode('gb2312') <code python> # -*- coding=gb2312 -*- a = u"中文" a_gb2312 = a.encode('gb2312') print a_gb2312 </code>
===== 其它编码(utf-8,GBK)转换为unicode =====
例如:a为gb2312编码,要转为unicode. unicode(a, 'gb2312')或a.decode('gb2312') <code python> # -*- coding=gb2312 -*- a = u"中文" a_gb2312 = a.encode('gb2312') print a_gb2312
a_unicode = a_gb2312.decode('gb2312') assert(a_unicode == a) a_utf_8 = a_unicode.encode('utf-8') print a_utf_8 </code>
===== 非unicode编码之间的转换 =====
编码1(GBK,GB2312) 转换为 编码2(utf-8,utf-16,ISO-8859-1)
可以先转为unicode再转为编码2
如gb2312转utf-8 <code python> # -*- coding=gb2312 -*- a = u"中文" a_gb2312 = a.encode('gb2312') print a_gb2312
a_unicode = a_gb2312.decode('gb2312') assert(a_unicode == a) a_utf_8 = a_unicode.encode('utf-8') print a_utf_8 </code>
===== 判断字符串的编码 =====
isinstance(s, str) 用来判断是否为一般字符串 \\ isinstance(s, unicode) 用来判断是否为unicode \\ 如果一个字符串已经是unicode了,再执行unicode转换有时会出错(并不都出错) \\
Tuesday, 28 April 2009
python 真的很好用
今天做course project,一个expert system, 用clips实现,需要生成很多很多条rule的。。。
于是决定用Python写一个rule generator,真是好用了,用里面dict的功能,太强大了。
根据dict来进行排序啊,存取任意的一个元素啊,都十分方便。
贴一段代码片段。。写的比较烂。。。还是没有学会用Python的方式去写代码。。。。
def makeoutput2(new_dict):
newlistK = []
file_q = open("question.txt")
allLines = file_q.readlines()
file_q.close()
question_content = ""
file = open("output2.txt",'w')
number = 2
for eachkey in sorted(new_dict.items(), key = lambda d:d[1],reverse=True):
for eachLine in allLines:
if eachLine.find(eachkey[0]) !=-1:
num = eachLine.find('.')
question_content = eachLine[num+1:len(eachLine)-1]
break
file.write("\n(question (order "+str(number)+") (content \""+question_content+"\"))")
number = number + 1
Friday, 25 April 2008
EVC实现WIN CE下截屏并且保存到文件[By Erran]
最初使用的截屏方法说来还真有些丢人,一个一个点的取得颜色值,再保存到bmp文件中去,这样程序运行的速度超慢,保存一个800X600的bmp差不多要一两分钟(研华8251板),觉得有些不对头,决定想办法改进一下,就使劲地看了一下Charles Petzold先生的《Programming Windows》(这本书很经典,值得好好研究一下),终于把时间缩短到几秒钟了,下面这个函数在evc和vc下都test pass(不用更改),有不足之处欢迎指正,函数:
// this function create a bmp file to save the current screen;
// supported eVC++ 4.0 (wince 4.0) and vc++ 6.0 , test pass;
void CSnapDlg::OnScreenSave(const char *filename)
{
HDC hScrDC, hMemDC;
int width, height;
//the pointer will save all pixel point's color value
BYTE *lpBitmapBits = NULL;
//creates a device context for the screen device
hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
//get the screen point size
width = GetDeviceCaps(hScrDC, HORZRES);
height = GetDeviceCaps(hScrDC, VERTRES);
//creates a memory device context (DC) compatible with the screen device(hScrDC)
hMemDC = CreateCompatibleDC(hScrDC);
//initialise the struct BITMAPINFO for the bimap infomation,
//in order to use the function CreateDIBSection
// on wince os, each pixel stored by 24 bits(biBitCount=24)
//and no compressing(biCompression=0)
BITMAPINFO RGB24BitsBITMAPINFO;
ZeroMemory(&RGB24BitsBITMAPINFO, sizeof(BITMAPINFO));
RGB24BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
RGB24BitsBITMAPINFO.bmiHeader.biWidth = width;
RGB24BitsBITMAPINFO.bmiHeader.biHeight = height;
RGB24BitsBITMAPINFO.bmiHeader.biPlanes = 1;
RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;
//use the function CreateDIBSection and SelectObject
//in order to get the bimap pointer : lpBitmapBits
HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&RGB24BitsBITMAPINFO,
DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0);
HGDIOBJ previousObject = SelectObject(hMemDC, directBmp);
// copy the screen dc to the memory dc
BitBlt(hMemDC, 0, 0, width, height, hScrDC, 0, 0, SRCCOPY);
//if you only want to get the every pixel color value,
//you can begin here and the following part of this function will be unuseful;
//the following part is in order to write file;
//bimap file header in order to write bmp file
BITMAPFILEHEADER bmBITMAPFILEHEADER;
ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));
bmBITMAPFILEHEADER.bfType = 0x4d42; //bmp
bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((width*height)*3); ///3=(24 / 8)
//write into file
FILE *mStream = NULL;
if((mStream = fopenfilename, "wb")))
{
//write bitmap file header
fwrite(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), 1, mStream);
//write bitmap info
fwrite(&(RGB24BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER), 1, mStream);
//write bitmap pixels data
fwrite(lpBitmapBits, 3*width*height, 1, mStream);
//close file
fclose(mStream);
}
//delete
DeleteObject(hMemDC);
DeleteObject(hScrDC);
DeleteObject(directBmp);
DeleteObject(previousObject);
}
Tuesday, 1 April 2008
vc调试查看所用内存
{
MEMORYSTATUS memInfo;
memInfo.dwLength = sizeof(memInfo);
GlobalMemoryStatus(&memInfo);
TRACE(TEXT("in location: %s
Thursday, 27 March 2008
vc画矩形的三个函数
CDC::FrameRect 只画框,不填充
CDC::FillRect 不画框,只填充
CDC::Rectangle 既画框,也填充
Monday, 17 March 2008
CxImage 使用安装 VS2005
首先要修正源代码的一些错误
以下两个地方需要改正:
1、
\cximage\cximage\ximatran.cpp(174) : error C2666: 'div ' : 2 overloads have similar conversions
\vc\include\stdlib.h(508): could be 'ldiv_t div(long,long) '
d:\vs8\vc\include\stdlib.h(482): or 'div_t div(int,int) '
div的参数强制转换为long 就可以了
2、
for(int i=....)
在VS2005里面, for循环体里面定义 只在循环体内有效,所以会出现一些i 没有定义的问题
然后把所有生成的Lib最好都放到一个文件夹下,方便使用
我是放到
E:\lib\release
E:\lib\debug
这是官方的帮助对在自己的工程中使用CxImage类库的说明:
Project Settings
|- C/C++
| |- Code Generation
| | |- Use run-time library : Multithreaded DLL (must be the same for
| | | all the linked libraries)
| | |- Struct member alignment : must be the same for all the linked
| | | libraries
| |- Precompiled headers : not using precompiled headers
| |- Preprocessor
| |- Additional Include Directories: ..\cximage
|- Link
|- General
|- Object/library modules: ../png/Debug/png.lib
../raw/Debug/libdcr.lib
../jpeg/Debug/jpeg.lib
../zlib/Debug/zlib.lib
../tiff/Debug/tiff.lib
../jasper/Debug/jasper.lib
../cximage/Debug/cximage.lib ...
首先:
选项->工具->项目和解决方案->VC++目录
库文件: 增加 : E:\lib\release E:\lib\debug
包含文件: 增加: (your CxImage dir)\CxImage
然后在你的工程中:
项目->属性->配置属性->链接器->输入->附加依赖项 : 增加:
cximage.lib jpeg.lib png.lib tiff.lib j2k.lib jasper.lib jbig.lib zlib.lib
在 项目->属性->配置属性->常规
MFC使用: 在共享DLL中使用MFC
字符集: 使用多字节字符集
在项目->属性->配置属性->C/C++->代码生成
运行时库 : /MD
结构成员对齐: 16字节
预编译头:不使用预编译头
OK,这样子,就可以开始使用CxImage啦
Sunday, 16 March 2008
php5安装
2,php.ini-dist改名为php.ini,找到第438行改成 extension_dir = c:\php\ext
4,复制php.ini到Winnt目录下,再复制php5ts.dll和libmysql.dll到WINNT\system32\中
5,打开IIS,添加一个php后缀. (指向c:\php\php5isapi.dll)
Monday, 10 December 2007
关于nhibernate
被nhibernate折磨 2007-12-10 10:29
弄了这么一天。。。还是出错。。。
看着网上的教程说的这么轻松,对自己真是挫败啊。。。。
下午装好sql server2005 express,装好nhibernate,想着瞬间就可以弄好。谁知道在mapping 的xml 老是无法parse....在文档看不出什么来。。。网上搜到的东西也让我越来越乱。。。。
后来跑去问一个用hibernate的同学。。。发现他们的mapping 和config的xml还有 实体类 都是使用工具直接从数据库中生成的。。。T.T. C# ms只有帮我写mapping 和 config ,实体类的工具。
后来想大约是版本问题。。。于是又换了一个旧一点的版本。。。ok...nothing happen。。。怒啊。。。怒啊。。。
就这么折腾到1点。。。想想决定自己重新一步一步的把 config,mapping 实体类 生成,使用工具的速度还是挺快的,决定再试一次,如果失败就睡觉去。。。可是。。。它居然就通过了parse的环节。。。
然而 我只高兴了那么1分钟,等我把所有代码都加载进去做一次的时候,然后有问题了。。。生成不了session factory.... driver_class 没有提供。。。kao...C#里面驱动nhibernate自己写好了吧。。。居然就是找不到。。。又弄了好久。。。
退出远程郁闷一会。。。猜想也许是 server的版本 和 nhibernate的版本问题。。。于是想再次过去看看。。。好吧。。。这回远程登录不上去了。。。额。。。看来它也不堪忍受了。。。让我睡觉去吧。。。。
晚上。。。肚子疼了T.T.....上厕所去。。。凄惨啊。。。。
========================
终于写好了一个nhibernate sample 2007-12-10 15:48
今天早上起来。。。rp不错。。。把昨天的mapping xml的问题给解决了
可是却发现数据库连接不上。。。
就这么弄了很久,后来决定不用sql server2005 express了。。。。改用Mysql。。。
于是。。。终于看到table里面insert进去了
这时候才发现。。。一瓶啤酒就已经over了。。。
Sunday, 9 December 2007
nHibernate 配置 zz
有三种方式来存放nhibernate的配置
1, 作为单独的一节放在相应程序的配置文件中,对于执行文件或类库为文件名称后加.config,对于asp.net则是放在web.config中。这种方式必须在配置文件的configSetions中声明nhibernate的配置节,
配置内容由Cfg.Environment类来读取,该类所有成员均为静态的,另外它还定义了配置中key值的常数。
2. 放在一个单独的配置文件中,默认为hibernate.cfg.xml,使用时必须调用Cfg.Configuration.Config()。如不是默认的配置文件名,还必须指明配置文件名称。这种方式最适合多数据库的情况,可以为每个数据库建立一个配置文件。
3. 手工在程序中加入,配置内容最后将加入到Cfg.Configuration.Properties属性中,此属性为一IDictionary对象,并且为public,其余的就不用多话了吧。
下面对几个重要的key值说明一下:
- hibernate.connection.provider
- 连接提供者,取值必须是实现了IConnectionProvider接口的类的全名,当前版本只能取值NHibernate.Connection.DriverConnectionProvider;
- hibernate.connection.driver_class
- 数据驱动类,取值必须是实现了IDriver接口的类的全名,常用的选择有NHibernate.Driver.SqlClientDriver, NHibernate.Driver.OleDbDriver等;
- hibernate.dialect
- 数据库方言,取值必须是继承之Dialect的类的全名,最常用的就是NHibernate.Dialect.MsSql2000Dialect了, 其它的没用过,不清楚能不能正常使用;
- hibernate.connection.connection_string
- 连接字符串,取值与driver_class对应即可;
- hibernate.show_sql
- 指明是否在log4net日志中显示sql语句,主要用于调试,取值为true或false;
完整的配置key列表请查看Cfg.Environment类中的常数声明。
持久对象映射文件
nhibernate为我们提供了很多方式将持久对象映射文件加入到Cfg.Configuration类,下面将其一一列出:
AddXmlFile:加入包括对象映射信息的文件;
AddXmlString:加入包含映射信息的字符串;
AddDocument:加入包含映射信息的Xmldocument;
AddInputStream:加入包含映射信息的输入流;
AddXmlReader:加入包含映射信息的XmlReader;
AddResource:加入指定程序集的映射信息资源;
AddClass:加入以类名指定的映射信息资源,映射文件必须为classname.hbm.xml;
AddAssembly:加入指定程序集名称的映射信息资源
注意:如果映射信息为文件形式,包括加入到程序集资源的文件,那么文件名必须以.hbm.xml结尾。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=44448
Monday, 19 November 2007
vc 访问 注册表
LONG RegOpenKeyEx(HKEY hKey, // 待打开的预定义键
LPCTSTR lpSubKey, // 待打开的子键的地址
DWORD ulOptions, // 保留
REGSAM samDesired, // 安全访问掩码
PHKEY phkResult // 打开的键的地址
);
LONG RegQueryValueEx(HKEY hKey, // 待检索的键
LPTSTR lpValueName, // 要检索的键值名称的地址
LPDWORD lpReserved, // 保留
LPDWORD lpType, // 键值类型的地址
LPBYTE lpData, // 存放检索结果的缓存的地址
LPDWORD lpcbData // 缓存长度的地址
);
// 打开键
HKEY hKEY;
LPCTSTR Rgspath = "Software\\Microsoft\\Windows NT\\CurrentVersion";
LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, Rgspath, 0, KEY_READ, &hKEY);
if(ret != ERROR_SUCCESS)
{
RegCloseKey(hKEY);
return;
}
// 读取键值内容
DWORD dwInfoSize;
DWORD type = REG_SZ;
BYTE UserInfo[255];
ret = RegQueryValueEx(hKEY, "RegisteredOwner", NULL, &type, UserInfo, &dwInfoSize);
if(ret!=ERROR_SUCCESS)
{
RegCloseKey(hKEY);
return;
}
……
// 关闭键
RegCloseKey(hKEY);
Tuesday, 9 October 2007
一个同步的传输的程序
//定义一个socket,连接本机
asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query("127.0.0.1", "13");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::resolver::iterator end;
tcp::socket socket(io_service);
io_service.run();
socket.close();
//连接
std::cout << "prepare to connect" << std::endl;
socket.async_connect(*endpoint_iterator++, test);
std::cout << "connect end" << std::endl;
std::string s = socket.remote_endpoint().address().to_string();
std::cout << s << std::endl;
char buf[128];
Sleep(2000);
for (;;)
{
//得到数据
Sleep(2000);
memset(buf, 0, 128);
size_t len = socket.read_some(asio::buffer(buf));
std::cout << "read finished" << std::endl;
f<< buf << std::endl;
}
server的代码差不多,就是read_some 改成 write_some....
想尝试 异步的,async_read, async_write....然后就出问题了。。。sigh....
不知道是什么原因
初识 boost 与asio
http://wiki.woodpecker.org.cn/moin/Boost 张沈鹏
http://www.uuzone.com/blog/uu_bvpttoo/140052.htm 洪荒
http://www.cnblogs.com/oomusou/archive/2007/09/05/883293.html 蕭鴻森
VS2005+boost1.34.1+asio0.3.8rc1
需要把asio中的system库也编译一下的,不过可以和boost库一起编译,也可以单独编译,然后把asio里面的boost和lib copy 到boost1.34目录下就好了。
編譯bjam
利用Visual Studio 2005 Command Prompt開啟DOS視窗,將目錄cd到C:\boost_1_34_1\tools\jam\src下,執行build.bat,然後會在C:\ boost_1_34_1\tools\jam\src\bin.ntx86\產生bjam.exe,將bjam.exe複製到c:\ boost_1_34_1\下
編譯boost
將目錄移至c:\boost_1_34_1\下執行
參數說明
--without-python 表示不使用 python
--toolset : 所使用compiler,Visual Studio 2005為msvc-8.0
--prefix:指定編譯後library的安裝目錄
如果只编译其中一个库 可以选择 --with-system install 只编译system库
之后在vc中设置路径什么的就不说了。
编译:VC2005注意
在 属性->C/C++->预处理器->预处理定义 中加入
_CRT_SECURE_NO_DEPRECATE;
来屏蔽不必要的警告
因为vc2005里面对于 asio库里面很多无法识别的欧洲文字都会报出warning ,还是屏蔽掉比较爽
Thursday, 9 August 2007
细谈VC程序调试的若干方法[zt]
VC所依赖的开发平台Microsoft Developer Studio本身提供的调试功能并不弱,每当我们创建一个新的VC工程项目时,默认状态就是Debug(调试)版本,在"组建"(Build)菜单下的 Configurations中可以看到除了调试版本还可以设置成发行(Release)版本。调试版本由于包含了大量信息,所以它生成的可执行程序容量 会远远大于发行版。
具体地,调试版本主要增加了两个内容:其一,会执行编译命令_D_DEBUG,使头文件的调试语句ifdef及其代码附加到程 序中;其二,在可执行文件中加入的调试信息使开发人员能够观察变量,进行单步执行等。在VC"组建"(Build)菜单下的"开始调试"中有4条专用的调 试命令:Go,Step into,Run to Cursor,Attach to process…。在运行程序源代码时用Go命令(而不是Execute)才能处于调试状态, Go命令会使程序运行变得缓慢下来,但可以更好地控制运行程序,我们可以在任何时刻中断程序、单步执行、查看变量、检查调用栈。
有必要详细介绍一 下VC的调试功能:首先,再次强调要用Go命令运行一个将要调试的程序;如果要中止调试状态下的运行程序可以点击Stop Debugging命令,还可以通过Break选项以可恢复方式中断调试程序的运行流程(用Restart选项可以重新开始运行程序);Step Into选项表示每次只执行一行语句(单步执行),但如果当前代码是调用一个函数,那么Step Into表示进入该函数,全部函数语句执行完后返回,而Step Over则是跳出这个函数;Step To Cursor选项表示程序将执行到光标所在的可执行语句行上;在调试多线程程序时,可以在线程函数或主应用程序线程中设置断点,还可以用Break选项结 束线程后用Threads选项查看运行线程列表,也可以选择悬挂和恢复每个线程;在设置断点后,在VC "查看"菜单的"调试窗口"中可以查看变量、内存、调用堆栈、寄存器以及反汇编语句。在程序中设置断点的方法是,点击要设置的代码行并点击设置代码的工具 栏按钮,会出现在代码行最左边的一个小黑点即是断点标志,这时再选Go程序会在执行到端点处停下来,如果要继续执行可以再选Go。
通过选择VC" 工具"菜单下的"源浏览器"可以生成一个.BSC文件,使用浏览器可以从中发现多种信息:程序中任何一个变量、函数、类或宏在何处定义及引用;可以列出所 有声明的函数类、变量、宏;可以发现调用一个指定函数的所有函数;可以找到一个指定类的派生来源或者它派生出哪些类。
在使用微软程序开发库 MSDN时,我们会发现其中的VC示例经常采用看似多余的ASSERT语句,其作用就是使程序具有"维护"性。对于Debug版本的VC程序,在遇到布尔 值为FALSE的ASSERT语句处停止,并显示Assertion Failed对话;如果设置为发布版,所有ASSERT语句都会被预处理程序删除。一个地道的VC编程员,应该有意在自己的代码中通过"维护"特征去检测 任何设定,诸如输入参数、循环范围和变量值的设定。
在安装好VC系统之后,在VC之外的程序组中有一个程序Tracer是一个跟踪工具,在激活它 后使用Go运行VC代码,在输出窗口就能够看到程序运行过程中的内部过程,包括DLL调用等,你如果看不到任何输出,可以转到菜单"查看"(View)点 击"输出"(Output)。
其实,MFC自身就提供有错误查找和TRACE语句,而TRACE语句的语法与printf非常类似,所以我们可以在程序中直接加入这条跟踪命令,如下所示:
// Example for TRACE
int i = 1;
char sz[] = "one";
TRACE( "Integer = %d, String = %s\n", i, sz );
// Output: 'Integer = 1, String = one'
在Developer Studio中还提供了一个ERRLOOK工具,程序员只要输入错误号就能得到系统出错信息或模块错误内容.
MFC从Cobject派生的每个类都包含一个Dump函数,该函数可把当前状态转储(Dumping)到输出窗口,这在某些调试过程中会有用,以下代码是Dump函数的用法:
// Example for CObject::Dump
void CAge::Dump( CDumpContext &dc ) const
{
CObject::Dump( dc );
dc << "Age = " << m_years;
}
在MFC 中还有一个非常有用的类是CMemoryState,我们可以在程序的任何部分使用这个类检测内存冲突,并得到内存冲突的确切位置。 CMemoryState类有3个成员函数:CheckPoint可将堆的当前状态存入类的实体;Difference可以比较两个实体包含的堆之间的差 异;DumpStatistics用于标准化转储所有被CheckPoint捕获后分配到堆的对象,如CheckPoint未被调用实体未被初始化时,该 函数将转储当前堆的所有内容。以下代码表示了CMemoryState类的使用方法:
// Example for CMemoryState::CMemoryState,
// Includes all CMemoryState functions
CMemoryState msOld, msNew, msDif;
msOld.Checkpoint();
CAge* page1 = new CAge( 21 );
CAge* page2 = new CAge( 22 );
msOld.DumpAllObjectsSince();
msNew.Checkpoint();
msDif.Difference( msOld, msNew );
msDif.DumpStatistics();
代码运行的结果为
Dumping objects ->
{2} a CObject at $190A
{1} a CObject at $18EA
Object dump complete.
0 bytes in 0 Free Blocks
8 bytes in 2 Object Blocks
0 bytes in 0 Non-Object Blocks
Largest number used: 8 bytes
Total allocations: 8 bytes
在MFC类和VC中本身就有"异常情况"这个概念,并在此基础上形成它们处理系统错误和意外的主要机制。比如当系统内存分配殆尽时,你的运行程序就会收到内存异常的消息。这样就给了程序员消除异常的机会。
MFC中的异常情况主要有:CArchiveException表示档案文件载入或保存时出错,CDBException属于数据库错误, CFileException为文件错误,CMemoryException为调用new时发生分配错误,CNotSupportedException 表示指定操作不被支持,COleException表示在调用OLE操作时出错,COleDispatchException表示在OLE自动操作时出 错,CResourceException表示资源找不到或无法创建,CUserException用于通知用户错误。
MFC还包含一系列以Afx-为词头的调试函数:AfxAbort可以在发生致命错误时异常终止程序,AfxCheckMemory可以检查堆和剩 余缓冲池的受损部分;AfxDoForAllClasses重声明所有CObject的派生类;AfxDoForAllObject重声明堆上所有 CObject派生的对象;AfxEnableMemoryTracking启用或禁止内存追踪;AfxIsMemoryBlock用于确认指针所指内存 有效;AfxIsValidAddress用于确认地址是驻留在程序的内存区域内;AfxIsValidString用于确认地址所指字符串有效; AfxSetAllocHook用于内存分配前进行检测;AfxTraceEnabled启动或禁止输出跟踪,AfxTraceFlags则进一步定制跟 踪特征。
在我们随手编制的VC程序中,普遍存在着会发生内存泄漏的隐患,有些问题程序的痼疾症状是在处理数据量激增时陷入瘫痪,更糟的要发现内存泄漏并不容 易。首先,我们要明确VC中内存泄漏的含义:简单说就是一个程序申请得到了一段内存却没有及时释放。比如用new在堆中分配了一个对象或对象组却并没有调 用delete操作。灵活的指针技术使内存泄漏的原因变得复杂化,比如改变了保存在一变量中的指针的值后未能删除指针所指向的内存区;当内存泄漏是来自一 个带有指针类型成员变量的类时会更加困难,因为当调用分配指针时并没有复制构造函数/析构函数或运算符
为了防止发生内存泄漏这样棘手的故障,在VC编程时应当注意遵循几个规范:其一,如果一个类包含有指针并且分配了指针值,那么就需要构造相应的析构 函数以删除该指针;其二,如果一个函数分配了一块内存并把该内存块返回给调用它的函数使用,那么它返回的必须是一个指针而非一个引用,因为引用不能被程序 删除;其三,即使一个函数分配了一段内存并在同一函数的稍后部分删除了该内存段,也要尽可能将内存块分配到堆栈中;最后,就是决不要试图改变一个指针值, 除非已经删除指针所指的对象或通过数组指向了该指针所指向的内存,而且也不要对new返回的指针进行加1运算
每当编写VC程序时,我们都会处于一个琳琅满目的集成开发环境(IDE)中,现实的真相是我们很多人在这里编程多年,对开发环境了解并不全面和细 微。记得王朔的小说中有句话说"穿了多年的外套在不穿时才发现它原来还有一个兜!"。我们在安装VC时,得到的IDE即Developer Studio, VC其实是Developer Studio下激活的一个组件而已,比如微软的VJ++也是基于Developer Studio。很少有技术书籍会一一介绍Developer Studio界面元素,也许聪明的程序员轻易就能识别其含义,全部猜对界面图符的含义并非易事。可是它们对我们了解开发信息很重要,也与调试程序有关联。
在Developer Studio下会生成多个文件去保存项目的所有信息:一个是以.DSW为扩展名的项目工作区文件,它包含项目中所有文件的名称、文件所在目录、编译器和连 接器的选项以及项目工作的其它信息;以.DSP为扩展名的也是项目记录文件,.OPT是工作区选项文件,它包含Developer Studio的所有个人设置 - 包括颜色、字体、工具栏、哪个文件被打开以及MDI窗口如何被定位和最新调试中的断点等。在打开项目工作区文件时其它文件随即会自动打开。在 Developer Studio下可以按类查看代码,其中的ClassView显示了应用程序中所有的类,每个类下显示了成员函数和数据成员,在成员函数旁有粉红图标,数据 成员旁是蓝绿色图标,保护类成员的图标旁有一枚钥匙,私有类成员则有一个挂锁图标。
当然,在开发环境下最主要的工作是输入编辑程序源代码,源代码会显示"语法着色"。在缺省情况下,代码为黑色,夹以绿色的注释和蓝色的关键字(指 VC所保留的public、private、new和int等等)。--这些地球人都知道,但是为了调试需要,我们还可以指定颜色去显示字符串、数字和运 算符。定义方法是通过Tools菜单下的Options对话框中的Format选项卡设置。
在Developer Studio提供的诸多菜单项中,我们往往对少数菜单避而不用,因为不了解它们的作用唯恐好奇心会造成乱子;还有多个菜单项都可以达到目的,至于它们之间 的微小差别则不甚了了。比如在编译和调试时常用到Build菜单组,它具有和应用程序编译、运行调试相关的多项操作:其中的Compile菜单会编译当前 的聚焦文件;Build菜单会编译和链接所有在项目中修改的文件;Build All会编译链接项目中所有文件,包括最近编译后没有修改过的文件;Batch Build用于包含有Debug和Release配置的项目;Clean会删除所有的中间和输出文件,因而项目目录下仅包含源文件;Debugger Remote Connection用于远程调试,即在一台机器运行程序而在另一台调试;Set Active Configuration可设置某个配置为激活状态(Debug或Release);Profiler能够识别应用程序的瓶颈,即找到降低程序执行速度 的代码和有关模块,为此需要在"工程/设置/Link"下勾选Profiling。
VC中的警告信息是有级别的。在"工程/设置"下的"C/C++"选项卡中的警告级别Warning Level缺省值是3,如果改为更为严格的4级,往往会产生更多的警告类错误。在C/C++选项卡中还提供了代码优化栏Optimizations,在你 完成漫漫调试之旅准备正式发布前夕,你应当改动此项,它提供了一些适合建立发行版应用程序的优化设置。
其实,在多年以前,在软件业中针对开发具有一定规模软件项目的情况就出现了软件工程理论,以此来指导软件人员树立团队协作意识,进而保证软件项目的 协调性及进度质量等。笔者在从事VC开发中对此很有感触,而且觉得对于每个开发人员自己也应当具备一定的工程素养。比如,我们在开发初期时,应当对所编写 的有价值的源代码及时备份,即使有些代码在后续阶段似乎没有用处了也不妨“敝帚自珍”。在VC编程中我经常遇到的问题是,一个不算小的编写了很久的程序, 在稍微扩展一点功能时出现了故障,而最挠头的时花了很多时间也无法排故,所幸的是对原来的程序我还有备份,可以重新再来--功能还要加,只是还一种编程思 路去实现相同的功能。说实在的,本人在VC开发中,如果要总结“解决了多少问题”,不如说很多时候是采用"游击战"巧妙地"绕过"了一些棘手的问题。-- 尤其在软件交工处于倒计时的开发后期出现的故障,往往你已经没有时间去找到故障,而是用前一个完好的VC Project去尝试另一条捷径。
VC 调试
功能强大的vc6调试器
作者:yy2better
要成为一位优秀的软件工程师,调试能力必不可缺。本文将较详细介绍VC6调试器的主要用法。
windows平台的调试器主要分为两大类:
1 用户模式(user-mode)调试器:它们都基于win32 Debugging API,有使用方便的界面,主要用于调试用户模式下的应用程序。这类调试器包括Visual C++调试器、WinDBG、BoundChecker、Borland C++ Builder调试器、NTSD等。
2 内核模式(kernel-mode)调试器:内核调试器位于CPU和操作系统之间,一旦启动,操作系统也会中止运行,主要用于调试驱动程序或用户模式调试 器不易调试的程序。这类调试器包括WDEB386、WinDBG和softice等。其中WinDBG和softice也可以调试用户模式代码。
国外一位调试高手曾说,他70%调试时间是在用VC++,其余时间是使用WinDBG和softice。毕竟,调试用户模式代码,VC6调试器的效率 是非常高的。因此,我将首先在本篇介绍VC6调试器的主要用法,其他调试器的用法及一些调试技能在后续文章中阐述。
一 位置断点(Location Breakpoint)
大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有限。譬如下面这段代码:
void CForDebugDlg::OnOK()
{
for (int i = 0; i < 1000; i++) //A
{
int k = i * 10 - 2; //B
SendTo(k); //C
int tmp = DoSome(i); //D
int j = i / tmp; //E
}
}
执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何 运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。这样手要不停的按,很痛苦。使用VC6断点修饰条件就可以轻易解决此问 题。步骤如下。
1 Ctrl+B打开断点设置框,如下图:
Figure 1设置高级位置断点
2 然后选择D行所在的断点,然后点击condition按钮,在弹出对话框的最下面一个编辑框中输入一个很大数目,具体视应用而定,这里1000就够了。
3 按F5重新运行程序,程序中断。Ctrl+B打开断点框,发现此断点后跟随一串说明:...487 times remaining。意思是还剩下487次没有执行,那就是说执行到513(1000-487)次时候出错的。因此,我们按步骤2所讲,更改此断点的 skip次数,将1000改为513。
4 再次重新运行程序,程序执行了513次循环,然后自动停在断点处。这时,我们就可以仔细查看DoSome是如何返回0的。这样,你就避免了手指的痛苦,节省了时间。
再看位置断点其他修饰条件。如Figure 1所示,在“Enter the expression to be evaluated:”下面,可以输入一些条件,当这些条件满足时,断点才启动。譬如,刚才的程序,我们需要i为100时程序停下来,我们就可以输入在编辑框中输入“i==100”。
另外,如果在此编辑框中如果只输入变量名称,则变量发生改变时,断点才会启动。这对检测一个变量何时被修改很方便,特别对一些大程序。
用好位置断点的修饰条件,可以大大方便解决某些问题。
二 数据断点(Data Breakpoint)
软件调试过程中,有时会发现一些数据会莫名其妙的被修改掉(如一些数组的越界写导致覆盖了另外的变量),找出何处代码导致这块内存被更改是一件棘手的 事情(如果没有调试器的帮助)。恰当运用数据断点可以快速帮你定位何时何处这个数据被修改。譬如下面一段程序:
#include "stdafx.h"
#include
int main(int argc, char* argv[])
{
char szName1[10];
char szName2[4];
strcpy(szName1,"shenzhen");
printf("%s\n", szName1); //A
strcpy(szName2, "vckbase"); //B
printf("%s\n", szName1);
printf("%s\n", szName2);
return 0;
}
这段程序的输出是
szName1: shenzhen
szName1: ase
szName2: vckbase
szName1何时被修改呢?因为没有明显的修改szName1代码。我们可以首先在A行设置普通断点,F5运行程序,程序停在A行。然后我们再设置一个数据断点。如下图:
Figure 2 数据断点
F5继续运行,程序停在B行,说明B处代码修改了szName1。B处明明没有修改szName1呀?但调试器指明是这一行,一般不会错,所以还是静 下心来看看程序,哦,你发现了:szName2只有4个字节,而strcpy了7个字节,所以覆写了szName1。
数据断点不只是对变量改变有效,还可以设置变量是否等于某个值。譬如,你可以将Figure 2中红圈处改为条件”szName2[0]==''''y''''“,那么当szName2第一个字符为y时断点就会启动。
可以看出,数据断点相对位置断点一个很大的区别是不用明确指明在哪一行代码设置断点。
三 其他
1 在call stack窗口中设置断点,选择某个函数,按F9设置一个断点。这样可以从深层次的函数调用中迅速返回到需要的函数。
2 Set Next StateMent命令(debug过程中,右键菜单中的命令)
此命令的作用是将程序的指令指针(EIP)指向不同的代码行。譬如,你正在调试上面那段代码,运行在A行,但你不愿意运行B行和C行代码 ,这时,你就可以在D行,右键,然后“Set Next StateMent”。调试器就不会执行B、C行。只要在同一函数内,此指令就可以随意跳前或跳后执 行。灵活使用此功能可以大量节省调试时间。
3 watch窗口
watch窗口支持丰富的数据格式化功能。如输入0x65,u,则在右栏显示101。
实时显示windows API调用的错误:在左栏输入@err,hr。
在watch窗口中调用函数。提醒一下,调用完函数后马上在watch窗口中清除它,否则,单步调试时每一步调试器都会调用此函数。
4 messages断点不怎么实用。基本上可以用前面讲述的断点代替。
总结
调试最重要的还是你要思考,要猜测你的程序可能出错的地方,然后运用你的调试器来证实你的猜测。而熟练使用上面这些技巧无疑会加快这个过程。最后,大家如果有关于调试方面的问题,我乐意参与探讨。