存档在 ‘学习笔记’ 分类

Google C++规范学习笔记

2012年4月24日
1、对单参数构造函数使用C++关键字explicit    explicit Foo(string name);
2、仅在代码中需要拷贝一个类对象的时候使用拷贝构造函数;不需要拷贝时应使用
DISALLOW_COPY_AND_ASSIGN。应在类的private:中使用,作为类的最后部分。
3、使用static_cast<>()等C++的类型转换,不要使用int y = (int)x 或int y = int(x);
4、dynamic_cast:除测试外不要使用,除单元测试外,如果你需要在运行时确定类型信
息,说明设计有缺陷

5、不要使用流,除非是日志接口需要,使用printf 之类的代替。

6、我们强烈建议你在任何可以使用的情况下都要使用const。
7、尽可能用sizeof(varname)代替sizeof(type)。
8、变量名一律小写,单词间以下划线相连,类的成员变量以下划线结尾

9、变量(含类、结构体成员变量)、文件、命名空间、存取函数等使用全部小写+下划线,
类成员变量以下划线结尾,全局变量以g_开头;
10、普通函数、类型(含类与结构体、枚举类型)、常量等使用大小写混合,不含下划线;
11、只使用空格,每次缩进2 个空格。使用空格进行缩进,不要在代码中使用tabs,设定编辑器将tab 转为空格。
12、头文件顺序:本cpp对应文件、C 系统文件、C++系统文件、其他库头文件、本项目内头文件
13、不能在.h 文件中使用不具名命名空间。
14、结论:不要将嵌套类定义为public,除非它们是接口的一部分,比如,某个方法使用了这
个类的一系列选项。
15、使用Init()方法集中初始化为 有意义的(non-trivial) 数据
16、所以按引用传递的参数必须加上const。

GDB学习笔记

2011年2月16日

一些参考网页:
8 gdb tricks you should know
学习使用 GNU GDB Debugger
GDB中应该知道的几个调试方法

用GDB调试程序系列:  http://blog.csdn.net/haoel/archive/2003/07/02/2879.aspx

Two more very useful tricks:

1. Setting hardware breakpoints on data does not slow program execution and stops when the specific variable is modified. Sometimes gdb automatically sets HW breakpoint when you say watch . Sometimes you have to force it by using something like:

set x = &
watch *$x

2. You can set an “ignore count” on any breakpoint using “ignore “. GDB will stop after the breakpoint was hit that many times. The standard way to use this is to set the ignore count very high (say, 9999), run the program till it crashes or otherwise stops after an interesting event, and then use “info bp ” to determine how many times the breakpoint was hit. Then set the ignore count to that number -1 and rerun. The debugger will stop just before the interesting event.

GDB Essential commands

The command set of GDB really is quite concise and intuitive,
so learn it now so you don’t have to when things are going pear shaped!

Command Abbrev Description
set args set command args. Also can do: gdb –args command arg1 …
break b set breakpoint (at function, line number, …)
disable dis disable breakpoints (all by default)
enable en enable breakpoints (all by default)
run r (re)start execution
continue c continue execution
step s next line
next n next line without recursing into functions
finish fin next line after this function returns
until <line> continue execution until line number
list l show source (for line, function, offset, …)
backtrace bt show the stack of functions. Add “full” to include local variables
thread apply all bt t a a bt show the stack of functions in all threads
print var p display a variable. Use p/x for hex
x/16xb <addr> hexdump 16 bytes at address
watch wa break when variable changes value
display disp display expression each time program stops
info locals inf loc display local variables
help … h display online help
focus next fs n switch window (allows cursor keys in CMD window for e.g.)
[Ctrl-x a] toggle the text windowing interface
[Ctrl-L] redraw the display (if program outputs for example)
[Return] repeat the last command

Gratuitous ARP

2011年2月14日

以太网中为什么要用到Gratuitous ARP(以下简称GARP)呢?

第一,主机可以通过GARP向网络发送广播,以告诉整个广播域,目前某个IP所对应的MAC地址是什么——这一行为就像是在发宣传单,而宣传单是不需要回应的。

