刚开始学习C语言,different types for formal and actual parameter 1 执行 cl.exe 时出错.

C语言数组参数与指针参数_C语言中文网
&&/&&&&/&&&&/&&
我们都知道参数分为形参和实参。形参是指声明或定义函数时的参数,而实参是在调用函数时主调函数传递过来的实际值。
一、一维数组参数
1、能否向函数传递一个数组?看例子:
void fun(char a[10])
& &char c = a[3];
& &char b[10] = &abcdefg&;
& &fun(b[10]);
& &return 0;
先看上面的调用,fun(b[10]);将b[10]这个数组传递到fun 函数。但这样正确吗?b[10]是代表一个数组吗?
显然不是,我们知道b[0]代表是数组的一个元素,那b[10]又何尝不是呢?只不过这里数组越界了,这个b[10]并不存在。但在编译阶段,编译器并不会真正计算b[10]的地址并取值,所以在编译的时候编译器并不认为这样有错误。虽然没有错误,但是编译器仍然给出了两个警告:
& &warning C4047: 'function' : 'char *' differs in levels of indirection from 'char '
& &warning C4024: 'fun' : different types for formal and actual parameter 1
这是什么意思呢?这两个警告告诉我们,函数参数需要的是一个char*类型的参数,而实际参数为char 类型,不匹配。虽然编译器没有给出错误,但是这样运行肯定会有问题。如图:
这是一个内存异常,我们分析分析其原因。其实这里至少有两个严重的错误。
第一:b[10]并不存在,在编译的时候由于没有去实际地址取值,所以没有出错,但是在运行时,将计算b[10]的实际地址,并且取值。这时候发生越界错误。
第二:编译器的警告已经告诉我们编译器需要的是一个char*类型的参数,而传递过去的是一个char 类型的参数,这时候fun 函数会将传入的char 类型的数据当地址处理,同样会发生错误。(这点前面已经详细讲解)
第一个错误很好理解,那么第二个错误怎么理解呢?fun 函数明明传递的是一个数组啊,编译器怎么会说是char *类型呢?别急,我们先把函数的调用方式改变一下:
& &fun(b);
b 是一个数组,现在将数组b 作为实际参数传递。这下该没有问题了吧?调试、运行,一切正常,没有问题,收工!很轻易是吧?但是你确认你真正明白了这是怎么回事?数组b真的传递到了函数内部?
2、无法向函数传递一个数组
我们完全可以验证一下:
void fun(char a[10])
& &int i = sizeof(a);
& &char c = a[3];
如果数组b 真正传递到函数内部,那i 的值应该为10。但是我们测试后发现i 的值竟然为4!为什么会这样呢?难道数组b 真的没有传递到函数内部?是的,确实没有传递过去,这是因为这样一条规则:
C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。
这么做是有原因的。在C 语言中,所有非数组形式的数据实参均以传值形式(对实参做一份拷贝并传递给被调用的函数,函数不能修改作为实参的实际变量的值,而只能修改传递给它的那份拷贝)调用。然而,如果要拷贝整个数组,无论在空间上还是在时间上,其开销都是非常大的。更重要的是,在绝大部分情况下,你其实并不需要整个数组的拷贝,你只想告诉函数在那一刻对哪个特定的数组感兴趣。这样的话,为了节省时间和空间,提高程序运行的效率,于是就有了上述的规则。同样的,函数的返回值也不能是一个数组,而只能是指针。这里要明确的一个概念就是:函数本身是没有类型的,只有函数的返回值才有类型。很多书都把这点弄错了,甚至出现&XXX 类型的函数&这种说法。简直是荒唐至极!
经过上面的解释,相信你已经理解上述的规定以及它的来由。上面编译器给出的提示,说函数的参数是一个char*类型的指针,这点相信也可以理解。既然如此,我们完全可以把fun 函数改写成下面的样子:
void fun(char *p)
& &char c = p[3];//或者是char c = *(p+3);
同样,你还可以试试这样子:
void fun(char a[10])
& &char c = a[3];
& &char b[100] = &abcdefg&;
& &fun(b);
& &return 0;
运行完全没有问题。实际传递的数组大小与函数形参指定的数组大小没有关系。既然如此,那我们也可以改写成下面的样子:
void fun(char a[ ])
& &char c = a[3];
改写成这样或许比较好,至少不会让人误会成只能传递一个10 个元素的数组。
二、一级指针参数
1、能否把指针变量本身传递给一个函数
我们把上一节讨论的列子再改写一下:
void fun(char *p)
& &char c = p[3];//或者是char c = *(p+3);
& &char *p2 = &abcdefg&;
& &fun(p2);
& &return 0;
这个函数调用,真的把p2 本身传递到了fun 函数内部吗?
我们知道p2 是main 函数内的一个局部变量,它只在main 函数内部有效。(这里需要澄清一个问题:main 函数内的变量不是全局变量,而是局部变量,只不过它的生命周期和全局变量一样长而已。全局变量一定是定义在函数外部的。初学者往往弄错这点。)既然它是局部变量,fun 函数肯定无法使用p2 的真身。那函数调用怎么办?好办:对实参做一份拷贝并传递给被调用的函数。即对p2 做一份拷贝,假设其拷贝名为_p2。那传递到函数内部的就是_p2 而并非p2 本身。
2、无法把指针变量本身传递给一个函数
这很像孙悟空拔下一根猴毛变成自己的样子去忽悠小妖怪。所以fun 函数实际运行时,用到的都是_p2 这个变量而非p2 本身。如此,我们看下面的例子:
void GetMemory(char * p, int num)
& &p = (char *)malloc(num*sizeof(char));
& &char *str = NULL;
& &GetMemory(str,10);
& &strcpy(str,&hello&);
& &free(str);//free 并没有起作用,内存泄漏
& &return 0;
在运行strcpy(str,&hello&)语句的时候发生错误。这时候观察str 的值,发现仍然为NULL。也就是说str 本身并没有改变,我们malloc 的内存的地址并没有赋给str,而是赋给了_str。
而这个_str 是编译器自动分配和回收的,我们根本就无法使用。所以想这样获取一块内存是不行的。那怎么办? 两个办法:
第一:用return。
char * GetMemory(char * p, int num)
& &p = (char *)malloc(num*sizeof(char));
& &return p;
& &char *str = NULL;
& &str = GetMemory(str,10);
& &strcpy(str,&hello&);
& &free(str);
& &return 0;
这个方法简单,容易理解。
第二:用二级指针。
void GetMemory(char ** p, int num)
& &*p = (char *)malloc(num*sizeof(char));
& &return p;
& &char *str = NULL;
& &GetMemory(&str,10);
& &strcpy(str,&hello&);
& &free(str);
& &return 0;
注意,这里的参数是&str 而非str。这样的话传递过去的是str 的地址,是一个值。在函数内部,用钥匙(&*&)来开锁:*(&str),其值就是str。所以malloc 分配的内存地址是真正赋值给了str 本身。
另外关于malloc 和free 的具体用法,内存管理那章有详细讨论。
三、二维数组参数与二维指针参数
前面详细分析了二维数组与二维指针,那它们作为参数时与不作为参数时又有什么区别呢?看例子:
& &void fun(char a[3][4]);
我们按照上面的分析,完全可以把a[3][4]理解为一个一维数组a[3],其每个元素都是一个含有4 个char 类型数据的数组。上面的规则,&C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。&在这里同样适用,也就是说我们可以把这个函数声明改写为:
& &void fun(char (*p)[4]);
这里的括号绝对不能省略,这样才能保证编译器把p 解析为一个指向包含4 个char 类型数据元素的数组,即一维数组a[3]的元素。
同样,作为参数时,一维数组&[]&号内的数字完全可以省略:
& &void fun(char a[ ][4]);
不过第二维的维数却不可省略,想想为什么不可以省略?
注意:如果把上面提到的声明void fun(char (*p)[4])中的括号去掉之后,声明&void f un(char *p[4])&可以改写成:
& &void fun(char **p);
这是因为参数*p[4],对于p 来说,它是一个包含4 个指针的一维数组,同样把这个一维数组也改写为指针的形式,那就得到上面的写法。
上面讨论了这么多,那我们把二维数组参数和二维指针参数的等效关系整理一下:
这里需要注意的是:C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。这条规则并不是递归的,也就是说只有一维数组才是如此,当数组超过一维时,将第一维改写为指向数组首元素首地址的指针之后,后面的维再也不可改写。比如:a[3][4][5]作为参数时可以被改写为(*p)[4][5]。
至于超过二维的数组和超过二级的指针,由于本身很少使用,而且按照上面的分析方法也能很好的理解,这里就不再详细讨论。有兴趣的可以好好研究研究。
编程帮,一个分享编程知识的公众号。跟着一起学习,每天都有进步。
通俗易懂,深入浅出,一篇文章只讲一个知识点。
文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。
文章不涉及代码,不烧脑细胞,人人都可以学习。
当你决定关注「编程帮」,你已然超越了90%的程序员!
微信扫描二维码关注
推荐文章 TOP10select2(); }
五、调试与测试:
1. 菜单编写:
错误提示1: C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(83) : error C2043: illegal break
C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(84) : error C2046: illegal case
C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(84) : error C2043: illegal break
C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(85) : error C2046: illegal case
C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(85) : error C2043: illegal break
C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(86) : error C2046: illegal case
C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(86) : error C2043: illegal break
执行 cl.exe 时出错.
错误原因:select()中switch里面的case1,case2,case3,case4要用{}括起
解决办法:将select()中switch里面的case1,case2,case3,case4用{}括起
错误提示2:C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(1052) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'char '
C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(1052) : warning C4024: 'strcmp' : different types for formal and actual parameter 2
错误原因:函数xmchaxun()中的姓名变量为 char x
解决办法:将函数xmchaxun()中的姓名变量为 char x 改为 char x[9],&x改为x
2. 排序函数:
错误提示1:paiming1()函数只能交换一次数据,不能完整地排名
错误原因:循环时错误
解决方法:将 for(i=0;i&=biaohao1,i++)
for(m=0;m&=biaohao1-i;m++)
for(m=0;m&=biaohao1-1;m++)
for(i=0;i&=biaohao1-m;i++)
错误提示2:C:\Documents and Settings\Administrator\桌面\黄欢王雅的课程设计.c(745) : error C2106: '=' : left operand must be l-value
执行 cl.exe 时出错\
错误原因:字符串比较格式错误
解决方法:把if( a[i].name=x)改为if( strcmp(a[i].name,x)==0 )
3.查询函数
错误提示:只能对第一组的数据进行查询,从第二组开始将无法查询
错误原因:查询函数xhchaxun1()中 for(i=0;i&=20;i++)
if(x=a[i].num)
出现算法错误
解决方法:将查询函数xhchaxun1()中 for(i=0;i&=20;i++)
if(x=a[i].num)
改为for(i=0;i&=20;i++)
if(x=a[i].num)
1. 问题:执行完一个功能后不能继续执行下一个功能,只在本功能中操作
解决办法:在功能最后调用菜单函数
2. 问题:输出的数据未对齐
解决办法:经老师指导,采用多行printf对数据进行输出
3. 问题:删除学生信息后,无法输出被删学生后的学生信息
解决方法:修改删除方法,将删除改为用后面的学生覆盖
3. 问题:录入过程中输入不合理的数据,如成绩大于100,浏览时显示不合理数据 解决办法:在录入过程中判断输入的成绩是否合理,添加成绩判断函数。
4. 问题:程序结束后,再次运行,原数据消失,需再次录入,当人数较多时工作量较大 解决办法:编写保存,导入函数
5.问题:有些函数的功能总是无法全部实现,找不到代码的错误,不知如何修改
解决办法:将代码重新整理,注意排版,特别是for,while,if等的包含关系及break的正确使用
六、课程设计总结或结论
这次的课程设计,是在老师的帮助下和队友王雅共同努力完成的,当真正的写完报告时,心里的感触很深,我知道掌握理论知识和进行相应实践对于学习C语言的重要性,也明白了课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.这对我们今后的工作能力上,有明显的加强。
此次课程设计,我知道和王雅是怎样编写代码发现问题的。的确,从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且碰到了很多从来没有碰到过的问题。通过这次课程设计,认识到理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,很多很多,但我们都坚持做下去了.在设计的过程中发现了我们的不足之处,我们真的掌握的太少了,比如我们不熟悉指针和链表使用,带来了很多麻烦.
这是我们的第一份课程设计,我想这道题我们会永远记住的,程序永远写不完,代码永远可以添加,完善…编程人永远要对编程有种应有的热情和执着!
在此,我再次感谢亲爱的,可爱的,深爱的,挚爱的颜老师!!!
七、参考文献
《C程序设计》谭浩强著
八、小组成员分工说明
组员:黄欢
一起设计算法,相互讨论,每个函数各自进行编写,然后交流,完成最佳代码,对不同问题寻找解决办法,王雅主要负责写代码,黄欢主要负责调试和运行。问题: 都来看看这个错误在哪里呢?? 这个是我找的代码 看了看觉得没错
//这个是一个服务程序的代码,我用的编译器是VC++6.0
#include&"stdio.h"
#include&"windows.h"
/*typedef&&&int&&&BOOL;
#ifndef&&&TURE&
#define&&&TURE&&&1&
#ifndef&&&FALSE
#define&&&FALSE&&&0&
SERVICE_STATUS m_
SERVICE_STATUS_HANDLE&m_
BOOL&brunning&=&TRUE;
void&WINAPI&ServiceMain(DWORD&argc,LPTSTR&*argv);//服务主函数
void&WINAPI&ServiceCtrlHandler(DWORD&opcode);//服务控制函数
void&WINAPI&CmdStart(void);//要启动的程序函数
BOOL&InstallService();//安装服务的函数
BOOL&DeletService();//卸载服务
int&main(int&argc,char&*argv[])
printf("\twindows&基本服务演示!\n");
if(argc&!=&3){
printf("参数错误!\n");
if(strcmp(argv[1],"-install")&==&0){
if(InstallService()){
printf("\n\n服务安装成功!\n");
printf("\n\n安装服务的过程中出现错误!\n");
else&if(strcmp(argv[1],"-remove")&==&0){
if(DeletService()){
printf("\n\n服务卸载成功!\n");
printf("\n\n服务卸载出错!\n");
printf("\n%s服务的安装或者卸载出错!\n");
SERVICE_TABLE_ENTRY&dispatchtable[]&=&{{"WindowsNT自启动",ServiceMain},{NULL,NULL}};
StartServiceCtrlDispatcher(dispatchtable);//注册服务主函数
//服务主函数
void&WINAPI&ServiceMain(DWORD&argc,LPTSTR&*argc)
//注册服务
m_servicestatus.dwServiceType&=&SERVICE_WIN32;
m_servicestatus.dwCurrentState&=&SERVICE_START_PENDING;//服务开始之前
m_servicestatus.dwControlsAccepted&=&SERVICE_ACCEPT_STOP;
m_servicestatus.dwWin32ExitCode&=&0;
m_servicestatus.dwServiceSpecificExitCode&=&0;
m_servicestatus.dwCheckPoint&=&0;
m_servicestatus.dwWaitHint&=&0;
m_servicestatushandle&=&RegisterServiceCtrlHandler("WindowsNT自启动",ServiceCtrlHandler);//注册服务控制函数
if(m_servicestatushandle&==&(SERVICE_STATUS_HANDLE)0){
m_servicestatus.dwCurrentState&=&SERVICE_RUNNING;
m_servicestatus.dwCheckPoint&=&0;
m_servicestatus.dwWaitHint&=&0;
SetServiceStatus(m_servicestatushandle,&m_servicestatus);
brunning&=&TRUE;
//启动服务
CmdStart();
//服务控制函数
void&WINAPI&ServiceCtrlHandler(DWORD&opcode)
switch(opcode){
case&SERVICE_CONTROL_PAUSE:
m_servicestatus.dwCurrentState&=&SERVICE_PAUSED;
case&SERVICE_CONTROL_CONTINUE:
m_servicestatus.dwCurrentState&=&SERVICE_RUNNING;
case&SERVICE_CONTROL_STOP:
m_servicestatus.dwWin32ExitCode&=&0;
m_servicestatus.dwCurrentState&=&SERVICE_STOPPED;
m_servicestatus.dwCheckPoint&=&0;
m_servicestatus.dwWaitHint&=&0;
SetServiceStatus(m_servicestatushandle,&m_servicestatus);
brunning&=&FALSE;
case&SERVICE_CONTROL_INTERROGATE:
//安装服务
BOOL&InstallService()
char&strdir[1024];
SC_HANDLE&scmanager,
GetCurrentDirectory(1024,strdir);
GetModuleFileName(NULL,strdir,sizeof(strdir));
char&chsyspath[1024];
GetSystemDirectory(chsyspath,sizeof(chsyspath));
strcat(chsyspath,"\\windowsNT自启动.exe");
if(CopyFile(strdir,chsyspath,FALSE)){
printf("复制成功!\n");
strcpy(strdir,chsyspath);
scmanager&=&OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scmanager&==&NULL){
printf("打开控制管理器失败!\n");
return&FALSE;
LPCTSTR&lpszpath&=&
scservice&=&CreateService(scmanager,"windowsNT自启动","Windows&Manger&Control",
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
NULL,NULL,NULL,NULL,NULL);
if(scservice&==&NULL){
printf("添加服务失败!\n");
return&FALSE;
CloseServiceHandle(scservice);
return&TRUE;
//卸载服务
BOOL&DeletService()
SC_HANDLE&
SC_HANDLE&
&&&&scmanger&=&OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
char&syspath[1024];
GetSystemDirectory(syspath,sizeof(syspath));
strcat(syspath,"\\windowsNT自启动.exe");
if(scmanger&==&NULL){
printf("打开服务管理器失败!\n");
return&FALSE;
hservice&=&OpenService(scmanger,"WindowsNT自启动",SERVICE_ALL_ACCESS);
if(hservice&==&NULL){
printf("打开服务失败!\n");
return&FALSE;
if(DeleteFile(syspath)&==&0){
printf("删除文件失败!\n");
return&FALSE;
printf("删除文件成功!\n");
if(DeletService(hservice)&==&0){
return&FALSE;
if(CloseServiceHandle(hservice)&==&0){
return&FALSE;
return&TRUE;
//要启动的程序代码
void&WINAPI&CmdStart(void)
//错误信息
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(54)&:&error&C2275:&'SERVICE_TABLE_ENTRY'&:&illegal&use&of&this&type&as&an&expression
&&&&&&&&e:\学习软件\vc++6.0\vc++.6.0.with.sp6\vc6cn\vc98\include\winsvc.h(384)&:&see&declaration&of&'SERVICE_TABLE_ENTRY'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(54)&:&error&C2146:&syntax&error&:&missing&';'&before&identifier&'dispatchtable'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(54)&:&error&C2065:&'dispatchtable'&:&undeclared&identifier
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(54)&:&error&C2059:&syntax&error&:&']'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(55)&:&warning&C4047:&'function'&:&'const&struct&_SERVICE_TABLE_ENTRYA&*'&differs&in&levels&of&indirection&from&'int&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(55)&:&warning&C4024:&'StartServiceCtrlDispatcherA'&:&different&types&for&formal&and&actual&parameter&1
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(60)&:&error&C2040:&'argc'&:&'char&**&'&differs&in&levels&of&indirection&from&'unsigned&long&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(61)&:&warning&C4029:&declared&formal&parameter&list&different&from&definition
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(124)&:&error&C2143:&syntax&error&:&missing&';'&before&'type'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(125)&:&error&C2065:&'chsyspath'&:&undeclared&identifier
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(125)&:&warning&C4047:&'function'&:&'char&*'&differs&in&levels&of&indirection&from&'int&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(125)&:&warning&C4024:&'GetSystemDirectoryA'&:&different&types&for&formal&and&actual&parameter&1
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(126)&:&warning&C4047:&'function'&:&'char&*'&differs&in&levels&of&indirection&from&'int&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(126)&:&warning&C4024:&'strcat'&:&different&types&for&formal&and&actual&parameter&1
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(128)&:&warning&C4047:&'function'&:&'const&char&*'&differs&in&levels&of&indirection&from&'int&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(128)&:&warning&C4024:&'CopyFileA'&:&different&types&for&formal&and&actual&parameter&2
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(132)&:&warning&C4047:&'function'&:&'const&char&*'&differs&in&levels&of&indirection&from&'int&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(132)&:&warning&C4024:&'strcpy'&:&different&types&for&formal&and&actual&parameter&2
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(141)&:&error&C2275:&'LPCTSTR'&:&illegal&use&of&this&type&as&an&expression
&&&&&&&&e:\学习软件\vc++6.0\vc++.6.0.with.sp6\vc6cn\vc98\include\winnt.h(196)&:&see&declaration&of&'LPCTSTR'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(141)&:&error&C2146:&syntax&error&:&missing&';'&before&identifier&'lpszpath'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(141)&:&error&C2065:&'lpszpath'&:&undeclared&identifier
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(141)&:&warning&C4047:&'='&:&'int&'&differs&in&levels&of&indirection&from&'char&*'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(148)&:&warning&C4047:&'function'&:&'const&char&*'&differs&in&levels&of&indirection&from&'int&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(148)&:&warning&C4024:&'CreateServiceA'&:&different&types&for&formal&and&actual&parameter&8
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(168)&:&error&C2143:&syntax&error&:&missing&';'&before&'type'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(169)&:&error&C2065:&'syspath'&:&undeclared&identifier
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(169)&:&warning&C4047:&'function'&:&'char&*'&differs&in&levels&of&indirection&from&'int&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(169)&:&warning&C4024:&'GetSystemDirectoryA'&:&different&types&for&formal&and&actual&parameter&1
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(170)&:&warning&C4047:&'function'&:&'char&*'&differs&in&levels&of&indirection&from&'int&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(170)&:&warning&C4024:&'strcat'&:&different&types&for&formal&and&actual&parameter&1
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(184)&:&warning&C4047:&'function'&:&'const&char&*'&differs&in&levels&of&indirection&from&'int&'
E:\学习软件\C语言程序\windowsNT自启动服务\windowsNT自启动.c(184)&:&warning&C4024:&'DeleteFileA'&:&different&types&for&formal&and&actual&parameter&1
执行&cl.exe&时出错.
windowsNT自启动.obj&-&1&error(s),&0&warning(s)解决方案1:
//卸载服务
BOOL&DeletService()&&//该函数在这里定义实现时没有传参数,你调用时怎么可以给他传参数呢
SC_HANDLE&
SC_HANDLE&
&&scmanger&=&OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);解决方案2://服务主函数
void&WINAPI&ServiceMain(DWORD&argc,LPTSTR&*argv)//这儿参数改为(DWORD&argc,LPTSTR&*argv)
//注册服务
以上介绍了“ 都来看看这个错误在哪里呢?? 这个是我找的代码 看了看觉得没错”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/2673910.html
上一篇: 下一篇:

我要回帖

 

随机推荐