跨越时空_百度空间
 
日历
 
     
 
背景音乐
 
     
 
最近访客
 
 

jessefy

ddjunshuhong

babyrjw

han_shan_zi

425362322

cqdengdeng

xjl0851

zhu9207
     
 
留言板
 
     
 
最新评论
 
     
 
订阅我的空间
 
已有人次访问本空间
 
订阅RSS  什么是RSS?

您也想拥有这样的空间?请点此申请。
     
 
 
文章列表
 
2011-04-16 23:58

数据结构与算法分析–C++描述 PDF中文电子书http://www.piaoxu.net/13029.html

数据结构与算法 C++描述http://www.infoxa.com/asp/book_file/xxnr_book_3001.htm

数据结构-(C++语言版)》电子书http://www.q766.com/soft/1539632.htm

《设计模式》 pdf电子书中文版http://www.rsdown.cn/downinfo/1310.html

设计模式解析(第二版) pdf格式http://www.7747.net/ebook/201008/22340.html

设计模式(好书!!)http://www.infoxa.com/asp/book_file/xxnr_book_642.htm

设计模式,电子书(pdf) http://www.7880.com/Download/design-patterns-635.html(点击右键迅雷下载)

 

 

 

 

 
2010-05-24 13:50

<style type="text/css" media="screen">

如果需要支持老版本的浏览器,那你就必须坚持使用css1的媒体描述符screen和print。它们是相互排斥的,因此在为屏幕显示而生成页面的时候,浏览器会忽略掉打印样式表,反之亦然。所以,每个样式表都需要包含相同的样式选择器,但是有不同的规则声明,以便为不同的输出设备分别生成页面样式。

screen (缺省值),提交到计算机屏幕; print, 输出到打印机; projection,提交到投影机; aural,扬声器; braille,提交到凸字触觉感知设备; tty,电传打字机 (使用固定的字体); tv,电视机; all,所有输出设备。

 
2010-03-13 16:55

ntohs =net to host short int 16位
htons=host to net short int 16位
ntohs =net to host long int 32位
htonl=host to net

long int   32位
简述:
     将一个无符号短整形数从网络字节顺序转换为主机字节顺序。
     #include
     u_short PASCAL FAR ntohs( u_short netshort);
     netshort:一个以网络字节顺序表达的16位数。
注释:
     本函数将一个16位数由网络字节顺序转换为主机字节顺序。
返回值:
     ntohs()返回一个以主机字节顺序表达的数。

将主机的无符号短整形数转换成网络字节顺序。
#include
u_short PASCAL FAR htons( u_short hostshort);
hostshort:主机字节顺序表达的16位数。
注释:
本函数将一个16位数从主机字节顺序转换成网络字节顺序。
返回值:
htons()返回一个网络字节顺序的值。

这2个函数提供了主机字节顺序与网络字节顺序的转换

比如网络字节 为 00 01
u_short     a;如何直接对应的话     a=0100; 为什么呢?因为主机是从高字节到低字节的,所以应该转化后
a=ntohs(0001); 这样 a=0001;

首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地址"132.241.5.10" 要储存在其中,你就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 160%; ">注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用函数htonl()。
我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特 错!记住要先进行错误检查。
好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢?它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数 inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:
printf("%s",inet_ntoa(ina.sin_addr));
它将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用 inet_ntoa(),它就将覆盖上次调用时所得的IP地址。例如:
char *a1, *a2;
.
.
a1 = inet_ntoa(ina1.sin_addr);
a2 = inet_ntoa(ina2.sin_addr);
printf("address 1: %s ",a1);
printf("address 2: %s ",a2);
输出如下:
address 1: 132.241.5.10
address 2: 132.241.5.10
假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符指针。
***********************************************************************************************************************************
htonl()表示将32位的主机字节顺序转化为32位的网络字节顺序 htons()表示将16位的主机字节顺序转化为16位的网络字节顺序(ip地址是32位的端口号是16位的 )
inet_ntoa()
简述:
     将网络地址转换成“.”点隔的字符串格式。
     #include
     char FAR* PASCAL FAR inet_ntoa( struct in_addr in);
     in:一个表示Internet主机地址的结构。
注释:
     本函数将一个用in参数所表示的Internet地址结构转换成以“.” 间隔的诸如“a.b.c.d”的字符串形式。请注意inet_ntoa()返回的字符串存放在WINDOWS套接口实现所分配的内存中。应用程序不应假设该内存是如何分配的。在同一个线程的下一个WINDOWS套接口调用前,数据将保证是有效。
返回值:
     若无错误发生,inet_ntoa()返回一个字符指针。否则的话,返回NVLL。其中的数据应在下一个WINDOWS套接口调用前复制出来。
参见:
     inet_addr().

测试代码如下
include
#include
#include
#include
p: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 160%; ">int main(int aargc, char* argv[])
{
         struct in_addr addr1,addr2;
         ulong   l1,l2;
         l1= inet_addr("192.168.0.74");
         l2 = inet_addr("211.100.21.179");
         memcpy(&addr1, &l1, 4);
         memcpy(&addr2, &l2, 4);
         printf("%s : %s ", inet_ntoa(addr1), inet_ntoa(addr2));     //注意这一句的运行结果
         printf("%s ", inet_ntoa(addr1));
         printf("%s ", inet_ntoa(addr2));
         return 0;
}
实际运行结果如下:
192.168.0.74 : 192.168.0.74       //从这里可以看出,printf里的inet_ntoa只运行了一次。
192.168.0.74
211.100.21.179
inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。

