C++中的一粒沙子
学习C++,做应用开发
posts - 10,comments - 22,trackbacks - 0
  对于像我这样刚接触MFC不久的人来说,MFC中的数据类型的确让人很头痛,需要不时地去查找MSDN,找的多了,就记下来了一部分,于是贴出来,加强记忆!

数据类型

意义

BOOL

Boolean值(TRUE  or FALSE

BSTR

32-bit字符指针

BYTE

8-bit整数,无正负号

COLORREF

32-bit数值,代表一个颜色值

DWORD

32-bit整数,无正负号

LONG

32-bit整数,有正负号

LPARAM

32-bit数值,作为窗口函数或callback函数的一个参数

LPCSTR

32-bit指针,指向一个常数字符串

LPSTR

32-bit指针,指向一个字符串

LPCTSTR

32-bit指针,指向一个常数字符串。此字符串可移植到Unicode

LPTSTR

32-bit指针,指向一个字符串。此字符串可移植到Unicode

LPVOID

32-bit指针,指向一个未指定类型的数据

LPRESULT

32-bit数值,作为窗口函数或callback函数的返回值

UINT

Win16中,16bit无正负号,Win32中,32bit无正负号

WNDPROC

32-bit

WORD

16bit整数,无正负号

WPARAM

窗口函数的一个参数,Win1616bitsWin3232bits

 

 

MFC独特的数据类型

数据类型

意义

POSITION

一个数值,代表collection对象(例如数组或链表)中的元素位置,常使用于MFC collection classes

LPCRECT

32-bit指针,指向一个不变的RECT结构

posted @ 2006-05-11 09:00 炙热的太阳 阅读(1714) | 评论 (4)编辑 收藏
     Google又有新创意了(Google的每一款新产品都给我带来一些惊喜!),他的名字叫google网页设计工具(Google Page Create),当然这仍然是google工程师利用它们的20%时间开发的,它给人的感觉就像是google做的一个blog。反正大家自己去看看吧!

     google黑白报上的内容:

我们的目标是设计出我们的朋友和家人都喜欢而且易用的产品,经过数月的努力,我们很高兴 Google Page Creator(Google 网页设计工具)正式加入 Google 实验室了。Google 实验室一向是 Google 科技试验的园地,里面有我们觉得激动人心、但可能还没完全成熟的产品。希望早期使用者给我们的产品提意见,帮助我们不断完善改进。
     
     链接地址:Google Page Creator(Google 网页设计工具)。
  
posted @ 2006-05-09 08:53 炙热的太阳 阅读(455) | 评论 (0)编辑 收藏
约瑟夫(josephus)环是这样的:假设有n个小孩坐成一个环,假如从第一个小孩开始数,如果数到m个小孩,则该小该离开,问最后留下的小孩是第几个小孩?例如:总共有6个小孩,围成一圈,从第一个小孩开始,每次数2个小孩,则游戏情况如下:
    小孩序号:1,2,3,4,5,6
    离开小孩序号:2,4,6,3,1
最后获胜小孩序号:5

    这样的问题,我可以先考虑输入的内容有哪些?输出内容有哪些?
        要求用户输入的内容有:
         1、是小孩的个数,也就是n的值;
         2、是离开小孩的间隔是多少?也就是m的值。
         3、所有小孩的序号要求存在数组或者链表中,所以需要定义一个指针,这里我们用数组来存放小孩的序号。
        而要求输出的内容是:
         1、离开小孩的序号;
         2、最后留下小孩的序号;
所以,根据上面分析输入输出参数,我们考虑离开小孩的序号可以直接输出,这样可以使函数的复杂性。那么函数定义如下:
//输入参数:
//Childs为指向一个整形指针,指向保存小孩数组的首地址;
//n为小孩的个数;
//m为数小孩的个数;
int Josephus(int *Child,int n,int m)
{
int i=-1,j=0,k=1;
//开始数小孩,只到留下一个小孩
while(1)
{
//数m个小孩
  for(j=0;j<m;)
  
{
   i
=(i+1)%n;    //取下标加1的模,当i的值在0到n-1之间循环
   if(Child[i]!=-1//小孩在环中则数数有效;
    j++;
   
  }


   
if(k==n)                        //如果k==n则表示,此时数组中只留下一个小孩,
    break;                          //序号为Child[i]中的值,跳出循环;
   cout<<Child[i]<<",";  //输出离开小孩的序号;

   Child[i]
=-1;               //离开的小孩用-1作标记
   k=k+1;

}

cout
<<endl;
return(Child[i]);    //返回最获胜小孩的序号
}


完整的程序,在VC6中调试通过。
//-----------------------------------------------------------
#include<iostream.h>
int Josephus(int *Child,int n,int m);
void main()
{
int *allChild,j,k,l;
cin
>>j>>k;

  
if((allChild= new int[j])!=NULL)
  
{
    
for(l=0;l<j;l++)
    
{  
     cout
<<l+1<<",";
     allChild[l]
=l+1;
    }

    cout
<<endl;
    cout
<<Josephus(allChild,j,k);
  }

}


int Josephus(int *Child,int n,int m)
{
int i=-1,j=0,k=1;
while(1)
{
  
for(j=0;j<m;)
  
{
   i
=(i+1)%n;    
   
if(Child[i]!=-1
    j
++;
   
  }


   
if(k==n)                        
    
break;                        
   cout
<<Child[i]<<",";  

   Child[i]
=-1;         
   k
=k+1;

}

cout
<<endl;
return(Child[i]);    
}

posted @ 2006-04-29 09:30 炙热的太阳 阅读(398) | 评论 (0)编辑 收藏
呵呵,google有中文名字了,叫谷歌,很贴近中国大众,这是不是意味着大众搜索时代的到来呢?
下面是谷歌的地址:
http://googlechinablog.com/gugeflash.swf
posted @ 2006-04-15 18:26 炙热的太阳 阅读(240) | 评论 (0)编辑 收藏
  今天跟单位的人出去到郊外玩了一天,紧张了几个星期的心情总算有一点放松,呵呵,过几天项目就要验收了,所以最近一直都在赶工作。玩了一天有点体会,那就是以后一定要加强体育锻炼,不能把身体搞垮了。
posted @ 2006-04-09 20:36 炙热的太阳 阅读(112) | 评论 (0)编辑 收藏
  毕业半年多了,写程序有半年了,今天突然间有点迷茫??我是不是要继续做程序?我是不是做程序的材料?一连串的问题向我逼来,搞得我一下午没有工作,于是乎上论坛,看大家讨论,思考问题........
   莫非这就是人们所说的浮躁,我想可能是吧!人不免在某一件事上做久了,就会产生厌倦感,或者是一时间没有了方向,又或者是没有思想依靠,等等,如此之类。
   咳!想发一下感慨,可是怎么也想不起来要怎么写,大学四年,文笔是彻底荒废了,现在想拾起来,可又吐不出什么东西来,有时间写上一大堆东西,回头再一看,自己都想反胃,于是随即删掉,到最后,还是没有写出一点像样的文章来。我比较喜欢林锐(大学十年的作者)的文风,风趣,洒脱又有内涵,我也一直想写他那样的文章来,好歹也算是给自己肯定一下。
   算了,又忘词了,上面的已经是把肠子里的东西搅腾了好几遍,不想再折腾自己,就这样自己吧!继续学习C++,继续韩语学习,继续努力!
posted @ 2006-03-22 20:08 炙热的太阳 阅读(173) | 评论 (0)编辑 收藏
     摘要: 当SP端和ISMG端建立Connect连接后,我们就要开始发送短信了,而Submit操作的目的是SP在与ISMG建立应用层连接后向ISMG提交短信。ISMG以Submit_Resp消息响应。下面还是要看它的消息定义:字段名字节数属性描述Msg_Id8Unsigned Integer信息标识。Pk_total1Unsigned Integer相同Msg_Id的信息总条数,从1开始。Pk_number...  阅读全文
posted @ 2006-03-20 20:43 炙热的太阳 阅读(1455) | 评论 (0)编辑 收藏
  前一阵子,我一直想再学一门外语,但害怕学一门新的外语太难,所以就一直没有起步。在一次饭局上我听一个同事说,韩语很简单,一个星期基本上可以入门,很简单的一门语言,而且又是从中文演变过去的,对中国人来说是比较简单。加上最近中国盛行韩风,因此决定学习韩语。于是乎上书店买入门教程,上网上找资料,一个星期下来,嘿!发现韩语还真的挺简单的,挺适合我这种懒散的人学习。可惜,我没有下载朝鲜语插件,不然的我也用韩语写一篇blog!
posted @ 2006-03-17 08:24 炙热的太阳 阅读(476) | 评论 (10)编辑 收藏
    CMPP协议的全称是中国移动通信互联网短信网关接口协议,它是联想亚信公司根据SMMP协议为中国移动量身定做的,是符合中国国情的一个短信协议,闲话不多说了,说说CMPP的主要功能吧。(1)短信发送(short message mobile originate)MO,就是手机给SP发短信;(2)短信接受(short message mobile terminated)MT,这个就是SP给手机发的短信了,通常我们手机上收到的不良短信就是SP给我们的MT。CMPP协议的通信基础是TCP/IP为底层通信承载的,连接方式是长连接方式。SP与ISMG之间,SMSC和ISMG之间的交互过程中均采用异步方式,即任一个网元在收到请求消息后应立即回应。
   下面看看它的消息定义:CMPP中的消息分为消息头和消息体。消息头定义如下
 
 

字段名

字节数

类型

描述

Total_Length  

4

Unsigned Integer

消息总长度(含消息头及消息体)

Command_Id

4

Unsigned Integer

命令或响应类型

Sequence_Id

4

Unsigned Integer

消息流水号,顺序累加,步长为1,循环使用(一对请求和应答消息的流水号必须相同)

 
那么下面就是SP连接到ISMG上了,看它的Bind连接消息定义
 

字段名

字节数

属性

描述

Source_Addr 

6

Octet String

源地址,此处为SP_Id,即SP的企业代码。

AuthenticatorSource

16

Octet String

用于鉴别源地址。其值通过单向MD5 hash计算得出,表示如下:

AuthenticatorSource =

MD5Source_Addr+9 字节的0 +shared secret+timestamp

Shared secret 由中国移动与源地址实体事先商定,timestamp格式为:MMDDHHMMSS,即月日时分秒,10位。

Version

1

Unsigned Integer

双方协商的版本号(高位4bit表示主版本号,低位4bit表示次版本号),对于3.0的版本,高4bit3,低4位为0

Timestamp

4

Unsigned Integer

时间戳的明文,由客户端产生,格式为MMDDHHMMSS,即月日时分秒,10位数字的整型,右对齐

 
根据上的定义我们可以写出的代码,如下,在VC环境下编写的

/*
 *函数功能:建立和CMPP网关的直接通路
 *输入条件:SP用户名const char *UserName,SP密码const char *PWD 
 */
void Ccmpp_API::CmppConnect(const char *UserName, const char *PWD)
{
 char netbuf[100];
 CMPP_CONNECT *bufer;
 bufer=(CMPP_CONNECT*)netbuf;
 memset(bufer, 0, 100);
 bufer->nTotalLength = htonl(39);//CMPP_CONNECT消息总长度
 bufer->nCommandId = htonl(CMPP_CONNECT_tag);//消息标志
 //自动产生SeqId号
    if (sequenceid == 123456789i32)
 {
  sequenceid = 1;
 }else{
  sequenceid++;
 }
 bufer->nSeqId = htonl(sequenceid);
   
 int MD5Len;
 MD5_CTX md5;//MD5源字串
 CTime TimeData = CTime::GetCurrentTime();
 CString timestamp = TimeData.Format("%m%d%H%M%S");
 unsigned char md5source[29];
 int Len1 = strlen(UserName);
 int Len2 = strlen(PWD); 
 MD5Len = Len1 + 9 +Len2 + timestamp.GetLength();
 memset(md5source, 0, MD5Len);
 
 memcpy(bufer->sSourceAddr, UserName, Len1);
 memcpy(md5source, UserName, Len1);
 
 for (int j = 0; j<Len2; j++)
 {
  md5source[j + Len1 + 9] = PWD[j];
 }
 for (int i=0;i<timestamp.GetLength();i++)
 {
  md5source[i + Len2 + Len1 + 9]=timestamp[i];
 }
 
 //进行md5加密转换
 md5.MD5Update(md5source, MD5Len);
 md5.MD5Final(md5source);
 memcpy(bufer->sAuthSource, md5source, 29);
 bufer->cVersion = 0x30;
 bufer->nTimeStamp = htonl(atoi(timestamp));
 CmppSocket.Send(bufer, 39, 0);//把消息打包发送
 return;
}
 
今天就到这,下次再写,欢迎交流!
posted @ 2006-03-15 07:58 炙热的太阳 阅读(7997) | 评论 (8)编辑 收藏
   什么都有第一次!第一次对谁来说都充满了神秘色彩,写博文与别人交谈,对我来说是第一次,也是一次新的尝试,所以就敲下这些文字,开始博客之旅!
posted @ 2006-03-14 17:12 炙热的太阳 阅读(258) | 评论 (0)编辑 收藏
仅列出标题