第二,主机是想看看广播域内有没有别的主机使用自己的IP地址,如果使用了,则在界面上弹出“IP冲突”字样。普通ARP请求报文广播发送出去,广播域内所有主机都会接收到,计算机系统判断ARP请求报文中的目的IP地址字段,如果发现和本机的IP地址相同,则将自己的MAC 地址填写到该报文的目的MAC地址字段,并将该报文发回给源主机。所以只要发送ARP请求的主机接收到报文,则证明广播域内有别的主机使用和自己相同的 IP地址(这里不考虑路由器的ARP代理问题)。免费ARP的报文发出去是不希望收到回应的,只希望是起宣告作用;如果收到回应,则证明对方也使用自己目前使用的IP地址,

Gratuitous ARP could mean both gratuitous ARP request or gratuitous ARP reply. Gratuitous in this case means a request/reply that is not normally needed according to the ARP specification (RFC 826) but could be used in some cases. A gratuitous ARP request is an AddressResolutionProtocol request packet where the source and destination IP are both set to the IP of the machine issuing the packet and the destination MAC is the broadcast address ff:ff:ff:ff:ff:ff. Ordinarily, no reply packet will occur. A gratuitous ARP reply is a reply to which no request has been made.

用Matlab处理Dicom图像

2010年4月14日

最近在处理CT图像时,CT图像是对人体进行逐层扫描的,在图像有很多不需要的部分,比如肋骨部分就夹杂在里面,导致三维重建出来的图像有很多不需要的部分。很不好处理。

于是,我就想了了简单方法,对一张一张的dicom格式的图像,把里面不需要的像素点都置为黑色,这样就可以了。原打算用VC++6.0+VTK来实现的,调试起来太麻烦了,就直接用matlab来处理就简单了。

1。读写Dicom格式的图像

I=dicomread('E:CT37222.dcm');   %读取图像
metadata = dicominfo('E:CT37222.dcm');%存储信息
imagesc(I);%显示图像

dicomwrite(I, 'E:CT37222.dcm',metadata);%写入Dicom图像

2.在Dicom图像上面进行选取需要的矩形区域

这个代码实现很简单,找到这个方法也费了一些波折

[xv,yv] = ginput(2);  %这样就可以在图像上面选取2个点,将X坐标保存到xv中,将y坐标保存到yv中。

如果有很多点形成一个矩形区域的话,可以用  in = inpolygon(x,y,xv,yv); 来判断,x,y坐标是否在选取的点围成的区域中。

image

君子抉(4月28日)

2008年4月28日

已经好几天没写了,今天也不知道是第几天,重新开始写.

今天上午听老师讲课一直昏昏沉沉的,还不如自己看书了.今天看的是php和mysql一起的.

主要是创建表单,函数,默认参数,日期和时间.再就是mysql中的SQL语句.

1.创建和调用函数

fuction  function_name()

{

//function code

}

2.函数代码的执行时间发生在调用函数时,而不是定义函数时.因此只需要在调用一个引用的全局变量的函数之前,定义改全局变量即可.

3.避开使用全局变量作用域的另一个方法是按引用(而不是按值)传递一个变量.

4.Unix Epoch 时间戳是1970年1月一日0点起所经过的秒数.

5.mysql中char与varchar的区别:存储为char的任何内容总是被存储为列长度的字符串(使用空格填充它),想法,varchar字符串只与存储的字符串本身一样长.在检索数据时,Mysql会删除char列中多余的空格,对应varchar列,这种操作则会发生在插入数据时.

6.在mysql中使用enum.如: gender  ENUM(‘M’,’F’) default ‘F’

7.user_id是用户表的主键(PRIMARY KEY),对该列添加了AUTO_INCREMENT,就相当与标识种子

8.升序ASC(默认),降序DESC

9.MYSQL中限制查询结果数

select *from tablename LIMIT 10    只查询前10条记录

select *from tablename LIMIT 10,20    从第11条记录开始(数据库中索引从0开始),一共返回20条记录.