inet_aton,inet_addr和inet_ntoa在点分十进制数串(如,“192.168.1.10")与他的32位网络字节二进制值之前转换IPV4地址,有2个比较新的函数inet_pton和inet_ntop,这2个对IPV4和IPV6地址都能处理
       #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>

       int inet_aton(const char *cp, struct in_addr *inp);

       in_addr_t inet_addr(const char *cp);

       char *inet_ntoa(struct in_addr in);

inet_aton() converts the Internet host address cp from the standard
       numbers-and-dots notation into binary data and stores it in the struc‐
       ture that inp points to. inet_aton() returns non-zero if the address is
       valid, zero if not.

inet_aton() 转换网络主机地址cp为二进制数值,并存储在struct in_addr结构中,即第二个参数*inp,函数返回非0表示cp主机有地有效,返回0表示主机地址无效。

The inet_addr() function converts the Internet host address cp from
       numbers-and-dots notation into binary data in network byte order.   If
       the input is invalid, INADDR_NONE (usually -1) is returned. This is an
       obsolete interface to inet_aton(), described immediately above; it is
       obsolete   because   -1 is a valid address (255.255.255.255), and
       inet_aton() provides a cleaner way to indicate error return.
inet_addr函数转换网络主机地址(如192.168.1.10)为网络字节序二进制值,如果参数char *cp无效,函数返回-1(INADDR_NONE),这个函数在处理地址为255.255.255.255时也返回- 1,255.255.255.255是一个有效的地址,不过inet_addr无法处理;

The inet_ntoa() function converts the Internet host address in given in
       network byte order to a string in standard numbers-and-dots notation.
       The string is returned in a statically allocated buffer, which subse‐
       quent calls will overwrite.
inet_ntoa 函数转换网络字节排序的地址为标准的ASCII以点分开的地址,,该函数返回指向点分开的字符串地址的指针,该字符串的空间为静态分配的,这意味着在第二次调用该函数时,上一次调用将会被重写(复盖),所以如果需要保存该串最后复制出来自己管理!

现在一般使用inet_aton和inet_ntoa来处理网络字节和主机字节之间的转换;

有两个更新的函数inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6,原型如下
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);

这个函数转换字符串到网络地址,第一个参数af是地址族,转换后存在dst中
inet_pton 是inet_addr的扩展,支持的多地址族有下列:

AF_INET
       src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函数将该地址
       转换为in_addr的结构体,并复制在*dst中

AF_INET6
       src为指向IPV6的地址,,函数将该地址
       转换为in6_addr的结构体,并复制在*dst中
如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。

函数inet_ntop进行相反的转换原型如下
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
这个函数转换网络二进制结构到ASCII类型的地址,参数的作用和上面相同,只是多了一个参数socklen_t cnt,他是所指向缓存区dst的大小,避免溢出,如果缓存区太小无法存储地址的值,则返回一个空指针,并将errno置为ENOSPC


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lvpwin/archive/2009/06/30/4307535.aspx

 
2010-03-13 16:00
不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
1. Little endian:将低序字节存储在起始地址
2. Big endian:将高序字节存储在起始地址

LE little-endian
最符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说
低位值小,就应该放在内存地址小的地方,也即内存地址低位
反之,高位值就应该放在内存地址大的地方,也即内存地址高位

BE big-endian
最直观的字节序
地址低位存储值的高位
地址高位存储值的低位
为什么说直观,不要考虑对应关系
只需要把内存地址从左到右按照由低到高的顺序写出
把值按照通常的高位到低位的顺序写出
两者对照,一个字节一个字节的填充进去

例子:在内存中双字0x01020304(DWORD)的存储方式

内存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04

例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
       big-endian   little-endian
0x0000   0x12       0xcd
0x0001   0x23       0xab
0x0002   0xab       0x34
0x0003   0xcd       0x12
x86系列CPU都是little-endian的字节序.

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

为了进行转换 bsd socket提供了转换的函数 有下面四个
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序

在使用little endian的系统中 这些函数会把字节序进行转换
在使用big endian类型的系统中 这些函数会定义成空宏

同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.

注:
1、网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
处理器     操作系统     字节排序
Alpha     全部     Little endian
HP-PA     NT     Little endian
HP-PA     UNIX     Big endian
Intelx86     全部     Little endian <-----x86系统是小端字节序系统
Motorola680x()     全部     Big endian
MIPS     NT     Little endian
MIPS     UNIX     Big endian
PowerPC     NT     Little endian
PowerPC     非NT     Big endian   <-----PPC系统是大端字节序系统
RS/6000     UNIX     Big endian
SPARC     UNIX     Big endian
IXP1200 ARM核心     全部     Little endian
 
2010-03-12 10:54

在VC++中,如果想要输入IP地址可使用IP地址控件,该控件是一个与编辑控件类似的控件,可用于输入IP地址。

在对话框中放入此控件后,可以为控件定义一个 CIPAddressCtrl类 的变量对它进行控制。

CIPAddressCtrl类 的主要成员函数有:

void ClearAddress();
清除IP地址控件中的内容。

BOOL IsBlank();
如果IP地址控件的所有域均为空,返回非0值;否则返回0。

void SetAddress(BYTE nField0,BYTE nField1,BYTE nField2,BYTE nField3);
void SetAddress(DWORD dwAddress);
设置IP地址控件中的地址值。
第一种形式是用4个0~255的整数分别设置IP地址各个域的值。
第二种形式是用1个长整数设置IP地址值。

int GetAddress(BYTE& nField0,BYTE& nField1,BYTE& nField2,BYTE& nField3);
int GetAddress(DWORD& dwAddress);
获取IP地址控件中的地址值。
第一种形式是把IP地址的4个域填充到用4个引用中。
第二种形式是把IP地址填充到1个长整数的引用中。
返回值:IP地址控件中非空域的数量。

void SetFieldFocus(WORD nField);
把焦点设置在指定的域中。nField取值为0~3,如果大于3,则焦点设置到第一个空域中,若所有域均非空,则焦点设置在第一个域中。

void SetFieldRange(int nField,BYTE nLower,BYTE nUpper);
设置指定域中数值的取值范围。
nField:域索引,取值0~3;
nLower:域的下限;
nUpper:域的上限。

下面的例子摹仿为计算机设置IP地址的对话框看一下IP地址控件的用法。

对话框建立后,创建一个CSetIPDialog类来控制该对话框。

为对话框中的各控件添加相应的控制变量。

SetIPDialog.h:

//{{AFX_DATA(CSetIPDialog)
enum { IDD = IDD_SETIP_DIALOG };
CIPAddressCtrl m_IPAddressCtrl3;
CIPAddressCtrl m_IPAddressCtrl2;
CIPAddressCtrl m_IPAddressCtrl1;
CStatic m_IPStatic3;
CStatic m_IPStatic2;
CStatic m_IPStatic1;
int IP_From;
//}}AFX_DATA

SetIPDialog.cpp:

