当前位置:C++技术网 > 资讯 > 毕业设计-幼儿飞行棋之做后感(4)

毕业设计-幼儿飞行棋之做后感(4)

更新时间:2016-03-21 22:36:00浏览次数:1+次

  我在做毕业设计的时候,遇到了很多问题,我都会记下来,并把解决方法也记下来,不知不觉,发现自己养成了有错误就记下来的好习惯,当回头再看回这些问题时,发现其中的真正原理,真是人生一大快事。

  接下来就贴一下我的问题与解决方法列表:

  1、父窗口创建子窗口,子窗口通过获取父窗口的句柄进行message通信

CMySubDialog dlg;
dlg.SendMessage(WM_SUB_MSG,(WPARAM)&strEdit);
但父窗口不知道怎么send message to子窗口。


解答:


//  获得父窗口的句柄  
HWND hWnd = this->GetParent()->GetSafeHwnd();  
  
 // 向父窗口发送消息  
 if (hWnd == NULL) 
{
	MessageBox(_T("获得父窗口句柄失败!")); 
	return;
}
::SendNotifyMessage(hWnd,WM_MAIN_MSG,(WPARAM)&strEdit,NULL);

  2、socket连接错误码:10093
解答:在MSDN上可以找到这样的答案:
WSANOTINITIALISED
(10093)
Successful WSAStartup not yet performed.Either the application hasn't called WSAStartup or WSAStartup failed. The application may be accessing a socket which the current active task does not own (i.e. trying to share a socket between tasks), or WSACleanup has been called too many times.就是没有成功调用WSACleanup()函数。可是我在InitInstance中已经调用了AfxSocketInit(),可是还是不行.总算找到答案了.原来我把AfxSocketInit()写在了后边.这是不行的。应该写在InitInstance()的最前面.到于为什么,我现在也弄不清楚.总之把它写在后面就不会出现错误了.

if(!AfxSocketInit())       //必需放在DoModal之前。
{
AfxMessageBox(_T("套接字库加载失败"));
}
  3、第二行:error C2601: 'OnNumber' : local function definitions are illegal
最后一行:fatal error C1004: unexpected end of file found
解答:OnNumber没问题,根据错误提示,有问题的应该是写在OnNumber前边的函数缺少了一个右花括号,
以至于编译器认为OnNumber的定义是在前边的函数的作用域里。你再仔细检查一下。


  4、登陆窗口-》通信窗口,游戏窗口-》通信窗口,这时的通信窗口应该如何接受来自两个窗口不同的信息,新建两个接受函数?还是将两个结构体合成一个结构体?
解答:用结构体不同的指针获取信息的地址,也就是说两个结构体的指针指向同一个地址,这样当你删除指针内容的时候不能两个指针都删,因为删了一个指针,
地址的内容就已经清空了,到时你再删除另一个指针就会出现崩溃
 5、error C2106: '=' : left operand must be l-value
解答:行参定义为char name[][8],char dep[][10]
name,dep都是二维字符数组,所以name[j]是一维字符数组,相当于一个const char *,所以不能作为等号的左操作数

name[j]=name[j+1];
dep[j]=dep[j+1];
这两句都是错误的。


  6、指针free后还存在吗?
解答:存在
free 0释放的是指针指向的内存.
指针是一个变量,只有程序结束时才被销毁.
释放了内存空间后,原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,
未定义的.
因此,释放内存后把指针指向NULL,
防止指针在后面不小心又被引用。

  7、请问TCHAR数组和字符串比较需要注意?
解答:

#include <iostream>
#include <tchar.h>
using namespace std;
int main(void)
{
TCHAR a[3],b[3];
_snprintf(a,3,"12");
_snprintf(b,3,"12");
if(_tcscmp(a,b)==0) cout<<"1"<<endl;
else cout<<"0"<<endl;
//if(a==b) cout<<"1"<<endl;
//else cout<<"0"<<endl;
return 0;
}
a==b比较的字符串的地址,而不是数据,所以他们永远不会相等的。
如果是CString对象比较,CString类重载了=操作符。所以是这样比较是可以的。
如果要用TCHAR[]和字符串常量比较,可以使用_tcscmp函数


扩展:因为C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串字符串处理函数,
比如:strlen和wstrlen,分别用于处理两种字符串。微软将这两套字符集及其操作进行了统一,通过条件编译(通过_UNICODE和UNICODE宏)
控制实际使用的字符集,这样就有了_T("")这样的字符串,对应的就有了_tcslen这样的函数   为了存储这样的通用字符,就有了TCHAR:
当没有定义_UNICODE宏时,TCHAR = char,_tcslen = strlen   当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wstrlen
当我们定义了UNICODE宏,就相当于告诉了编译器:我准备采用UNICODE版本。这个时候,TCHAR就会摇身一变,变成了wchar_t。
而未定义UNICODE宏时,TCHAR摇身一变,变成了unsigned char 。这样就可以很好的切换宽窄字符集。
tchar可用于双字节字符串,使程序可以用于中日韩等国 语言文字处理、显示。使编程方法简化。
TCHAR是windows中定义的一个类型不是标准C中的
char是标准C当是的一个类型
TCHAR一般用于表示UNICODE字符
char用于ascii形式
如果非UNICODE模式两者是相同的都是char
如果UNICODE模式下(支持宽字节)
TCHAR 为双字节, 为unsigned short 类型
比如汉字和一些扩展字符都是2个字节表示的, 刚好可以和这个类型对应上
  8、
注意:如果不用指针当函数结束时,申请的栈内存会被收回,用指针就不会这样。

/*UserList tempUL,tempUL1;//局部变量,存在于栈中,当函数结束时,会被释放。
GameList tempGL;
eroMemory(&tempUL,sizeof(tempUL));
ZeroMemory(&tempUL1,sizeof(tempUL1));
ZeroMemory(&tempGL,sizeof(tempGL));
tempGL.hUser=&tempUL;
tempUL.next=&tempUL1;
m_pGameList=ptempGL=&tempGL;*/
UserList* tempUL=(UserList*)malloc(sizeof(UserList));
UserList* tempUL1=(UserList*)malloc(sizeof(UserList));
GameList* tempGL=(GameList*)malloc(sizeof(GameList));
  9、在缺省对齐下三条准则
【1】结构体变量的首地址能够被其最宽基本类型成员的大小所整除
【2】结构体每个成员相对于结构体首地址的偏移量是成员大小的整数背
【3】结构体的总大小为结构体最宽基本类型成员大小的整数背
以上都是结构体中只有基本类型时的缺省对齐方式,当有嵌套复合成员时,
【2】改为:复合成员相对于结构体首地址偏移量是复合成员最宽基本类型大小的整数背
所以分析你上面的
typedef struct node
{
int a[100];
char b;
}kkk;

先是第一成员400个字节,然后还有个char一个字节,为了满足第第三条准则,即总大小401为最宽基本类型的整数背,明显401不是最宽基本类型int(4)的整数背,所以总大小为404。

  10、GameList* ptempGL,*ptempGL1;犯过的低级错误就是遗漏了第二个*号,程序出错了,查了很久才知道这里有问题。

  以上就是我的问题与解答,如果大家也有好的习惯或者是经典的问题,都欢迎写文章来分享,共同进步。