10.使用别名 as

11.从表中获取随机的一行  SELECT  * from users ORDER BY RAND() LIMIT 1

忙里偷闲4.22

2008年4月23日

昨天从上午起床到晚上就一直在忙,晚上停了电发现自己今天还是忙的时候少,闲的时候多啊.大清早的起来让兴旺帮我写论文,我在编自动下载的程序,感觉到了最后更本不能实现了就让兴旺画了张流程图,我再贴上代码糊弄了一下.然后去上课,今天第一节接口听得不大明白了,感觉自己缺了不少课了,过一段时间再把它拾回来.第二节是孔老师的C#,讲得挺没意思的.我就自己看书,结果过了一会,我就看不下去了.她在讲我写的上机作业,心中窃喜,原来把我的作业当作样本讲啊.她没说是谁做到,不过有不少人看过我代码,明白是我的.在讲的时候,还把我的一个概率分布给讲错了,我的都是设计好的,让她给想象成另一个样了.不过我也没说,别人看过的没多少明白的,关键是我没有写注释和帮助.讲完了我的两个程序,我也看不下去书了,就和张超在那聊天.听他说,他想去做一个类似于QQ的聊天、传文件的软件,想把它发布到华军上,说要能做个东西并发布到网上,大学四年也算是没有白上了。我想也是,都快三年了,也没有一个什么正式的成果出来。我和他说,要做就做个跨平台的,他说他用java做,我想我俩一块做,我换个语言,看是用C还是用C#做。到了中午,把上午写的东西和兴旺写的和到一块,然后再把东西改了改,都差不多了,结果wp打电话来了,让我下去,没办法就下去和wp去了网络楼。去了网络楼又去了水化楼,那两个老师也挺能磨的,搞了半天,最后我找了个机会逃了出来,直奔科学实验楼。结果去了才知道,兴旺早就去了,都在门口睡着了,让曹乐就叫醒的,这都怪我不好的。之后我就帮兴旺改论文,改着改着就去拿着小车去照相。隔行如隔山,虽说以前都一个专业的,但还是很多都不大明白,只能简单的改了改。也不知怎么弄的,也没改多少,在五楼也没干什么事就到了6点半去吃饭了。回去实验室也没过多久就回来了。回来途中,还照了几张像,感觉有那种老相片的味道在里面。回来了也没干多少事,帮兴旺改了改ppt,看了看肖东光的科技立项,感觉挺不错的,一个示波器包含能想到的功能,还有更多想不到的功能也有。再就看了另一个科技立项的,也很好用的是太阳能电池板,好几百一个的东西,还有遥控控制、光控等功能。
今天学习的内容:
DetailsView的分页 显示 排序等功能.
写完了,突然感觉今天写的完全就是记流水账.

君子抉第三天(4月20日)

2008年4月21日

本来应该在4月20日写的,由于种种原因没有写,今天将它补起来.这是正式的按君子抉中的计划来写博客的第二天,今天搞那个垂直搜索搞了一上午,以前还感觉搞这个有点激情,现在感觉完全是一种累赘,还得写文档,麻烦啊.下午才干了点真正有点意思的东西—–flex.

以前从来没有接触过flex,那次听兴旺说要做一个自动的词法分析器,用flex来实现,研究了半天,最后总算明白了.而且今天我才明白原来编程最痛苦的事不是代码怎么写,而是在哪里编写代码.刚开始在网上搜索了半天,都是讲解flex的程序怎么编写,就是没说,写了在哪里进行编译.最后找了半天,明白了.

先下载flex-2.5.4a-1.exe,然后进行安装,我是安装到了D:GnuWin32,然后在环境变量的path加上一句:  ;D:GnuWin32bin

再到DOS命令下进行测试安装好了没有,输入 flex -V 即可.这个是大写V.之后就是编写.l文件.编写好.l文件之后,在DOS命令行下定位到你的.l文件的目录,让后输入flex test.l 回车即可.这里test.l是你的.l文件的文件名.让后在test.l文件的同一目录就会生成一个 lex.yy.c.这个文件就可以在Visual Studio中进行编译了.下面这个是我改写的词法分析器的flex的.l文件的代码.