void CSetIPDialog::DoDataExchange(CDataExchange* pDX)
{
     CDialog::DoDataExchange(pDX);
     //{{AFX_DATA_MAP(CSetIPDialog)
     DDX_Control(pDX, IDC_IPADDRESS3, m_IPAddressCtrl3);
     DDX_Control(pDX, IDC_IPADDRESS2, m_IPAddressCtrl2);
     DDX_Control(pDX, IDC_IPADDRESS1, m_IPAddressCtrl1);
     DDX_Control(pDX, IDC_IP_STATIC3, m_IPStatic3);
     DDX_Control(pDX, IDC_IP_STATIC2, m_IPStatic2);
     DDX_Control(pDX, IDC_IP_STATIC1, m_IPStatic1);
     DDX_Radio(pDX, IDC_IPFROM_RADIO1, IP_From);
     //}}AFX_DATA_MAP
}

m_IPAddressCtrl1对应输入IP地址的控件;

m_IPAddressCtrl2对应输入子网掩码的控件;

m_IPAddressCtrl3对应输入默认网关的控件;

变量IP_From对应于单选按钮的位置,当IP_From==0时,表示IP地址是自动获取的,此时,各IP地址控件为灰色显示,不能进行设置。当IP_From==1时,可以设置IP地址。函数EnableIP()可根据IP_From的值设置各IP地址控件的可用性:

void CSetIPDialog::EnableIP()
{
     BOOL show = (IP_From==1);
     m_IPStatic1.EnableWindow( show );
     m_IPStatic2.EnableWindow( show );
     m_IPStatic3.EnableWindow( show );
     m_IPAddressCtrl1.EnableWindow( show );
     m_IPAddressCtrl2.EnableWindow( show );
     m_IPAddressCtrl3.EnableWindow( show );
}

用ClassWizard添加单选按钮的响应函数:

//消息函数:自动获取(单选按钮)
void CSetIPDialog::OnIPFromRadio1()
{
     IP_From = 0;
     m_IPAddressCtrl1.ClearAddress();
     m_IPAddressCtrl2.ClearAddress();
     m_IPAddressCtrl3.ClearAddress();
     EnableIP();
}

//消息函数:手工配置(单选按钮)
void CSetIPDialog::OnIPFromRadio2()
{
     IP_From = 1;
     EnableIP();
     m_IPAddressCtrl1.SetFieldFocus( 0 );
}

当选中“自动获取”的单选按钮时,用ClearAddress()函数清除各IP地址控件的内容,然后把控件设置为灰色。

当选中“手工配置”的单选按钮时,让各IP地址控件可用,并且把输入焦点设置第1个IP地址控件的第0个域中。

子网掩码的输入:

按照习惯,当输入了IP地址后,只要单击输入子网掩码的IP地址控件就可以自动生成默认的子网掩码。为了实现这一点,可以用添加一个新类CSubnetMaskCtrl,基类为CIPAddressCtrl。

在该类中加入一个变量CIPAddressCtrl* p_IPAddressCtrl;

该变量是指向输入IP地址的控件的指针,用于获取控件中输入的IP地址。

在CSubnetMaskCtrl中添加一个消息函数OnSetfocus(),当子网掩码控件获得输入焦点时会执行此函数。

(注:此函数响应的是EN_SETFOCUS消息,在ClassWizard中没有此消息,所以只能手工添加。)

SubnetMaskCtrl.h:

protected:
     //{{AFX_MSG(CSubnetMaskCtrl)
     // NOTE - the ClassWizard will add and remove member functions here.
     //}}AFX_MSG
     afx_msg void OnSetfocus();
     DECLARE_MESSAGE_MAP()

SubnetMaskCtrl.cpp:

BEGIN_MESSAGE_MAP(CSubnetMaskCtrl, CIPAddressCtrl)
     //{{AFX_MSG_MAP(CSubnetMaskCtrl)
         // NOTE - the ClassWizard will add and remove mapping macros here.
     //}}AFX_MSG_MAP
     ON_CONTROL_REFLECT(EN_SETFOCUS, OnSetfocus)
END_MESSAGE_MAP()

void CSubnetMaskCtrl::OnSetfocus()
{
     if( p_IPAddressCtrl && IsBlank() )
     {
         BYTE field0, field1, field2, field3;
         p_IPAddressCtrl->GetAddress( field0, field1, field2, field3 );
         if( field0>=1 && field0<=127 )
             SetAddress( 255, 0, 0, 0 );
         else if( field0>=128 && field0<=191 )
             SetAddress( 255, 255, 0, 0 );
         else if( field0>=192 && field0<=223 )
             SetAddress( 255, 255, 255, 0 );
     }
}

在函数中,如果子网掩码为空,就通过p_IPAddressCtrl指针获取用户输入的IP地址,然后根据IP地址的第1个数的取值设置本控件中的子网掩码默认值。

回到CSetIPDialog对话框,把用于输入子网掩码的IP地址控件的类型改为CSubnetMaskCtrl。

SetIPDialog.h:

//{{AFX_DATA(CSetIPDialog)
enum { IDD = IDD_SETIP_DIALOG };
CIPAddressCtrl m_IPAddressCtrl3;
CSubnetMaskCtrl m_IPAddressCtrl2;
CIPAddressCtrl m_IPAddressCtrl1;
CStatic m_IPStatic3;
CStatic m_IPStatic2;
CStatic m_IPStatic1;
int IP_From;
//}}AFX_DATA

用ClassWizard添加对话框的初始化函数。

BOOL CSetIPDialog::OnInitDialog()
{
     CDialog::OnInitDialog();

     m_IPAddressCtrl2.p_IPAddressCtrl = &m_IPAddressCtrl1;

     return TRUE;
}

在这里把输入IP地址的控件地址传送给子网掩码控件。

经过以上设置,该对话框就可以用来输入IP地址、子网掩码、默认网关等参数了,至于输入值的保存,可根据实际应用另行设置。

 
2010-03-12 10:53

1.通过Create函数手动创建一个IP控件.
开始时我在OnInitDialog()函数中这样写的:
CIPAddressCtrl IPAddress;
UINT nID=101;
IPAddress.Create(WS_CHILD |WS_VISIBLE ,CRect(20,20,300,43),this,nID);
但运行之后看不到有IP控件出来,后来才发现原来我的IPAddress是一个局部变量,当OnInitDialog()函数返回时,这个变量就撤销了.
所以不会有控件出来!!
只要把CIPAddressCtrl IPAddress;放到头文件中定义为成员变量就OK了!

