windows程序求改错?

cwhe_10 2013-03-31 02:43:10
#include<windows.h>

static LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
static TCHAR szAppName[] = TEXT ("读取.txt文件") ;
byte DataManage(char ,DWORD );
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd=CreateWindow (szAppName,
TEXT ("The Hello Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL) ;

ShowWindow (hwnd, SW_SHOWNORMAL) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}


static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
static int cxClient, cyClient;
DWORD dwread;
static BOOL read;
static HLOCAL lpBuff;
byte Buff;
switch (message)
{
case WM_CREATE:
{
HANDLE h;
hdc=GetDC(hwnd);
h=CreateFile(TEXT("E:\\data.txt"), //里面数据格式为 12-AE-5-6A-
GENERIC_READ, //文件进行何种操作 读操作
0, //文件是否共享,o表示不共享
NULL, //文件安全属性,通常设置为0
OPEN_EXISTING, //文件存在就读取,否则创建
FILE_ATTRIBUTE_READONLY,
0);
if(h!=INVALID_HANDLE_VALUE)
{
DWORD length=GetFileSize(h,NULL);
lpBuff = LocalAlloc(GPTR, sizeof(char) * (length + 1));//分配内存
if(lpBuff!=NULL)
{
read=ReadFile(h,lpBuff,length,&dwread, 0);
static char lpBuff1=(char)lpBuff;
Buff=DataManage(lpBuff1,length); //datamanege调用数据处理数组
}
}
ReleaseDC(hwnd,hdc);
return 0;
}

case WM_SIZE:
{
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);

}
return 0 ;

case WM_PAINT:
{
if(read)
{
RECT rect ;
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
InflateRect(&rect, -5, -5);
SetTextColor(hdc, RGB(34, 120, 34));
DrawTextA(hdc,(LPCSTR)lpBuff,-1,&rect,DT_WORDBREAK | DT_EDITCONTROL ) ;
DrawText(hdc,(LPCWSTR)Buff,-1,&rect,DT_WORDBREAK | DT_EDITCONTROL ) ;
EndPaint (hwnd, &ps) ;
}
return 0 ;
}

case WM_DESTROY:
if (lpBuff != NULL)
{
LocalFree(lpBuff);
}
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}


byte DataManage(char lpBuff1,DWORD length)
{
byte Buff2[64];
int j=0;
for(DWORD i=0;i<length+1;i++)
{
if(lpBuff1[i]>=0x30||lpBuff1[i]<=0x46)
{
if(lpBuff1[i+1]>=0x30||lpBuff1[i+1]<=0x46)
{
Buff2[j]=((int)lpBuff1[i])*16+(int)lpBuff1[i+1];i++;j++;break;
}
else
{
Buff2[j]=(int)lpBuff1[i];j++;break;
}
}
else
break;
}
return Buff2[64];
}


程序报错提示:
1。cpp(135): error C2109: 下标要求数组或指针类型
1> error C2109: 下标要求数组或指针类型
1> error C2109: 下标要求数组或指针类型
1> error C2109: 下标要求数组或指针类型
1> error C2109: 下标要求数组或指针类型
1> error C2109: 下标要求数组或指针类型
1> error C2109: 下标要求数组或指针类型
...全文
163 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwhe_10 2013-04-04
  • 打赏
  • 举报
回复
引用 4 楼 Mackz 的回复:
引用 3 楼 cwhe_10 的回复:引用 2 楼 Mackz 的回复:static char* lpBuff1=(char*)lpBuff; byte DataManage(char* lpBuff1,DWORD length)不过你这个函数返回类型也太怪异了。 感觉你基础很差,先把一些基本的东西要学懂,尤其对于C/C++,指针概念不清,基本上就废了。谢谢了……
我都学了快一年了呀,状态不好,进步太慢了,可能是我的c基础部牢吧,还有就是一直有问题又怕问老师,就这样耽搁了,这完全自学啊
cwhe_10 2013-04-04
  • 打赏
  • 举报
回复
引用 10 楼 Mackz 的回复:
基础的东西一定要先拿一本教材做习题、做练习学扎实,你这个水平确实不像学一年的,基本的概念都错了,不赶紧去弄懂会浪费更多时间。 引用 9 楼 cwhe_10 的回复:引用 4 楼 Mackz 的回复:引用 3 楼 cwhe_10 的回复:引用 2 楼 Mackz 的回复:static char* lpBuff1=(char*)lpBuff; byte DataMan……
#include<windows.h>

static LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
static TCHAR szAppName[] = TEXT ("读取.txt文件") ;              
byte DataManage(char *,DWORD );
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{     
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;

     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }

  hwnd=CreateWindow (szAppName,                  
                          TEXT ("The Hello Program"),
                          WS_OVERLAPPEDWINDOW,        
                          CW_USEDEFAULT,            
                          CW_USEDEFAULT,             
                          CW_USEDEFAULT,              
                          CW_USEDEFAULT,             
                          NULL,                     
                          NULL,                      
                          hInstance,                  
                          NULL) ;                    

     ShowWindow (hwnd, SW_SHOWNORMAL) ;
     UpdateWindow (hwnd) ;

     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}


static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{  
     HDC         hdc ;            
     PAINTSTRUCT ps ;                    
	 static int  cxClient, cyClient;     
	 DWORD dwread;
	 static BOOL      read;
	 static void * lpBuff;     //原来HANDLE和HLOCAL就是void*。
	 byte   Buff;
     switch (message)
     {
     case WM_CREATE:
         {
			HANDLE h;
            hdc=GetDC(hwnd);
			h=CreateFile(TEXT("E:\\data.txt"),        //里面数据格式为  12-AE-5-6A-
						GENERIC_READ,        //文件进行何种操作   读操作
						0,                 //文件是否共享,o表示不共享
						NULL,             //文件安全属性,通常设置为0
						OPEN_EXISTING,        //文件存在就读取,否则创建
						FILE_ATTRIBUTE_READONLY,                      
						0);
			if(h!=INVALID_HANDLE_VALUE)
			{
				DWORD length=GetFileSize(h,NULL);
				//lpBuff = LocalAlloc(GPTR, sizeof(char) * (length + 1));//分配内存
				if(lpBuff!=NULL)
				{
					read=ReadFile(h,lpBuff,length,&dwread, 0);
					static char *lpBuff1;//=(char*)lpBuff;
					lpBuff1=(char*)lpBuff;
					Buff=DataManage(lpBuff1,length);  //datamanege调用数据处理数组
				}
			}  
			ReleaseDC(hwnd,hdc);
			return 0;
		 }

	case WM_SIZE:                                
		{
			cxClient=LOWORD(lParam);               
			cyClient=HIWORD(lParam);      
   
		}   
          return 0 ;

     case WM_PAINT:
         {    
			if(read)
			{
				RECT        rect ;   
				hdc = BeginPaint (hwnd, &ps) ;                 
				GetClientRect (hwnd, &rect) ;
				InflateRect(&rect, -5, -5);
				SetTextColor(hdc, RGB(34, 120, 34));    
				DrawTextA(hdc,(LPCSTR)lpBuff,-1,&rect,DT_WORDBREAK | DT_EDITCONTROL ) ; 
				DrawText(hdc,(LPCWSTR)Buff,-1,&rect,DT_WORDBREAK | DT_EDITCONTROL ) ;
				EndPaint (hwnd, &ps) ;
			}
            return 0 ;
         }

     case WM_DESTROY:
		if (lpBuff != NULL)
		{
           LocalFree(lpBuff);
         }
        PostQuitMessage (0) ;
        return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}


byte DataManage(char *p,DWORD length)
{
	byte Buff2[64];
	int j=0;
	for(DWORD i=0;i<length+1;i++)
	{
		if(((*p)>=0x30)&(*p)<=0x46)
		{
			if((*(p+1)>=0x30)&(*(p+1)<=0x46))
				{
					Buff2[j]=((int)*p)*16+(int)(*(p+1));i++;j++;++p;break;
			    }
			else
				{
					Buff2[j]=(int)*p;j++;p++;break;
				}
		}
		else
			p++;break;
	}
	return Buff2[64];
}
这是最新版的,程序没报错,就是没结果?
菜牛 2013-04-04
  • 打赏
  • 举报
回复
基础的东西一定要先拿一本教材做习题、做练习学扎实,你这个水平确实不像学一年的,基本的概念都错了,不赶紧去弄懂会浪费更多时间。
引用 9 楼 cwhe_10 的回复:
引用 4 楼 Mackz 的回复:引用 3 楼 cwhe_10 的回复:引用 2 楼 Mackz 的回复:static char* lpBuff1=(char*)lpBuff; byte DataManage(char* lpBuff1,DWORD length)不过你这个函数返回类型也太怪异了。 感觉你基础很差,先把一些基本的东西要学懂,尤其对于C/C++,……
疯石头 2013-04-03
  • 打赏
  • 举报
回复
另: read=ReadFile(h,lpBuff,length,&dwread, 0); static char lpBuff1=(char)lpBuff; lpBuff是char* 为地址 直接赋值成把地址截取付给char了。。不对的。
疯石头 2013-04-03
  • 打赏
  • 举报
回复
传入:byte DataManage(char lpBuff1,DWORD length) 使用?lpBuff1[i]>=0x30||lpBuff1[i]<=0x46 传入的是char 但是使用时char*或char[] 肯定报错。传入参数改下。
fang 2013-04-03
  • 打赏
  • 举报
回复
byte DataManage(char lpBuff1,DWORD length) 将lpBuff1当指针在玩了,而你的函数定义是char lpBuff1. { byte Buff2[64]; int j=0; for(DWORD i=0;i<length+1;i++) { if(lpBuff1[i]>=0x30||lpBuff1[i]<=0x46) { if(lpBuff1[i+1]>=0x30||lpBuff1[i+1]<=0x46) { Buff2[j]=((int)lpBuff1[i])*16+(int)lpBuff1[i+1];i++;j++;break; } else { Buff2[j]=(int)lpBuff1[i];j++;break; } } else break; } return Buff2[64]; 将栈数据返回 }
招财猫_Martin 2013-04-03
  • 打赏
  • 举报
回复
byte DataManage(char lpBuff1,DWORD length) { byte Buff2[64]; int j=0; for(DWORD i=0;i<length+1;i++) { if(lpBuff1[i]>=0x30||lpBuff1[i]<=0x46) 红色这里lpBuffl是char基本类型,不能像蓝色部分那里用作数组或指针。 所以编译器提示: error C2109: 下标要求数组或指针类型
菜牛 2013-04-02
  • 打赏
  • 举报
回复
引用 3 楼 cwhe_10 的回复:
引用 2 楼 Mackz 的回复:static char* lpBuff1=(char*)lpBuff; byte DataManage(char* lpBuff1,DWORD length)不过你这个函数返回类型也太怪异了。 感觉你基础很差,先把一些基本的东西要学懂,尤其对于C/C++,指针概念不清,基本上就废了。谢谢了,我知道我基础差啊,那我现在又能怎么办……
慢慢学吧,循序渐进就好。
cwhe_10 2013-04-02
  • 打赏
  • 举报
回复
引用 2 楼 Mackz 的回复:
static char* lpBuff1=(char*)lpBuff; byte DataManage(char* lpBuff1,DWORD length)不过你这个函数返回类型也太怪异了。 感觉你基础很差,先把一些基本的东西要学懂,尤其对于C/C++,指针概念不清,基本上就废了。
谢谢了,我知道我基础差啊,那我现在又能怎么办呢?
菜牛 2013-03-31
  • 打赏
  • 举报
回复
static char* lpBuff1=(char*)lpBuff; byte DataManage(char* lpBuff1,DWORD length)不过你这个函数返回类型也太怪异了。 感觉你基础很差,先把一些基本的东西要学懂,尤其对于C/C++,指针概念不清,基本上就废了。
翻越寒武 2013-03-31
  • 打赏
  • 举报
回复
lpBuff1不是数组或指针类型,是不是
windows 组件中没有ISS选项的解决办法: 在运行中输入"c:\windows\inf\sysoc.inf",系统会自动使用记事本打开sysoc.inf这个文件。在sysoc.inf中找到"[Components]"这一段,并继续找到类似"iis=iis.dll,OcEntry,iis.inf,hide,7"的一行字,把这一行替换为"iis=iis.dll,OcEntry,iis.inf,,7"。如果找不到类似的,则在"[Components]"下一行粘贴"iis=iis.dll,OcEntry,iis.inf,,7"(我试过可以的)。之后保存并关闭。(如果你怕改错,先把C:\WINDOWS\INF\SYSOC.INF做一份备份) 然后把winxp安装盘目录i386里的两个文件IIS.DL_和IIS.IN_拷贝到一个临时的目录(例如C:\AAA),然后在命令提示符状态下将当前目录转到C:\AAA,执行   EXPAND IIS.DL_ IIS.DLL   EXPAND IIS.IN_ IIS.INF   当然也可以用解压软件把两个文件的后缀都改为CAB(就是把_改为.CAB),全部解压。   解出IIS.DLL及IIS.INF两个文件,将IIS.INF复制到C:\WINDOWS\INF目录下,将IIS.DLL 复制到C:\WINDOWS\SYSTEM32\SETUP目录下。(我用的这种方法)   现在按"开始->设置->控制面板->添加或删除程序->添加/删除Windows组件",这时你可以很兴奋地发现IIS出现了!!!   此后的过程就和PRO版的XP安装IIS差不多了,过程中会要求你选择winxp安装光盘的位置,只要输入指定的目录即可正常安装。(如果系统要认证版本,你可以选择取消)   安装完毕以后也许还不能直接用的,需要对IIS进行一些设置:   控制面板->管理工具->Internet服务管理器   然后点"默认WEB站点"的右键,转到"目录安全性"选项卡,点"匿名访问和验证控制"的"编辑"按钮,回弹出匿名方法新窗口,再点击其中"匿名访问"中的"编辑"按钮,将"允许IIS控制密码"全面的勾去掉,然后一路确定返回即可
基本概念 2.1、什么是版本控制 简单点来说,版本控制就是数据仓库,它可以记录你对文件的每次更改。这样,就算你在昏天黑地的改了几个月后老板说不要了,还是按照过去那样,你也不会抓狂,简单的恢复版本操作就搞定一切。 2.2、什么是 Subversion Subversion是一个自由/开源版本控制系统,它管理文件和目录可以超越时间。一组文件存放在中心版本库,这个版本库很像一个普通的文件服务器,只是它可以记录每一次文件和目录的修改,这便使你可以取得数据以前的版本,从而可以检查所作的更改。从这个方面看,许多人把版本控制系统当作一种“时间机器”。 Subversion可以通过网络访问它的版本库,从而使用户可以在不同的电脑上使用。一定程度上可以说,允许用户在各自的地方修改同一份数据是促进协作。进展可能非常的迅速,并没有一个所有的改变都会取得效果的通道,由于所有的工作都有历史版本,你不必担心由于失去某个通道而影响质量,如果存在不正确的改变,只要取消改变。 一些版本控制系统也是软件配置管理(SCM)系统,这种系统经过特定的精巧设计来管理源代码,有许多关于软件开发的特性—本身理解编程语言、或者提供构建程序的工具。然而,Subversion不是这样一个系统,它是一个通用系统,可以管理任何类型的文件集,对你这可能是源代码,对别人,可能是一个货物报价单或者是书稿等。 2.3、版本库(repository) Subversion 的核心就是 repository ,中文翻译成“版本库”。就是位于服务器端,统一管理和储存数据的地方。 3、安装配置 3.1 安装独立服务器 SVNServer 环境 OS:Windows XP SP2 Web:Apache 2.2.6 SVN:svn-win32-1.4.6 一、准备工作 1、获取 Subversion 服务器程序 到官方网站(http://subversion.tigris.org/)下载最新的服务器安装程序。目前最新的是1.4.6版本,具体下载地址在:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&expandFolder=8100&folderID=91 ,注意找 for apache 2.2.x 版本的。 2、获取 TortoiseSVN 客户端程序 从官方网站 http://tortoisesvn.net/downloads 获取最新的 TortoiseSVN 。TortoiseSVN 是一个客户端程序,用来与 subvers 服务器端通讯。Subversion 自带一个客户端程序 svn.exe ,但 TortoiseSVN 更好操作,提高效率。 二、安装服务器端和客户端 首先安装 Apache 2.2.6 ,具体安装方法大家参考相关资料,或者参看我写的《Windows下安装Apache 2.2.x》。 其次安装 Subversion(以下简称SVN)的服务器端和客户端。下载下来的服务器端是个 zip 压缩包,直接解压缩即可,比如我解压到 E:\subversion 。客户端安装文件是个 exe 可执行文件,直接运行按提示安装即可,客户端安装完成后提示重启。 三、建立版本库(Repository) 运行Subversion服务器需要首先要建立一个版本库(Repository)。版本库可以看作是服务器上集中存放和管理数据的地方。 开始建立版本库。首先建立 e:\svn 空文件夹作为所有版本库的根目录。然后,进入命令行并切换到subversion的bin目录。输入如下命令: svnadmin create E:\svn\repos1 此命令在 E:\svn 下建立一个版本库 repos1 。repos1 下面会自动生成一些文件夹和文件。 我们也可以使用 TortoiseSVN 图形化的完成这一步: 先建立空目录 E:\svn\repos1 ,注意一定是要空的。然后在 repos1 文件夹上“右键->TortoiseSVN->Create Repository here...”,然后可以选择版本库模式,这里使用默认的FSFS即可,然后就创建了一系列文件夹和文件,同命令行建立的一样。 四、运行独立服务器 此时 subversion 服务还没有开始,只是通过它的命令建立了版本库。继续在刚才的命令窗口输入: svnserve.exe --daemon svnserve 将会在端口 3690 等待请求,--daemon(两个短横线)选项告诉 svnserve 以守护进程方式运行,这样在手动终止之前不会退出。注意不要关闭命令行窗口,关闭窗口会把 svnserve 停止。 为了验证svnserve正常工作,使用TortoiseSVN -> Repo-browser 来查看版本库。在弹出的 URL 对话框中输入: svn://localhost/svn/repos1 点 OK 按钮后就可以看见 repos1 版本库的目录树结构了,只不过这时 repos1 是个空库。 你也可以使用--root选项设置根位置来限制服务器的访问目录,从而增加安全性和节约输入svnserve URL的时间: svnserve.exe --daemon --root drive:\path\to\repository 以前面的测试作为例,svnserve 将会运行为: svnserve.exe --daemon --root e:\svn 然后TortoiseSVN中的版本库浏览器URL缩减为: svn://localhost/repos1 五、配置用户和权限 用文本编辑器打开E:\svn\repos1\conf目录,修改svnserve.conf: 将: # password-db = passwd 改为: password-db = passwd 即去掉前面的 # 注释符,注意前面不能有空格。 然后修改同目录的passwd文件,增加一个帐号: 将: [users] # harry = harryssecret # sally = sallyssecret 增加帐号: [users] #harry = harryssecret #sally = sallyssecret test = test 六、初始化导入 下面就是将我们的数据(项目)导入到这个版本库,以后就由版本库管理我们的数据。我们的任何改动都回被版本库记录下来,甚至我们自己丢失、改错数据时版本库也能帮我们找回数据。 比如,我在 d:\wwwroot 下有个 guestbook 文件夹,里面存放的是我编写的留言簿程序。在此文件夹上“右键 -> TortoiseSVN -> Import...” ,在弹出对话框的“URL of repository”输入“svn://localhost/repos1/guestbook”。在“Import message”输入“导入整个留言簿”作为注释。 点 OK 后要求输入帐号。我们在用户名和密码处都输入 test 。完成后 guestbook 中的内容全部导入到了 svn://localhost/svn/repos1/guestbook 。 我们看到在 e:\svn\repos1 没有任何变化,连个 guestbook 文件夹都没有建立,唯一的变化就是e:\svn\repos1容量变大了。实际上我们源guestbook中的内容已经导入 repos1 版本库了,源 guestbook 文件夹可以删除了。 需要注意的是,这一步操作可以完全在另一台安装了 TortoiseSVN 的客户机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22” 。 七、基本操作流程 1、取出(check out) 取出版本库到一个工作拷贝: 来到任意空目录下,比如在f分区建立一个空文件夹 f:\work 。“右键 -> SVN Checkout”。在“URL of repository”中输入“svn://localhost/svn/repos1/guestbook”,这样我们就得到了一份 guestbook 中内容的工作拷贝。 2、存入(check in)/提交(commit) 在工作拷贝中作出修改并提交: 在 guestbook 工作拷贝中随便打开一个文件,作出修改,然后“右键 -> SVN Commit... ”。这样我们就把修改提交到了版本库,版本库根据情况存储我们提交的数据。 在修改过的文件上“右键 -> TortoiseSVN -> Show Log” ,可以看到对这个文件所有的提交。在不同的 revision 条目上“右键 -> Compare with working copy”,我们可以比较工作拷贝的文件和所选 revision 版本的区别。 3、导出(Export ) 我们想要给客户一个项目,当然不能带版本信息,我们可以用TortoiseSVN菜单里的Export来实现,新建一个文件夹,右击文件夹TortoiseSVN菜单里选择Export…
前 言 6 第1章 文件结构 11 1.1 版权和版本的声明 11 1.2 头文件的结构 12 1.3 定义文件的结构 13 1.4 头文件的作用 13 1.5 目录结构 14 第2章 程序的版式 15 2.1 空行 15 2.2 代码行 16 2.3 代码行内的空格 17 2.4 对齐 18 2.5 长行拆分 19 2.6 修饰符的位置 19 2.7 注释 20 2.8 类的版式 21 第3章 命名规则 22 3.1 共性规则 22 3.2 简单的WINDOWS应用程序命名规则 23 3.3 简单的UNIX应用程序命名规则 25 第4章 表达式和基本语句 26 4.1 运算符的优先级 26 4.2 复合表达式 27 4.3 IF 语句 27 4.4 循环语句的效率 29 4.5 FOR 语句的循环控制变量 30 4.6 SWITCH语句 30 4.7 GOTO语句 31 第5章 常量 33 5.1 为什么需要常量 33 5.2 CONST 与 #DEFINE的比较 33 5.3 常量定义规则 33 5.4 类中的常量 34 第6章 函数设计 36 6.1 参数的规则 36 6.2 返回值的规则 37 6.3 函数内部实现的规则 39 6.4 其它建议 40 6.5 使用断言 41 6.6 引用与指针的比较 42 第7章 内存管理 44 7.1内存分配方式 44 7.2常见的内存错误及其对策 44 7.3指针与数组的对比 45 7.4指针参数是如何传递内存的? 47 7.5 FREE和DELETE把指针怎么啦? 50 7.6 动态内存会被自动释放吗? 50 7.7 杜绝“野指针” 51 7.8 有了MALLOC/FREE为什么还要NEW/DELETE ? 52 7.9 内存耗尽怎么办? 53 7.10 MALLOC/FREE 的使用要点 54 7.11 NEW/DELETE 的使用要点 55 7.12 一些心得体会 56 第8章 C++函数的高级特性 57 8.1 函数重载的概念 57 8.2 成员函数的重载、覆盖与隐藏 60 8.3 参数的缺省值 63 8.4 运算符重载 64 8.5 函数内联 65 8.6 一些心得体会 68 第9章 类的构造函数、析构函数与赋值函数 69 9.1 构造函数与析构函数的起源 69 9.2 构造函数的初始化表 70 9.3 构造和析构的次序 72 9.4 示例:类STRING的构造函数与析构函数 72 9.5 不要轻视拷贝构造函数与赋值函数 73 9.6 示例:类STRING的拷贝构造函数与赋值函数 73 9.7 偷懒的办法处理拷贝构造函数与赋值函数 75 9.8 如何在派生类中实现类的基本函数 75 9.9 一些心得体会 77 第10章 类的继承与组合 78 10.1 继承 78 10.2 组合 80 第11章 其它编程经验 82 11.1 使用CONST提高函数的健壮性 82 11.2 提高程序的效率 84 11.3 一些有益的建议 85 参考文献 87 附录A :C++/C代码审查表 88 附录B :C++/C试题 93 附录C :C++/C试题的答案与评分标准 97 前 言 软件质量是被大多数程序员挂在嘴上而不是放在心上的东西! 除了完全外行和真正的编程高手外,初读本书,你最先的感受将是惊慌:“哇!我以前捏造的C++/C程序怎么会有那么多的毛病?” 别难过,作者只不过比你早几年、多几次惊慌而已。 请花一两个小时认真阅读这本百页经书,你将会获益匪浅,这是前面N-1个读者的建议。 一、编程老手与高手的误区 自从计算机问世以来,程序设计就成了令人羡慕的职业,程序员在受人宠爱之后容易发展成为毛病特多却常能自我臭美的群体。 如今在Internet上流传的“真正”的程序员据说是这样的: (1) 真正的程序员没有进度表,只有讨好领导的马屁精才有进度表,真正的程序员会让领导提心吊胆。 (2) 真正的程序员不写使用说明书,用户应当自己去猜想程序的功能。 (3) 真正的程序员几乎不写代码的注释,如果注释很难写,它理所当然也很难读。 (4) 真正的程序员不画流程图,原始人和文盲才会干这事。 (5) 真正的程序员不看参考手册,新手和胆小鬼才会看。 (6) 真正的程序员不写文档也不需要文档,只有看不懂程序的笨蛋才用文档。 (7) 真正的程序员认为自己比用户更明白用户需要什么。 (8) 真正的程序员不接受团队开发的理念,除非他自己是头头。 (9) 真正的程序员的程序不会在第一次就正确运行,但是他们愿意守着机器进行若干个30小时的调试改错。 (10) 真正的程序员不会在上午9:00到下午5:00之间工作,如果你看到他在上午9:00工作,这表明他从昨晚一直干到现在。 …… 具备上述特征越多,越显得水平高,资格老。所以别奇怪,程序员的很多缺点竟然可以被当作优点来欣赏。就象在武侠小说中,那些独来独往、不受约束且带点邪气的高手最令人崇拜。我曾经也这样信奉,并且希望自己成为那样的“真正”的程序员,结果没有得到好下场。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