%{
#include
<stdio.h>
#include
<stdlib.h>
/*保留字*/
#include
<string.h>
char *key[]={ ,auto,break,case,char,const,continue,default,do,double,
else,enum,extern,float,for,goto,if,int,long,register,
return,short,signed,sizeof,static,struct,switch,typedef,
union,unsigned,void,volatile,while};  

int IsKeyWord(char *lex) ;/* 判断字符串是否是保留字 */void print();                            //输出token序列;
void main(int argc,char*argv[]);         //主函数;
struct token{                            //二元组;
      char*idproperty;    //token属性值;
      char*idname;    //识别的token名字;
}entity[1000];     //定义1000个这样的token,大小可改变;
char*filename;                           //保存结果的文件名;
int errnum=0;     //错误token的数目;
int value;     //属性值int型;
int linenum=1;     //行数;
int count=0;     //token的个数;
int flag=0;
FILE
*fpin;     //测试文件指针;
FILE*fpout;     //结果文件指针;
%}
digit         [
09]
letter        [_a
zAZ]
number        {digit}
+
identifier    {letter}({letter}
|{digit})*
wrongid       ({digit}
+){letter}({letter}|{digit})*
newline       [n]
whitespace    [t]
+
allchar             [
^0]|0
string_l            
{allchar}?
%%
{string_l}        {value
=6;print();}                                            //字符串常量
{identifier}   {value=IsKeyWord(yytext); print();}  //标识符—0 关键字—1
{wrongid}   {value=7;print();}                                        //错误标识符
{number}   {value=2;print();}                                            //数字常量
++         |
         |
->      |
&&    |
||    |
<=    |
==       |
!=    |
>=    |
>>    |
<<    |
*=    |
/=    |
%=      |
+=    |
-=    |
&=    |
|=    |
^=                    {value=4;print();}            /*组合运算符*/
+            |
            |
*            |
/         |
!    |
%     |
&     |
|                   {value=3;print();}                                /*基本运算符*/
,            |
;            |
{            |
}            |
(            |
)            |
.            |
#            |
              {value=5;print();}                /*分界符*/
{newline}   {linenum
+=1;}
{whitespace}   {;}
     {;}
.    {value
=7;print();}                 /*其他不识别*/
%%
int yywrap()
{
fclose(fpin);
return 1;
}
 

void print()
{
count
+=1;
if(flag!=1){
if((fpout=fopen(filename,a))==NULL){
printf(
无法打开文件! n);
exit(
0);
}
}
if(value<=6){
switch(value){
case 0:entity[count1].idproperty=标识符;break;
case 1:entity[count1].idproperty=关键字;break;
case 2:entity[count1].idproperty=数字常量;break;
case 3:entity[count1].idproperty=基本运算符;break;
case 4:entity[count1].idproperty=组合运算符;break;
case 5:entity[count1].idproperty=分界符;break;
case 6:entity[count1].idproperty=字符串常量;break;
}
entity[count
1].idname=yytext;
fprintf(fpout,
%d < %s , %s > n,count,entity[count1].idname,entity[count1].idproperty);
}
else{
errnum
+=1;
switch(value){
case 8:entity[count1].idproperty=错误标识符:;break;
case 7:entity[count1].idproperty=不识别:;break;
}
entity[count
1].idname=yytext;
fprintf(fpout,
%d [line:%d]:%s%s n,count,linenum,entity[count1].idproperty,entity[count1].idname);
}
if(flag!=1)fclose(fpout);
}
/* 判断字符串是否是保留字 *//*    如果不是就返回 0 */int IsKeyWord(char *lex)
{
int i;
for( i=1;i<=32;i++)
{
if(strcmp(lex,key[i]) == 0)
return 1;
}
return 0;
}
void main(int argc,char*argv[])
{
if(argc==1){
printf(
please input the C program(ctrl+z to end) n);
flag
=1;
fpin
=stdin;
fpout
=stdout;
}
if(argc==2)argv[2]=defresult.txt;
filename
=argv[2];
if(flag!=1){
if((fpin=fopen(argv[1],r))==NULL){
printf(
cannot open the file n);
exit(
0);
}
}
yyin
=fpin;
yylex();
if(flag!=1){
if((fpout=fopen(filename,a))==NULL){
printf(
cannot write the file n);
exit(
0);
}
}
fprintf(fpout,
n);
fprintf(fpout,
%d symbol(s) found. n %d error(s) found. n,count,errnum);
fprintf(fpout,
======================================================================= n);
if(flag!=1)fclose(fpout);
yywrap();
}

 