如果上面的Create函数的第一个参数没有|WS_VISIBLE;我们可以Create函数后加这一句:IPAddress.ShowWindow(SW_SHOW);
感觉上Create函数在每一个控件里都有,创建的方法也是大同小异了吧!

2.下面的是我在基于一个对话框的工程中添加一个IP控件中所写的:
先获得控件的指针:
CIPAddressCtrl * pIP=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS);

void ClearAddress( );
这个函数将IP控件里的内容清空.
BOOL IsBlank( ) const;
这个函数是当IP控件里一个数字都没有才返回真的,全为0都返回假,0也是数字!调用ClearAddress( )后刚好可以使IsBlank()反回真.
测试代码如下:
pIP->ClearAddress();
if(pIP->IsBlank())
{
     MessageBox("IP全为空");
}

int GetAddress(BYTE& nField0, BYTE& nField1, BYTE& nField2, BYTE& nField3);
int GetAddress(DWORD& dwAddress);
当控件内容为空时,即没有数字,连0也没有,返回0,0,0,0.和控件全为0的情况一样!
获得IP地址:(两种方法,选其一)


BYTE nf1,nf2,nf3,nf4;
pIP->GetAddress(nf1,nf2,nf3,nf4);
CString str;
str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);//这里的nf得到的值是IP值了.
MessageBox(str);

/*
DWORD dw;
pIP->GetAddress(dw);
CString str;
WORD hiWord=HIWORD(dw);
WORD loWord=LOWORD(dw);
BYTE nf1=HIBYTE(hiWord);
BYTE nf2=LOBYTE(hiWord);
BYTE nf3=HIBYTE(loWord);
BYTE nf4=LOBYTE(loWord);
str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);
MessageBox(str);
*/


void SetAddress(BYTE nField0, BYTE nField1, BYTE nField2, BYTE nField3);
void SetAddress(DWORD dwAddress);
设置IP地址:(两种方法,选其一)

        pIP->SetAddress(127,0,0,1);

pIP->SetAddress((DWORD)0x7F000001);//这两行的效果都是一样的!


void SetFieldRange(int nField, BYTE nLower, BYTE nUpper);
设置每一个域的范围:(nField是0到3的值,nLower和nUpper的范围都是0到255.可以超出范围,但控件也还是默认设置回0到255的!

pIP->SetFieldRange(0,5,127);//设置每一个域的范围,第一个参数是域的下标,第二和第三个是范围.
pIP->SetFieldRange(1,5,127);//当输入比5少时,如0,当失去输入焦点时,它会重置为5.
pIP->SetFieldRange(2,5,127);//当输入比127大时,如128,它会自动变回127
pIP->SetFieldRange(3,5,127);


void SetFieldFocus(WORD nField);
nField的值为0到3;表示域的下标!该函数是使输入焦点落在四个域的指定域上;
这个函数要在消息响应时才能体现出来!
测试代码:
void CTestDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CIPAddressCtrl * pIP=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS);
pIP->SetFieldFocus(2);
}

 
2010-03-11 16:52

一.常用状态

CComboBox控件又称作组合框控件,其有三种形态可供选择:

1.简单组合框(Simple)

2.下拉组合框(Drop-down)

3.下拉列表式组合框(Drop-down list).

二.常用设置属性:

1.type属性:里面一共有三个选项.就是其三种形式, 我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,而droplist为静态控件.

2.Data属性:当程序初始化的时候,下拉列表将显示其属性里面的内容,内容用分号分隔.其属性只支持后2中形式,

3.Sort 属性:对添加到下拉列表框中的数据自动进行排序,如果你不想他改变你的显示序列,把他设置成False.

三.常用函数:

控件是一个窗口.其基类是为CWnd.所以CComboBox也可以使用CWnd的一些函数,它自己的函数有30几种.

注:m_cbox 为CComboBox控件的关联变量,m_end为EDIT控件的关联变量

1.    GetCount() 函数:

功能:用以获得列表框中的选项数目.    

原型:int GetCount() const;

示例:

int i;

     CString str;

     i=m_cbox.GetCount();

     str.Format ("%d",i);

     m_end="一共有"+str+"个数据";

UpdateData(FALSE);

2.    GetCurSel() 函数:

功能:用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1。

原型:Int GetCurSel() const

示例:

  int i;

     CString str;

     i=m_cbox.GetCurSel ();

     str.Format ("%d",i+1);

     if (i==-1) m_end="你什么都没有选";

     else m_end="你选的是第"+str+"项";

  UpdateData(FALSE);

3.    SetCurSel函数:

功能:选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;

示例:

if(m_i<3)

m_cbox.SetCurSel (m_i++);//m_i为int型变量 用以计数

else

{

     m_cbox.SetCurSel (-1);

     m_i=0;

}

4.    SetEditSel函数:

功能:设置编辑区中蓝色选中字段的长度

原型:BOOL SetEditSel( intnStartChar,int nEndChar );

说明:nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.

示例:

m_cbox.SetEditSel (3,5);//在编辑框中打入一串数字在按此按钮就能看到效果,其作用就是选中第3到第5个字符作为热点

5.    Clear() Cut() Paste() Copy()

这四个函数我放在一起说,因为他们都是针对编辑框中选定的文字进行编辑的函数,很多初学者很不明白这4个函数,使用这些函数没有作用,其实不然,这些函数对于在编辑框中的内容不进行处理,他真正处理的是你用鼠标选中的内容,对于Clear()函数很多书中解释都是有误的,很多书中对他的解释是清除当前选中的文本,我认为这样的解释是有歧异的,真正的解释是把你刚选中的文本释放掉,也就是不选,而不是把选中的删除,真正的删除选中的文本的函数是Cut(),Copy()是复制选中的文本,Paste()是粘贴到光标处.其演示就不写在程序中,有兴趣的朋友可以自己试试.

6.    LimitText()函数

功能:其作用是限制在编辑框中键入的文本长度

原型:BOOL LimitText(int nMaxChars);

说明:当nMaxChars为0时,不是不能输入,而是长度最大化为65535字节

7.    GetLBText()函数

原型:void GetLBText( int nIndex, CString&rString ).

说明:nIndex为列表框中数据的索引值,rString 为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度

示例:

      m_cbox.GetLBText (2,m_end); // GetLBText按钮

      UpdateData(0);

      CString str; //GetLBTextLen按钮

     int i=m_cbox.GetLBTextLen (2);

     str.Format ("%d",i);

     m_end=str;

     UpdateData(FALSE);

