标题:C语言库编译时常见报错#经验分享与解决方法
水墨不写bug
(图片来源于网络)
有一句常说的话:一名程序员的工作时间,有三成在写代码,其余的七成都在调试。
也就是:我写bug——我找我写的bug——修bug——直到程序按照我们的想法运行,也就是我们写出来让在自己满意的程序。
报错是指在编程过程中出现的错误提示信息,标识了程序执行错误的原因和位置。而解决方法是指需要采取的行动来消除或修复报错的原因,以使程序正常运行。报错和解决方法之间的区别在于,报错是问题的体现,解决方法是解决问题的步骤或方案。报错是指出问题的地方,解决方法则是我们应该如何修复出问题的代码。因此,我们需要对报错信息进行正确的解读,并采取合适的解决方法来修复错误。
在写代码的过程中,我们在编译时会出现各种错误,有的编译器会报错,有的则不会;有的错误容易发现,有的则很难找出错误,在这里,我来分享一些常见的错误类型和实例:
也就是常见的语法错误(暂时这样认为),有一些会被编译器检测到,也就是违背语法规则,但有一些虽然不违背语法规则,能编译过去,但与我们想象的程序执行结果不同。
我们可以点击编译器下方的叉号来找到错误:
e.g.1
如图,点击叉号后,会出现整个错误列表:(以少写 ’ ; ‘ 为例)
由于VS编译器比较智能,
在错误列表中会有编译器的 说明,也就是错误信息;
在 行 的列表中也标出来了错误代码的行数。
此类错误,由于违背最基本的语法规则,借助编译器很容易被找到。
e.g.2
if (arr[i] > max); { max = arr[i]; }
在上面这段代码中,我们 ” 不小心 ” 多写了一个分号,编译器会正常地接受if判断语句后代码的分号,而不会提示任何警告信息,因此编译器对这段代码的处理与下面这段代码大不相同:
if (arr[i] > max) { max = arr[i]; }
在if()后多了一个分号,实际上相当于:
if(arr[i] > max) { ; } max = arr[i];
e.g.3
if (n < 3) return max = arr[i]; max = arr[j]; max = arr[k];
在上面这段代码中,不是多写了一个 “ ; ” ,而是少些了一个 “ ; ”,同样也会招致麻烦:
此处return后面遗漏了一个分号,然而这段代码在编译时让能通过,但会将语句:
max = arr[i];
当作了return语句的操作数。上面这段代码实际上就相当于:
if (n < 3) reyurn max = arr[i]; max = arr[j]; max = arr[k];
如果这段代码所在的函数声明其返回值为void,编译器会因为实际返回值的类型与声明返回值不一致而报错。
然而,如果一个函数不需要返回值,我们通常在函数声明时省略返回值类型,这时编译器会默认将这个函数的返回值视作int型。
如果这样,上面的错误就不会被编译器检测到。
此种错误类型一般是标识符名称不存在或者拼写错误:
然而我们在定义 inti_Board() 函数时却把函数名称错写成 “ initBoard() ”:
这时, 报错:
报错信息:无法解析的外部符号——原因是编译器找不到我们调用的inti_Board()函数。
这就是链接型错误的实例。
这种错误就十分隐蔽了,因为既它无法被编译器检测到,又没有任何报错,这时就需要我们自己通过调试来找bug了,这也就是本文开篇提到的通常情况下我们在找的bug。
调试是找bug的高效方法,以下是VS调试的常用技巧:
F5 —— 开始调试 / 跳到逻辑上下一个断点
F9 —— 设置 / 取消断点
F10 —— 逐行调试
F11 —— 进入函数内部
ctrl + F5 —— 开始运行,不调试
shift + F5 —— 停止调试
在条件语句处可设置条件断点:
这样如果你想观察i从0到365的变化情况,就免去了按365次F10的尴尬操作了;
回顾:
目录
希望本文对你有所帮助。
完
未经作者同意禁止转载
文章浏览阅读2.6k次,点赞2次,收藏6次。MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification出发点数据增强球合成器合成模块Synthesis module转换模块Transformation module损失函数球生成器部分损失函数元学习损失训练策略实验数据集结语出发点对于小样本学习文本分类问题中,限制其性能的主要原因之一是因为对于每一个类别有多种的表示方式。所以本文提出了一种数据增强方式来解决样本不足的问题。数据增强原文的数据增强:随机替_data augmentation for meta-learning
文章浏览阅读10w+次,点赞588次,收藏3.7k次。目录SSH的安全机制SSH的安装启动服务器的SSH服务SSH两种级别的远程登录SSH的高级应用Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,..._ssh @
文章浏览阅读4.6w次,点赞32次,收藏118次。Java中的byte详解介绍byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。byte取值范围分析一直在想为什么不是 -128 到 128呢?今天分析了一下这个问题。首先我们得明白一件事情,那就是运算规则(因为计算机中的数是以反码形式存储的,反码再求反码得到该数真值):正数的最高位都是 0 ,正数的值就是二进制表示的_java byte
文章浏览阅读2.8k次,点赞5次,收藏10次。默认样式(啥都没有……):一条:最大条数我设置的3:先简单说下我做的过程,希望有大佬指点,也想能够帮助到刚入门的各位同学。需求和实现:点击上传图片显示图片缩略图并不立即上传,将beforeUpdata中获取到的file存入fileList数组(multiple多选时,beforeUpdata依次传入每一张图的file),同时在beforeUpdata中要控制随后可上传的数组..._react ant-design upload图片上传 multiple
文章浏览阅读335次。转载自曹大公众号,不光是图,还有动画,读完对 Go GC 会有一个高层次的理解。这一篇是之前给极客时间 tony bai 老师专栏的供稿,经过编辑的同意,延迟几个月后可以在我的个人号上发出~本文内容只作了解,不建议作为面试题考察。武林秘籍救不了段错误包教包会包分配在各种流传甚广的 C 语言葵花宝典里,一般都有这么一条神秘的规则,不能返回局部变量:int*func(vo..._go gc
文章浏览阅读936次,点赞21次,收藏22次。MongoDB是一种流行的开源文档数据库,基于分布式文件存储的数据库;是一个介于关系数据库和非关系数据库之间的产品,它属于NoSQL数据库的一种,由C++语言编写;MySQL,它不遵循传统的表格结构,类似json的bson格式正因如此,对于JavaScript有天然的优势;
文章浏览阅读76次。网络编程入门软件结构C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。网络通信协议网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据..._java中网络编程课程作用大码
文章浏览阅读725次,点赞17次,收藏10次。USB8814是一款为测试音频和振动信号而设计的数据采集卡。该板卡提供8路同步模拟输入通道,24bit分辨率,每通道采样速率高达204.8KSPS,并且每通道集成独立的IEPE激励源,可直接实现对加速度传感器及麦克风等相关信号的调理。采集卡板载数字抗混叠滤波器,可有效降低高频噪声并抑制频率混叠。USB8814具备灵活的通道配置、多通道的动态信号采集,适用于诸如动态结构测试、音频/振动等高动态范围信号的采集应用场合。_8通道同步振动数据采集卡
文章浏览阅读322次。方案一:STM32系列单片机控制,该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节的闪存程序存储器,也就是说代码量可以写到128k字节,本次设计足够,内部高达20K字节的SRAM。_篮球计时器proteus
文章浏览阅读301次。如果隐藏域的值不为空,表示用户单击了提交按钮发出了POST请求if (!string.IsNullOrEmpty(Request.Form["isPostBack"]))IsPostBack:如果是POST请求该属性的值为true,如果是GET请求该属性的值为false.IsPostBack:是根据__VIEWSTATE隐藏域进行判断的,如果是POST请求那么该隐藏域的值会提交到服务端..._asp.net ispostback
文章浏览阅读9.8k次,点赞2次,收藏6次。为了避免每次重启系统后都要手动mount,可以在/etc/fstab中加入一行挂载配置,即可开机自动挂载,该方法简单方便。使用root执行命令:vim /etc/fstab并在该文件中添加如下内容:/dev/cdrom /mnt/cdrom iso9660 defaults 0 0 说明:第一列: 设备或磁盘分区 第二列: 挂载点 第三列: 设备_centos 8.5 启动 自动 mount
文章浏览阅读1k次。>>public abstract class ActionBarextends Object Added in API level 11仅支持3.0 以上的设备 并且google未提供该向下兼容包>>ActionBarSherlock 由http://actionbarsherlock.com/samples.html提供的开源组件目的是为了兼容2.*的设备>>何为兼容_actionbarsherlock-4.4.0/res/values/values.xml:268:5