image004 image002

君子抉第二天(4月19日)

2008年4月21日

本来应该在4月19日写的,由于种种原因没有写,今天将它补起来.这是正式的按君子抉中的计划来写博客的第二天,今天一整天都在宿舍呢.昨天晚上和今天上午主要学习了PHP的初级使用.
在昨天晚上看了一晚上的PHP,感觉和C语言是如此的类似,虽然说这是第一次接触PHP,但看到了其中的语法感觉非常的亲切.就像C语言似的.
读书笔记:
1.PHP的基本语法,变量,数字,常量,单引号和双引号.
其中单引号与双引号的区别:单引号的值按照字面意思进行处理,而封闭在双引号中的值怎被PHP解释.
2.PHP进行基本编程,条件语句,运算符,数组,for和while
isset($var):如果$var具有不同于NULL的任何值,包括0和空串
($var):如果$var具有非0值,空字符串,或是null怎条件为真.
访问数组  foreach($array as $value){//….}
foreach($array as $key=>value{//….}

今天搜索引擎备忘

2008年4月20日

修改SQL语句,以前老以为数据库自动做好了优化工作,其实不然,在修改后的SQL语句,可以很快实现.

‘tSql=”select ArticleUrl,Title,NewsTime,Source from mynews where ID in (select distinct urlID from UrlWord where word='”+ sKey +”‘);”
tSql=” select ArticleUrl,Title,NewsTime ,Source from mynews where Title like  ‘%” + sKey +”%’ Union   All  select ArticleUrl,Title,NewsTime,Source from mynews where ID in (select distinct urlID from UrlWord where word='”+ sKey +”‘);”

利用游标来增加数据到mynews表中

declare newsie_cur cursor
for
select ArticleUrl,Title,NewsTime from  newsie

open newsie_cur
declare @ArticleUrl nvarchar(255),@Title nvarchar(255),@NewsTime datetime
fetch next from newsie_cur into @ArticleUrl,@Title,@NewsTime
while(@@fetch_status=0)
begin
fetch next from newsie_cur into @ArticleUrl,@Title,@NewsTime
insert into mynews(ArticleUrl,Title,NewsTime,Source) values( @ArticleUrl,@Title,@NewsTime,’信息工程学院’)
end

close news_cur

4_16 ASP.NET2.0学习

2008年4月16日

GridView控件的使用方法及练习

1.不编写代码制作简单的数据编辑、显示、删除的页面。

A。Web Config存储连接字符串的方法
http://www.coolsdu.cn/pjblog/article.asp?id=36

B。用GridView连接SqlDataSource,直接选择数据源即可。在代码中是

<asp:GridView ID=”GridView1″ runat=”server” AutoGenerateColumns=”False” DataKeyNames=”UserID”
DataSourceID=”SqlDataSource1″

C。直接利用向导生成GridView的代码。

D。右键显示智能标记可以看到启用分页,启用排序的选项。

GridView分页

当GridView的AllowPaging属性设置为True的时候,我们实现了分页,我们还可以对分页进行一些个性化的设置。常用的属性包括:PageIndex――设置数据显示的当前页面,默认是0,也就是数据的首页。PageSize ――也就是一页显示多少条记录,默认为10条。在PagerSettings中,还可以对分页的导航按钮进行详细设置,在Mode属性中,可以设置:Numeric――默认的,分页用数字表示,1,2,3……。NextPrevious、NextPreviousFirstLast、NumericFirstLast均可顾名思义,显示上一页、下一页、首页、末页等。当Mode设定不是Numeric时,那么可以通过设定FirstPageText、LastPageText等属性来实现分页导航时,到首页、末页、下页、上页时显示的文字提示。
如果想实现分页界面的完全自动控制,还可以点击GridView右键,选择编辑模版-PagerTemplate来实现,在模版中加入若干个Button控件,然后将Button控件的CommandName属性设置为Page,将CommandArgument属性分别设置为First、Last、Prev、Next或者一个数字,即可实现分页操作。

GridView中的编辑、删除、排序

与分页类似,直接在显示智能标记中有启用编辑,启用删除(必须是对应的SqlDataSource1有DeleteCommand、UpdateCommand)

GridView中的自定义列

我们现在假设有一个表,其中有一个字段是username,我们现在产生一个自定义列,自定义列中包括一个操作,删除此用户。我们首先右键点击GridView,在智能标记中,选择编辑列,添加一个模版列,然后编辑模版中的ItemTemplate,加入一个ImageButton控件,点击该控件即可修改ImageUrl、AlternateText、CommandArgument、CommandName。
其中ImageUrl—图像的URL  AlternateText—相当于alt   CommandName–按钮的名字 CommandArgument–该按钮的参数
在这里把这个参数绑定到 UserID。绑定方法:CommandArgument='<%# DataBinder.Eval(Container.DataItem,”UserID”) %>’。如果单向绑定,一般采用Eval,也就是说数值只从数据源传到页面上,如果双向绑定,也就是采用Bind的话,对数据的修改可以回传到数据源之中。

<asp:TemplateField HeaderText=”操作”>
<ItemTemplate>
<asp:ImageButton id=”deleteBtn” ImageUrl=”~/images/delete.gif” AlternateText=”删除此项” runat=”server”  CommandName=”delete” CommandArgument='<%# DataBinder.Eval(Container.DataItem,”UserID”) %>’ /></ItemTemplate>
<ItemStyle Width=”300px” BorderWidth=”1px” HorizontalAlign=”Center” />
<HeaderStyle HorizontalAlign=”Center” />
</asp:TemplateField>

GridView中的RowDataBound事件

在创建gridView控件时,必须先为GridView的每一行创建一个GridViewRow对象,创建每一行时,将引发一个RowCreated事件;当行创建完毕,每一行GridViewRow就要绑定数据源中的数据,当绑定完成后,将引发RowDataBound事件。如果说我们可以利用RowCreated事件来控制每一行绑定的控件,那么我们同样可以利用RowDataBound事件来控制每一行绑定的数据,也就是让数据如何呈现给大家。
在这里点击这个删除图片后,一般弹出一个对话框,这就需要没一行的图片都需要添加这样的javascript,

protected void UserView_RowDataBound(object sender, GridViewRowEventArgs e)
{

///找到删除按钮
ImageButton deleteBtn = (ImageButton)e.Row.FindControl(“DeleteBtn”);
if (deleteBtn != null)
{
///添加删除确认对话框
deleteBtn.Attributes.Add(“onclick”, “return confirm(‘你确定要删除所选择的数据项吗?’);”);
}

}

GridView中的RowCommand事件

在点击这个删除图片按钮后就会触发一个RowCommand。在设置删除图片按钮有这两个CommandArgument、CommandName参数,这里就用得到了。

protected void UserView_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == “delete”)
{
///删除数据
User user = new User();               //这里是后台代码,删除用户的类,未实现
user.delUser(Int32.Parse(e.CommandArgument.ToString()));

///重新绑定控件的数据
BindUserData();
Response.Write(“<script>alert(‘” + “删除数据成功,请妥善保管好你的数据!” + “‘);</script>”);
}
}

 

作业:参考上面的制作方法,制作一个类似的用户管理的页面(主要是那个删除图片按钮),可以扩充功能。

参考页面:

image