8.    AddString() DeleteString() InsertString() ResetContent() 四个函数放在一起,他们都是针对下拉列表框的处理函数,

AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串.

DeleteString(UINT nIndex)为删除指定索引为nIndex的数据. InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容.

ResetContent()是清除列表框中所有的内容.

9.    SetDroppedWidth(UINT nWidth) 函数.

用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.

 
2009-12-17 22:45

#include <winbase.h>
#include <iostream.h>
void main(void)
{
DWORD result = GetTickCount();
cout << result << endl ;

}

//这个函数用来获取系统自启动以来到目前共经历了多少毫秒,它的返回值是DWORD型,而DWORD型实际上是unsigned long型,即32位。所以能表示的最大毫秒数是232=4294967296 毫秒,而一天有:24*3600*1000 = 86400000毫秒 二者相除大约等于49.71

所以如果你的电脑连续运行的时间超过49.72天的话,那么这个函数就无能为力了,是不是归零重新计数我不知道,我也没这个条件去试。

上面的代码在编译的时候会出现74个错误,但是GetTickCount()的确是在winbase.h中定义的。为什么呢?由编译器给出的信息:

syntax error : missing ';' before identifier 'Internal'
c:\program files\microsoft visual studio\vc98\include\winbase.h(216) : error C2501: 'DWORD' : missing storage-class or type specifiers

看第二行我们知道,错误发生在winbase.h的216行,原因是它使用了DWORD类型,但是程序无法识别DWORD。所以只要在最前面加上# include <windows.h>就OK了。注意顺序不能颠倒。其实有了# include <windows.h> 这一句就足够了,完全可以不要#include <winbase.h>

 
2009-11-20 16:19

在编译VC++6.0是,出现fatal error C1010: unexpected end of file while looking for precompiled header directive
的错误.

解决方法:

1、如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的 Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。确定。

2、在文件开头添加:
#include "stdafx.h"

对预编译头文件说明如下:  
   
所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。  
   
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。  
   
编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include   "stdafx.h"前的代码都是预编译的,它跳过#include   "stdafx.   h"指令,使用projectname.pch编译这条指令之后的所有代码。  
   
因此,所有的CPP实现文件第一条语句都是:#include   "stdafx.h"。   

 
2009-11-17 19:04
一、Windows Sockets API简介
VC++对网络编程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等。其中,Windows Sockets API是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。最早美国加州大学Berkeley分校在UNIX下为TCP/IP协议开发了一个API,这个API就是著名的Berkeley Socket接口(套接字)。
在桌面操作系统进入Windows时代后,仍然继承了Socket方法。在TCP/IP网络通信环境下,Socket数据传输是一种特殊的I/O,它也相当于一种文件描述符,具有一个类似于打开文件的函数调用-socket()。

可以这样理解:Socket实际上是一个通信端点,通过它,用户的Socket程序可以通过网络和其他的Socket应用程序通信。Socket存在于一个“通信域”(为描述一般的线程如何通过Socket进行通信而引入的一种抽象概念)里,并且与另一个域的Socket交换数据。Socket有三类。第一种是SOCK_STREAM(流式),提供面向连接的可靠的通信服务,比如telnet,http。第二种是SOCK_DGRAM(数据报),提供无连接不可靠的通信,比如UDP。第三种是SOCK_RAW(原始),主要用于协议的开发和测试,支持通信底层操作,比如对IP和ICMP的直接访问。

二、Windows Socket机制分析
2.1一些基本的Socket系统调用     主要的系统调用包括:socket()-创建Socket;bind()-将创建的Socket与本地端口绑定;connect()与accept()- 建立Socket连接;listen()-服务器监听是否有连接请求;send()-数据的可控缓冲发送;recv()-可控缓冲接收;closesocket()-关闭Socket。
2.2Windows Socket的启动与终止   启动函数WSAStartup()建立与Windows Sockets DLL的连接,终止函数WSAClearup()终止使用该DLL,这两个函数必须成对使用。

2.3异步选择机制  Windows是一个非抢占式的操作系统,而不采取UNIX的阻塞机制。当一个通信事件产生时,操作系统要根据设置选择是否对该事件加以处理,WSAAsyncSelect()函数就是用来选择系统所要处理的相应事件。当Socket收到设定的网络事件中的一个时,会给程序窗口一个消息,这个消息里会指定产生网络事件的Socket,发生的事件类型和错误码。
2.4异步数据传输机制   WSAAsyncSelect()设定了Socket上的须响应通信事件后,每发生一个这样的事件就会产生一个WM_SOCKET消息传给窗口。而在窗口的回调函数中就应该添加相应的数据传输处理代码。

三、WinSock基本定义:
WinSock是Microsoft Windows Socket的简称,WinSock为软件开发人员提供一套Windows操作系统上的开放的、支持多种协议的网络编程接口,已成为在TCP/IP网络编程和Internet应用开发中通用的解决方案。 WinSock对一些重要的数据类型和结构做了如下定义。
1、套接字的定义
typedef unsigned int u_int;
     typedef u_int Socket;
2、基本数据类型的定义
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;

3、网络地址的数据结构
网络地址用无符号长整数unsigned long 表示。例如IP地址127.0.0.1可以表示为:
#define INADDR_LOOPBACK 0x7f000001
用inet_addr()函数可以将分16位IP地址转换为unsigned long 类型,其定义为:
unsigned long inet_addr(const char FAR* cp)
Cp为点分16位IP地址,如“192.1.8.84”。
4、套接字地址结构
sockaddr结构——通用Socket地址结构,其定义为:
struct sockaddr{u_short sa_family;char sa_data[14];};
其中sa_family为网络地址类型,随协议的不同而不同,一般为AF_INET,表示该socket在Internet域中通信。
sockaddr_in结构——专门针对Internet域的Socket地址结构,其定义为:

struct sockaddr_in
{
     short sin_family;
     u_short sin_port;
     struct in_addr sin_addr;
    char sin_zero[8];
};
其中sin_family必须设定为AF_INET;sin_port为服务器端口,如果端口设置为0,则系统会自动分配一个唯一的端口;sin_addr为一个unsigned long 的IP地址,若sin_addr为INADDR_ANY,则表示所有的IP地址;sin_zero为填充字段,用来保证结构的大小;
5、主机地址

