C++实现网格水印之调试笔记(一)
首先说一下我的一些简单的调试方法,除了常规的断点调试之外,我还会使用注释的方法来调试。当整个工程代码量相当多且调用层次关系较为复杂时,这种方法能够比较高效的定位到出错误的代码段或某个函数,然后在出现错误的代码段中用断点调试,结合监视器就能逐步定位到具体的错误点了。
有时会遇到下列提示的错误
0xC0000005错误通常是由于内存访问错误引起,可能是你的程序有错误的指针操作或者访问了空对象
这个时候使用调试,慢慢查找到底哪个指针是空的,找到之后将指针初始化问题就可以解决了。
之前由于贪图方便,把setM函数的参数也设置为m,然后赋值语句变成了m = m,在我的理解里,应该是不会出现问题的,但实际上这样赋值会出现歧义。看来太久没有写面向对象的程序,连一些基础的问题都忘记了。。。由于这个错误的set函数,导致m的值总是不正确,继而导致了后续出现一些新的错误,比如我遇到的问题是,vector下标访问越界,因为我的vector的大小是由m来决定的。这种错误不容易被发现,因为可以通过编译,并且从调试的角度来看,一般不会想到m的值会有问题。
继续往下写程序又遇到新的问题,提示如下:
经过调试,发现错误出在createWB这个函数上,首先看下这个函数的声明和定义
应该不存在问题,而且在一个单独的工程中写createA和createWB都不会出现错误,为什么会出现上述错误呢?
原因是c没有初始值。。。
接下来在这句话上出现了中断
调试得出的结果了alpha没有赋初值。。
这个地方涉及到类之间函数的调用,需要仔细整理一下思路。
我在TestMyProject中写了如上数据类型。一开始我希望在别的工程中也能访问上诉数据,所以我以为,把这些私有的数据类型的访问说明符改为public就可以了。我在这个类本身的一个函数下调用了set函数来设置这些数据,然后我错误的以为这时上诉类型都被赋值成功了。
随即我在其他工程中声明了一个TestMyProject的对象,然后用这个对象直接访问上述数据。结果出现了vector下标越界错误。
这个错误的出现是因为对面向对象中的数据的访问属性理解出现了错误,一度困扰我很久。
事实上,public访问说明符的作用是被修饰的数据可以被:
1.该类中的函数、
2.子类的函数、
3.其友元函数访问,
4.该类的对象访问。
而当实例化一个对象时,每个对象有自己独立的数据成员,除非在类中的某个数据是static的(这种情况下所有实例共享同一份数据),否则在创建实例时,实例就保存了自己的数据成员,需要自己单独的调用set函数(或直接调用数据成员)进行赋值。因此,在我遇到的这个例子里,将数据声明为public的后,就可以使用该类的对象来访问了。
C++实现网格水印之调试笔记(一)的更多相关文章
- C++实现网格水印之调试笔记(六)—— 提取完成
昨天在修改了可以调试出来的错误之后,提取出的水印和嵌入的仍然相去甚远.这个时候我觉得有必要整理一下嵌入和提取的整个过程. 嵌入过程: Step1,嵌入的时候对网格的拉普拉斯矩阵L进行特征值分解,得到特 ...
- C++实现网格水印之调试笔记(六)——补充
调用matlab生成的网格水印特征向量矩阵 从文件中读取的原始网格的特征向量矩阵 好吧,之前得出的结果不正确是因为代码写错了.因为实现论文中的提取方案时代码写错了,自己想了另外一个方法,结果方向两者在 ...
- C++实现网格水印之调试笔记(五)—— 提取出错
在实现提取水印的过程中,遇到了一些问题 首先还是根据论文中的思路来梳理一下整个提取流程 读入两个模型,一个原始模型ori_mesh, 一个水印模型wm_mesh. 将两个模型对齐(即放在同一个坐标系下 ...
- C++实现网格水印之调试笔记(二)
整理了一下要实现的论文Watermarking 3D Polygonal Meshes in the Mesh Spectral Domain,步骤如下: 嵌入水印 à 提取水印 à 优化(网格细分) ...
- C++实现网格水印之调试笔记(四)—— 完成嵌入
接下来的问题是,当模型是对称的时候,结果是符合预期的,但是当模型是不对称的时候,结果是错误的,如下: 输入: 顶点:233 输出: 这又是什么鬼...,我的马呢!!! 看来逻辑上还是有错误 注意这时候 ...
- C++实现网格水印之调试笔记(三)—— 初有结果
错误: error C2338: THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD 这种错误 ...
- Tomcat调试笔记
调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...
- JavaScript特效(调试笔记)
JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: function getTime() { var today = new Date() ...
- USB wifi调试笔记
本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中Wi ...
随机推荐
- cojs 简单的数位DP 题解报告
首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...
- lintcode:Compare Strings 比较字符串
题目: 比较字符串 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母 样例 给出 A = "ABCD" B = "ACD" ...
- 在PowerDesigner中设计概念模型
原文:在PowerDesigner中设计概念模型 在概念模型中主要有以下几个操作和设置的对象:实体(Entity).实体属性 (Attribute).实体标识(Identifiers).关系(Rela ...
- 245. Shortest Word Distance III
题目: This is a follow up of Shortest Word Distance. The only difference is now word1 could be the sam ...
- Servlet小示例:jsp页面提交信息Servlet接收并打印输出
该示例采用doPost方法提交表单,该示例一共包含两个文件. 一个是用来提交用户信息的表单userForm2.jsp,另一个是用来接收参数的Servlet. userForm2.jsp <%@ ...
- latex 三线表
LaTeX 处理三线表相当简单方便.用到的宏包主要是 booktabs .代码如下: 需要添加包:\usepackage{booktabs}. \documentclass{article} \use ...
- (step4.3.4)hdu 1258(Sum It Up——DFS)
题目大意:输入t,n,接下来有n个数组成的一个序列.输出总和为t的子序列 解题思路:DFS 代码如下(有详细的注释): #include <iostream> #include <a ...
- android线程池
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...
- jquery ajax请求 清除缓存
使用jquery里load方法或者ajax调用页面的时候会存在cache的问题,清除cache的方法: 调用jQuery.ajaxSetup ({cache:false}) 方法即可.
- Go Deeper(2010成都现场赛题)(2-sat)
G - Go Deeper Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description ...