编程不经历错误或警告,怎能见彩虹,没有人能随随便便成为高手。身为程序员的我们,如果哪一天没有了错误或警告的提示,一定会有一种不祥的预感,对吧,都懂的。编程N年来,碰到过的问题多得自己都记不清了,你也一样,如果可以选择,我愿时光倒流,真希望都能记下来,现在就可以写本《错误集》了,。下面是我心情好时,有想法时,随手记下的几个错误或警告,遗憾的是,这些年,就记下那么几个而已,见笑了,希望能给像我一样在路上的人有些帮助或提示。 1.提领指向不完全类型的指针 struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; #defineh_addr h_addr_list[0] }; 没有包含头文件,哈哈 比如这个结构,尽管在头文件中已经包含或定义,但对这个结构体的成员(hptr->h_name)变量进行访问时,编译无法通过,显示编译器错误提示为“提领指向不完全类型的指针”。 对于结构体来说虽然所有的变量默认都是公有的,但是,如果想访问里面的成员变量,必须有包含对其结构的定义,否则出现如上的错误,c编译器将无法识别结构里面的变量,一般想操作结构体里的成员变量,都是通过调用结构体中定义的函数接口,来取得结构体中的值,如果想直接访问,在头文件或源文件中加入结构体的定义就行了。 2.警告:赋值 makes pointer from integer without a cast 同样因为没包含头文件。 3.previous implicitdeclaration of 'Base64_Code' was here Base64_Code函数未定义,如果要使用 Base64_Code函数,则要先定义。 4.警告:use of cast expressions aslvalues is deprecated (short)buf[2] =atoi(&data[4]);不赞成把强制类型转换的结果作为左值 5.warning: initializationdiscards qualifiers from pointer target type initialization取消了指针目标类型的限定。 6.glibc detected *** free():invalid next size (normal) 是内存泄露的问题。 (1)一般是free了没有分配的内存 (2)还有就是分配了内存忘记释放也有可能会出现这样的问题。 (3)最后查出来是数组循环的时候越界了 , 写到了其他的内存里面, 然后一free那个区域就出现了这样的问题。 是有allocate引起的,一个debug的方法是把你怀疑的矩阵(比如释放了就会报内存错误)定义成静态的,这样如果出现越界,会报段错误。依次检查是否你的数组真的越界了。 7. undefined referenceto `__gxx_personality_v0' gcc main.c animal.o后,出现这个错误(c与c++混合编程中),解决:gcc main.c animal.o -lstdc++ 错误原因:是因为你用gcc编译.cpp文件.按系统默认.cpp文件是c++的文件格式 8.rmmod:gpio_i2c_LVP1008.ko: Resource temporarily unavailable [root: 1st]#lsmod //查看一下当前加载的模块 driver 1256 0- Live 0xbf00c000 device 1560 0- Live 0xbf006000 bus 1336 2driver,device, Live 0xbf000000 //模块的引用计数,bus模块被device和driver引用 [root: 1st]# rmmodbus //如果你要卸载bus模块,它会提示出错,要先卸载driver和device rmmod: remove'bus': Resource temporarily unavailable [root: 1st]#rmmod driver usb driverbye! [root: 1st]#rmmod device //卸载device时,内核自动调用device结构体中指定的release函数 <kernel>release usb device bye! [root: 1st]#lsmod //bus的引用计数为0,可以卸载bus了 bus 1336 0 -Live 0xbf012000 [root: 1st]#rmmod bus usb bus bye! 9. error: expectedidentifier before numeric constant错误。 原因:定义的enum结构体与其它处的宏定义有冲突。 10.warning: missing bracesaround initializer 原因:结构体初始化失败。 11.too many agrument 一种原因:参数多于10个。 12. /usr/bin/ld: cannot find-lxxx 原因:找不到对应库文件。其中,-lxxx表示链接库文件 libxxx.so。 一般出现这种错误有以下几种原因: 1.系统缺乏对应的库文件; 2.版本不对应; 3.库文件的链接错误; 4.库文件路径设置问题。 对应第一第二种情况,可以通过下载安装lib来解决,ubuntu大多数可以直接通过apt-get来安装: apt-get install libxxx-dev 一般遇到这种问题笔者第一时间也是会去检查系统是否已安装该lib或者是否已选择正确版本(只是习惯问题),如果还是不能解决问题,那么,引起错误的原因不是链接错误就是库文件路径问题了。 通过find或者locate指令定位到链接文件,查看链接文件是否正确的指向了我们希望的lib,如果不是,用ln -sf */libxxx.so.x */libxxx.so 指令修改它。 如果是库文件路径引发的问题,可以到/etc/ld.so.conf.d目录下,修改其中任意一份conf文件,(可以自建conf,以方便识别)将lib所在目录写进去,然后在终端输入ldconfig 更新缓存。
13.在控制台提示:Semop lock failureIdentifier removed Semop unlock failure Identifier removed 解决办法:运行应用程序,比如:client-qws& 去掉-qws 因为只有Server 才需要 -qws&。&为后台运行的标识。 14.Segmentation fault 数组越界或访问空、野指针或未被初始化的指针都会出现这个问题。 15.安装VMware: The MSI'C:\Users\dell\AppData\Local\Temp\vmware_1344246656\vmwarevmcisockets64.msi'failed 清空注册表中vmware信息(或者下载一个VM卸载工具): 1、开始->运行,输入:regedit; 2、在注册表中,找到:HKEY_LOCAL_MACHINE\SOFTWARE\VMware并删除。 VMware Workstation unrecoverable error:(vmx)错误 解决:删除或修改虚拟机目录下拓展名为.vmss(33.3M)文件,再次启动即可。 一般为centos5.6-d4cf3290.vmss文件。 16.arm板运行时出现Can't retrieve login name 原因:RTP的JRTPLIB库中的RTPSession中的Create->InternalCreate->CreateCNAME中,有对用户名进行一定操作,其中的getlogin_r(),getlogin()和getenv()操作都会因为用户名为空,而返回错误ERR_RTP_SESSION_CANTGETLOGINNAME。 17. warning: control reaches end of non-void function 呵呵,很好,以后继续++ 我想,错误不在于多寡以及自己笔记记下了多少,而是在于能养成一种良好的习惯,编程以逻辑为重,比如最为简单的if(0 == i),错误的锁定及调试手段#define _DEBUG(msg...) printf("[ %s,%s, %d ] ",__FILE__, __FUNCTION__, __LINE__); printf(msg);printf("\r\n")等等等等………… |
|
来自: 海漩涡 > 《bigDragon》