struct hostent
{
     char FAR* h_name;                //主机名字
     char FAR*FAR* h_aliases;     //主机别名列表
     short h_addrtype;                    //地址类型
     short h_length;                        //地址长度
    char FAR*FAR* h_addr_list;    //IP地址
    #define h_addr h_addr_list[0];
};
6、常见TCP/IP协议的定义
#define IPPROTO_IP          0
#define IPPROTO_ICMP    1
#define IPPROTO_IGMP    2
#define IPPROTO_TCP      6
#define IPPROTO_UDP     17
#define IPPROTO_RAW    255

四、WinSock基本函数:
以下介绍几个最基本的WinSock函数,用这些函数就可以完成从客户端到服务器端的套接字编程。其基本流程如下图所示:
基于(TCP/IP面向连接)的socket编程:
服务器端程序: 1.创建套接字(socket)。 2.将套接字绑定到一个本地地址和端口上(bind) 3.将套接字设为监听模式,准备接受客户请求(listen) 4.等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。 5.用返回的套接字和客户端进行通信(send/recv)。 6.返回,等待另外客户请求。 7.关闭套接字。
客户端程序: 1.创建套接字(socket)。 2.向服务器发出连接请求(connect)。 3.和服务器端进行通信(send/recv)。 4.关闭套接字。

基于UDP(面向无连接)的socket编程 :
服务器端(接收端)程序: 1.创建套接字(socket)。 2.将套接字绑定到一个本地地址和端口上(bind)。 3.等待接受数据(recvfrom)。 4.关闭套接字。
客户端(发送端)程序: 1.创建套接字(socket)。 2.向服务器发送数据(sendto)。 3.关闭套接字。
1、socket()
功能:创建一个新的套接字。
原形:Socket PASCAL FAR socket(int af,int type,int      protocol);
参数:af——通信发生的区域;
               type——要建立的套接字类型;
              procotol——使用的协议类型。


2、Bind()
功能:为一个新创建未绑定的Socket分配端口和local地址。对客户机/服务器构架的程序,服务器必须使用此函数为Socket分配端口号,客户机不用绑定,而是由系统自动分配。
原形:int PASCAL FAR Bind(Socket s,
                     const struct sockaddr FAR* name,int namelen);
参数:s——由socket()调用返回的并且未作连接的Socket识    别符。Name——WinSock地址结构,因协议类型而不同,对应TCP/IP协议的结构为 sockaddr_in。namelen——表示name的长度。
3、connect()和accept()
功能:用于在客户机/服务器构架的程序中建立套接字连接,客户端用connect()要求连接某一流式套接字到指定服务器,服务器用accept()完成套接字中服务器端Socket,接受客户端的连接请求。

原形:int PASCAL FAR connect(Socket s,
                     const struct sockaddr FAR* name,int namelen);
               Socket PASCAL FAR accept(Socket s,
                    struct sockaddr FAR* addr,int FAR *addrlen);
参数:name——服务器端Socket将要建立连接的客户端地址; namelen——表示name的长度。addr——要求与服务器端Socket建立连接的客户端地址;addrlen——addr的长度。
返回值:connect若成功返回0,否则返回SOCKET_ERROR;
                   accept返回的Socket是与客户端通信的Socket。
4、listen()
功能:设定Socket状态为监听,监听客户端的请求,准备被连接。
原形: int PASCAL FAR listen(Socket s,int backlog);
参数:backlog——未完成连接之前,客户端连接请求的最大数。
返回值:若成功则返回0,否则返回SOCKET_ERROR。

5、send()与recv()
功能:在已建立连接的流式套接字之间收发数据, send()发送数据, recv()接收数据。
原形:int PASCAL FAR send(Socket s,
                     const char FAR* buf,int len,int flags);
               int PASCAL FAR recv(Socket s,
                     const char FAR* buf,int len,int flags);
参数:s——发送或接受数据的套接字。
               buf——发送或接受数据的缓冲区。
               len——buf的长度;
               flag——函数被调用的方式,其值为0,MSG_PEEK
                           或MSG_OOB.
6、 sendto()与recvfrom()
功能:若前图建立的不是流式套接字的话,就要用sendto()与recvfrom()代替send()与recv()来读写数据。功能与send()与recv()相同。

原形:int sendto(Socket s,const char FAR* buf,int len,
                    int flags,const struct sockaddr FAR* to,int tolen);
               int recvfrom(Socket s, char FAR* buf,int len,
                  int flags, struct sockaddr FAR* from,int FAR* fromlen);
参数:to——指向目标套接字地址的指针(可选);
               tolen——to的长度;
               from——指向保存着返回的源地址的缓冲区的指针
                            (可选);
               fromlen——指向from缓冲区的指针(可选)。
返回值:若成功返回发送或接受到的数据长度,否则返回
                   SOCKET_ERROR。
7、closesocket()
功能:关闭套接字;
原形: BOOL PASCAL FAR closesocket(Socket s);
参数:s——要关闭的套接字
返回值:若成功则返回0,否则返回SOCKET_ERROR。

五、WinSock扩展:
WinSock对最早的Socket进行了一些扩展,主要是增加了符合Windows消息驱动特性的网络事件异步选择机制,扩充了一些异步函数。主要异步函数如下:
1、异步选择函数
功能:用来注册应用程序相关的网络事件,当事件发生时,应用程序窗口函数将接收到一个消息。
原形:int PASCAL FAR WSAAsyncSelect(
                      Socket s,                 
                      HWND hWnd,             //窗口句柄
                     Unsigned int wMsg,   //需要发送的消息
                     Long lEvent );            //事件类型
     事件类型的值可以是:
      FD_READ:当套接字收到数据时接到通知;
      FD_WRITE:当套接字可发送数据时接到通知;
      FD_OOB:当套接字有外来数据到达时接到通知;
      FD_ACCEPT:当套接字有外来连接时接到通知;

FD_CONNECT:当套接字连接建立完成时接到通知;
          FD_CLOSE:当套接字关闭时接到通知;
