付出半个小时的笔误级BUG
一开始,我为了偷懒将所有的任务全都压在了一个浮动指针上:
for (; CCPtr->S != NULL; CCPtr->S = CCPtr->S->next) // for each x following a · in an item in CCi
{
char *Placeholder = strchr(CCPtr->S->Expression, '\376');
if (Placeholder != NULL && *(Placeholder + ) != '\0')
{
unsigned char PrevSym = *(Placeholder + );
printf("Goto(CC%d, %c(%d)):\n", CCPtr->id, PrevSym, PrevSym);
struct Collection *temp = Goto(CCPtr->S, PrevSym, TerminalCount); // temp <- goto(CCi, x)
PrintCollections(temp);
int temp_id = AddCoreCollection(CC, &CCTail, temp, CCid);
if (temp_id > CCid)
{
CCid++; // 意味着新的 CCID 被分配
HadChanged = true;
}
// record transition form CCi to temp on X
Record(RecordTable, CCPtr->id, PrevSym, temp_id);
}
}
直到在计算两次Goto(CC0, L)的时候得到了不一样的结果,PrevSym:unsigned char 和 TerminalCount:int 显然没有任何问题,那么问题就出在 CCPtr->S 上,它在两次循环时不应该改变。然而 for 的第三条子句很明确的修改了这个指针指向的值 CCPtr->S = CCPtr->S->next。
也就是说我不应该修改CCPtr指向的内存空间,我创造了一个新的指针指向CCPtr->S:
struct Collection *ExprPtr = NULL;
for (ExprPtr = CCPtr->S; ExprPtr != NULL; ExprPtr = ExprPtr->next) // for each x following a · in an item in CCi
{
char *Placeholder = strchr(ExprPtr->Expression, '\376');
if (Placeholder != NULL && *(Placeholder + ) != '\0')
{
unsigned char PrevSym = *(Placeholder + );
printf("Goto(CC%d, %c(%d)):\n", CCPtr->id, PrevSym, PrevSym);
struct Collection *temp = Goto(CCPtr->S, PrevSym, TerminalCount); // temp <- goto(CCi, x)
PrintCollections(temp);
int temp_id = AddCoreCollection(CC, &CCTail, temp, CCid);
if (temp_id > CCid)
{
CCid++; // 意味着新的 CCID 被分配
HadChanged = true;
}
// record transition form CCi to temp on X
Record(RecordTable, CCPtr->id, PrevSym, temp_id);
}
}
很好,一切正常。
对于这个 for 语句块而言,CCPtr 指向的内存空间应该是一个 Constant 区域,这里由于偷懒省去一个临时变量导致一大片空间丢失了指向自己的指针。
我觉得我现在应该去检查所有的 for 语句了。
付出半个小时的笔误级BUG的更多相关文章
- 20171201 - macOS High Sierra 神级 bug
昨日亲测有效,macOS High Sierra 神级 bug,系统管理员 root 密码为空,输入就可以登录,具备最高权限. 让人不禁想象 Apple Software 怎么了,人才都流失了吗?
- 半个小时教你写一个装(bi)逼(she)之地图搜租房
半个小时教你写一个装(bi)逼(she)之地图搜租房 首先需要一个Python3环境,怎么准备我就不多说了,实在不会的出门右转看一下廖雪峰老师的博客. HTML部分 代码来自:高德API+Python ...
- IDEA debug启动的时候需要等半个小时甚至更长时间
debug启动的时候需要等半个小时甚至更长时间 突然有一天发现debug启动不起来了, 在debug时,项目一直会出现 Connected to the VM ,address: 其实这不是debug ...
- Quartus13.1全编译出现引脚错误(神级bug)
BUG现象:分配完管脚后全编译出现如下错误. Error (171172):Detected confilicting assignments for the following nodes.Erro ...
- Java 得到指定时间加半个小时之后得时间
Calendar c = Calendar.getInstance(); c.setTime(cur); //设置时间 c.add(Calendar.MINUTE, 1); //日期分钟加1,Cale ...
- 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- 将近半个小时,把一小段简短的汇编代码写成了C语言代码
我自己看,感觉好像一句一句翻译的,写得很是生硬,不如书上写的灵活 0040137E 8B7424 04 MOV ESI,DWORD PTR SS:[ESP+4]00401382 ...
- Oracle中获取当前时间半小时前的时间
最近项目中有个要根据半个小时前的数据情况判断某一栏位的值,但是一直没想到怎样获取当前时间的半小时前的时间,今天突然想到可以通过sysdate做差来获取,比如sysdate-1这样的,刚开始没有对结果进 ...
- JS 格式化时间(获取两个日期之间的每一天、每一月、每半小时、每一秒)
时间戳转换为时间 // 时间戳转换为时间 function timestampToTime(timestamp, isMs = true) { const date = new Date(timest ...
随机推荐
- OUTPUT、Merge语句的使用
新版本的数据库中增加了OUTPUT子句,这个很好用,详细的使用方式大家可以参考SQL的联机帮助文档.这里仅记录下常用的场景:在对数据库进行增删改的时候我们有时候需要记录日志(这里指将日志记录在DB中而 ...
- 【原创】不用封装jar包 直接引入工程使用的方法(类似android的 is Library功能)
1.制作lib工程,这里我简单制作一个测试类 2.eclipse中 java Project工程引入方法 2.1.新建个java工程,在属性配置中选择 "Java Build Path&qu ...
- 设置tomcat启动超时,不会自动停止
tomcat启动时如果1000ms没有起来,服务就会自动停止.设置位置如下
- swift把汉字转换为拼音,并且截取首字母做索引用
var transformContents = CFStringCreateMutableCopy(nil, 0, "咋啊的看到回复阿斯顿发货发哦iasdifas")CFStrin ...
- java_设计模式_装饰者模式_Decorator Pattern(2016-07-28)
装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户 ...
- 【HDU4010】【LCT】Query on The Trees
Problem Description We have met so many problems on the tree, so today we will have a query problem ...
- Linq查询IEnumerable与IQueryable
class Program { static void Main(string[] args) { System.Diagnostics.Stopwatch stp = new Stopwatch() ...
- JS自执行函数的几种写法
一:整体写在一个括号中 代码如下: (function Show(){alert("hello");}()) 二:function函数整体外加括号 代码如下: (function ...
- 关于点击空白关闭弹窗的js写法推荐?
$(document).mouseup(function(e){ var _con = $(' 目标区域 '); // 设置目标区域 ){ // Mark 1 some code... // 功能代码 ...
- window 配置 sendmail
从http://glob.com.au/sendmail/下载sendmail.zip 解压sendmail.zip到目录下(最好使用短路径,长路径会导致问题的出现),我安装的路径是: E:\wamp ...