2、异步请求函数WSAAsyncGetXByY()
3、阻塞处理方法
当一个应用程序的套接字调用处于阻塞时,应能够使套接字放弃CPU让其他应用程序运行。WinSock的阻塞处理为:DLL初始化->循环操作。在循环中发送任何Windows消息,并检查此WinSock调用是否完成,必要时可以放弃CPU让其他应用程序执行。可以调用 WSACancelBlockingCall()函数取消此阻塞处理。
在WinSock中,默认的阻塞处理例程BlockingHook()能够获取并发送Windows消息。如果要对复杂的程序进行处理, WinSock中的WSASetBlockingHook()使得用户能够安装自己的阻塞处理例程;与该函数相对应的则是 WSAUnhookBlockingHook(),用于删除先前安装的任何阻塞处理例程,并重新安装默认的处理例程。应注意,设计自己的阻塞处理例程时,除了WSACancelBlockingCall()以外不能使用其他的WinSock API函数。调用WSACancelBlockingCall()函数将取消处于阻塞的操作,结束阻塞循环。

4、出错处理
    WinSock为了和多线程环境兼容,提供了WSAGetLastError()和WSASetLastError()两个出错处理函数来获取和设置当前线程的最近错误代码。
     WSAGetLastError()函数的功能是返回故障类型,其定义为:int WSAGetLastError(void);
5、启动与终止
    使用WSAStartup()和WSACleanup()启动和终止套接字。
WSAStartup()完成与Winsock.DLL的连接;
WSACleanup()结束对Winsock.DLL的调用。

六、WinSock编程:
WinSock包括开发组件和运行组件两大部分,开发组件包括WinSock实现文档、应用程序接口(API)引入库和一些头文件。运行组件包括 WinSock应用程序接口的动态连接库。在VC++6.0中使用WinSock编程时,需要将以下三个文件包含到项目中(以WinSock V2.0为例)
头文件: Winsock2.h
库文件:WS2_32.LIB
动态库: WS2_32.DLL
    在TCP/IP网络中两个主机进行进程间异步通信时采用客户端/服务器模式。其中服务器工作过程如下:
1、服务器方先开启,打开一通信通道,公布接收客户请求的端口地址;
2、等待客户端发送请求到该端口;
3、接收到客户端服务请求,处理该请求并发送应答信号;
4、重复2、3步,处理多个客户请求;
5、关闭服务器。

客户端工作过程如下:
1、打开一通信通道,连接到服务器所在主机的开放端口;
2、向服务器发送服务请求,等待应答信号;
3、收到应答信号后,关闭通信通道。
下面看一看WinSock网络应用程序的详细步骤。
1、启动与终止:
    必须首先使用启动函数WSAStartup(),它指定WinSock API的版本,并获得Socket技术细节。调用方式为:
         WORD wVersionRequested; //定义版本信息变量
         WSADATA wsaData;              //定义数据信息变量
         int err;                                      //定义错误号变量
        wVersionRequested=MAKEWORD(1,1);
        //给版本信息赋值
        err= WSAStartup(wVersionRequested,&wsaData);
       //获取错误信息
        if(err!=0) return;

    程序可多次调用WSAStartup()函数,但每次调用时wVersionRequested必须相同。
2、创建套接字:
    Socket sock=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
     //流式套接字
     if(sock==INVALID_Socket)   //错误处理
           …..
3、套接字的绑定:
     sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port=htons(0);                                    //保证字节顺序
    addr.sin_addr.s_addr=addr(“192.168.12.84”);   //指定地址
    int nResult=bind(s,(sockaddr*)&addr,sizeof(sockaddr));
4、服务器端套接字的监听:
    int nResult=listen(s,5);
    //s是已绑定但未连接的套接字,最多监听5个连接

5、服务器端套接字等待连接:
     sockaddr_in addr;
     Socket s_d=accept(s,(sockaddr*)&addr,sizeof(sockaddr));
6、客户端将两个套接字连接起来准备通信:
     sockaddr_in addr;
    addr.sin_family=AF_INET;
     addr.sin_port=htons(0);               //保证字节顺序
     addr.sin_addr.s_addr=htonl(INADDR_ANY);
     int nResult=connect(s, (sockaddr*)&addr,sizeof(sockaddr));
7、服务器端向客户端套接字发送数据:
     char buf[ ]=“einsun”; //指定缓冲区
     int nResult=send(s,buf,strlen(buf));
8、客户端套接字接收数据:
    char mess[1000];
    int nResult=recv(s,mess,1000,0);
9、服务器端和客户端中断套接字连接,通知服务器端或客户端停止接收和发送数据:
     int nResult=shutdown(s,SD_BOTH);

10、服务器端或客户端关闭套接字,释放所占有的资源:
    int nResult=closesocket(s);//s为要关闭的套接字
    关闭套接字时,所有已经打开并连接的流式套接字将被复位,但那些已经由closesocket()函数关闭,但仍有未发送数据的套接字不受影响,仍然可发送未发完的数据。
11、出错处理
    出错处理函数WSAGetLastError()的调用方式如下:
    len=send(s,lpBuffer,len,0);
    if((len==socket_ERROR)
          &&(WSAGetLastError()==WSAWOULDBLOCK))
    {
         …….
     }

 
2009-10-04 21:33

>> help tic

TIC Start a stopwatch timer.
    The sequence of commands
        TIC, operation, TOC
    prints the number of seconds required for the operation.

    See also TOC, CLOCK、ETIME ,CPUTIME.

TIC 秒表开始计时

类似与TOC(计时函数), CLOCK(挂钟),,ETIME(计时函数), CPUTIME(CPU时间(以秒为单位)).

>> help toc

TOC Read the stopwatch timer.
    TOC, by itself, prints the elapsed time (in seconds) since TIC was used.
    t = TOC; saves the elapsed time in t, instead of printing it out.

    See also TIC, ETIME, CLOCK, CPUTIME.

TOC 计时函数

 
2009-10-04 18:34

用Matlab画图时,有时候需要对各种图标进行标注,例如,用“+”代表A的运动情况,“*”代表B的运动情况。

legend函数的基本用法是

LEGEND(string1,string2,string3, ...)

分别将字符串1、字符串2、字符串3……标注到图中,每个字符串对应的图标为画图时的图标。

例如:

plot(x,sin(x),'.b',x,cos(x),'+r')

legend('sin','cos')这样可以把"."标识为'sin',把"+"标识为"cos"

还可以用LEGEND(...,'Location',LOC) 来指定图例标识框的位置

这些是Matlab help文件。后面一段是对应的翻译和说明

        'North'              inside plot box near top
        'South'              inside bottom
        'East'               inside right
        'West'               inside left
        'NorthEast'          inside top right (default)
        'NorthWest           inside top left
        'SouthEast'          inside bottom right
        'SouthWest'          inside bottom left
        'NorthOutside'       outside plot box near top
        'SouthOutside'       outside bottom
        'EastOutside'        outside right
        'WestOutside'        outside left
        'NorthEastOutside'   outside top right
        'NorthWestOutside'   outside top left
        'SouthEastOutside'   outside bottom right
        'SouthWestOutside'   outside bottom left
        'Best'               least conflict with data in plot
        'BestOutside'        least unused space outside plot


        'North'             图例标识放在图顶端
        'South'            图例标识放在图底端
        'East'               图例标识放在图右方
        'West'              图例标识放在图左方
        'NorthEast'       图例标识放在图右上方(默认)
        'NorthWest      图例标识放在图左上方
        'SouthEast'      图例标识放在图右下角
        'SouthWest'     图例标识放在图左下角
(以上几个都是将图例标识放在框图内)
        'NorthOutside'          图例标识放在图框外侧上方
        'SouthOutside'         图例标识放在图框外侧下方
        'EastOutside'           图例标识放在图框外侧右方
        'WestOutside'          图例标识放在图框外侧左方
        'NorthEastOutside'   图例标识放在图框外侧右上方
        'NorthWestOutside' 图例标识放在图框外侧左上方
        'SouthEastOutside'   图例标识放在图框外侧右下方
        'SouthWestOutside' 图例标识放在图框外侧左下方
(以上几个将图例标识放在框图外)
        'Best'                      图标标识放在图框内不与图冲突的最佳位置
        'BestOutside'           图标标识放在图框外使用最小空间的最佳位置
还是用上面的例子


legend('sin','cos','location','northwest')可以将标识框放置在图的左上角。

 
2009-10-02 15:25

写成subplot(m,n,p)或者subplot(m n p)。

subplot是将多个图画到一个平面上的工具。其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,如果第一个数字是2就是表示2行图。p是指你现在要把曲线画到figure中哪个图上,最后一个如果是1表示是从左到右第一个位置。下面是两个例子,可加深理解,

>> t=0:0.001:1;
>> y1=sin(10*t);
>> y2=sin(15*t);
>> subplot(211)
>> plot(t,y1)
>> subplot(212)
>> plot(t,y2)

出来的结果为:

x1=[1 2 3];x2=x1;x3=x2;x4=x1;
y1=[2 4 6];y2=2*y1;y3=3*y1;y4=4*y1;
subplot(2,2,1)
plot(x1,y1);
axis([0,20,0,20])
subplot(2,2,2)
plot(x2,y2);
axis([0,20,0,20])
subplot(2,2,3)
plot(x3,y3)
axis([0,20,0,20])
subplot(2,2,4)
plot(x4,y4)
axis([0,20,0,20])

结果为:

 
2009-05-24 11:48

摘要又称概要、内容提要。摘要是以提供文献内容梗概为目的,不加评论和补充解释,简明、确切地记述文献重要内容的短文。其基本要素包括研究目的、方法、结果和结论。

摘要是发明或者使用新型说明书的简明文摘。摘要应简明扼要地叙述发明或者实用新型的主题和实质内容。摘要的重要木顶是便于人们进行文献检索和初步分类,即写明发明或者实用新型的名称和所属的技术领域,需要解决的技术问题、主要技术特征和用途。摘要文字部分不得超过300个字。

 
2009-05-15 15:47

错误现象:

Server Application Error
The server has encountered an error while loading an application during the processing of your request. Please refer to the event log for more detail information. Please contact the server administrator for assistance.

解决办法:

解决办法:
[1]:
检查你的DTC服务(全名:Distributed Transaction Coordinator--分布式事务处理协调器
)是否可以正常启动,

如果正常的话请你跳过此步骤;如果出错,无法正常启动,请在开始菜单的运行中 运行:msdtc -resetlog 以创建日志文件。重起机器,检查IIS是否可以正常使用,若不行继续。

[2]:
在CMD下执行以下命令:
cd %windir%\system32\inetsrv

rundll32 wamreg.dll, CreateIISPackage

regsvr32 asptxn.dll

(到这里我就可以用了,不用重启的)

OK,ASP页面一切正常了@!~~~^_^

相关检查和解释:

1.右键我的电脑--管理--本地用户和组--查看IUSR_机器(匿名访问 Internet 信息服务的内置帐户)和IWAM_机器(用于启动进程外应用程序的 Internet 信息服务的内置帐户)是否已启动

2.查看事件查看器,看看msdtc服务有没有正常启动(我的在这里就没有启动)。查看方法--双击事件查看器中的应用程序,这时就在右边框里可以看到相关信息,如果有错误信息,说明没有启动。

3.regsvr32 asptxn.dll (注:这个命令修复asp脚本相关的动态链接库);regsvr32 vbscript.dll (注:这个命令修复vb脚本相关的动态链接库) ;regsvr32 jscript.dll (注:这个命令修复java脚本相关的动态链接库)
4.如何在运行 Windows XP 的计算机上重新安装 Microsoft 分布式事务处理协调器--http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B891801

5."%windir%\system32\inetsrv"的意思是系统目录里的 system32\inetsrv目录 ,如果你的操作系统是2K 那就代表 X:\WINNT\system32\inetsrv ,X 等于你的系统文件夹所在盘符

6、IIS的卸载:" 去掉 IIS前面的勾然后“下一步”就可以了。

如果要完全卸载,一般的做法,直接在控制面板添加删除程序中卸载IIS重装。
1、把IIS卸载。
2、把 %windir%\system32\inetsrv 删除。
3、把%windir%\iisX.log删除,X 是IIS版本。
4、把 \inetpub\ 目录删除。
(以上操作可以在安全模式中进行。)"
解决方案(二)

1、删除“internet信息服务”,
2、重启机子,按F8进入“安全模式”,
3、在安全模式下将“C:\Inetpub”、“c:\windows\iis6.log”、“c:\windows\system32\inetsrv”这几个东西重命名。
4、重启机子,在正常模式下安装“internet信息服务”,安装完毕删除重命名文件。
5、如果还不能解决问题,打开“internet信息服务”,“重新启动IIS”。

 
     
 
 
个人档案
 
472115331

云南 昆明 
 
   
 
好友最新文章
 
     

帮助中心  |  空间客服  |  投诉中心  |  空间协议
©2012 Baidu