一开始,我为了偷懒将所有的任务全都压在了一个浮动指针上:

 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的更多相关文章

  1. 20171201 - macOS High Sierra 神级 bug

    昨日亲测有效,macOS High Sierra 神级 bug,系统管理员 root 密码为空,输入就可以登录,具备最高权限. 让人不禁想象 Apple Software 怎么了,人才都流失了吗?

  2. 半个小时教你写一个装(bi)逼(she)之地图搜租房

    半个小时教你写一个装(bi)逼(she)之地图搜租房 首先需要一个Python3环境,怎么准备我就不多说了,实在不会的出门右转看一下廖雪峰老师的博客. HTML部分 代码来自:高德API+Python ...

  3. IDEA debug启动的时候需要等半个小时甚至更长时间

    debug启动的时候需要等半个小时甚至更长时间 突然有一天发现debug启动不起来了, 在debug时,项目一直会出现 Connected to the VM ,address: 其实这不是debug ...

  4. Quartus13.1全编译出现引脚错误(神级bug)

    BUG现象:分配完管脚后全编译出现如下错误. Error (171172):Detected confilicting assignments for the following nodes.Erro ...

  5. Java 得到指定时间加半个小时之后得时间

    Calendar c = Calendar.getInstance(); c.setTime(cur); //设置时间 c.add(Calendar.MINUTE, 1); //日期分钟加1,Cale ...

  6. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  7. 将近半个小时,把一小段简短的汇编代码写成了C语言代码

    我自己看,感觉好像一句一句翻译的,写得很是生硬,不如书上写的灵活 0040137E    8B7424 04       MOV ESI,DWORD PTR SS:[ESP+4]00401382    ...

  8. Oracle中获取当前时间半小时前的时间

    最近项目中有个要根据半个小时前的数据情况判断某一栏位的值,但是一直没想到怎样获取当前时间的半小时前的时间,今天突然想到可以通过sysdate做差来获取,比如sysdate-1这样的,刚开始没有对结果进 ...

  9. JS 格式化时间(获取两个日期之间的每一天、每一月、每半小时、每一秒)

    时间戳转换为时间 // 时间戳转换为时间 function timestampToTime(timestamp, isMs = true) { const date = new Date(timest ...

随机推荐

  1. 安卓工程修改包名后 Failed to find provider info for...问题

    安卓工程修改包名后 Failed to find provider info for com.android...provider问题 原因: 1. 多处含包名文件须同时更改 2. Manifest里 ...

  2. Gprinter Android SDK V2.1.4 使用说明

    佳博打印机Android的SDK开发包,已更新到Gprinter Android SDK V2.1.4. IOS的SDK开发包更新为GprinterSDKandDemoforIOS_v1.0.8. 根 ...

  3. NodeJS学习笔记—1.CommonJS规范

    由于现在web开发,越来越重视代码的复用和抽象的封装,为了解决代码的组织结构.管理.复用和部署等问题,现在普遍采用的机制是模块机制(module).CommonJS约定桌面应用程序和服务器应用程序需要 ...

  4. css清除浮动方法大全

    清除浮动这个问题,做前端的应该再熟悉不过了,也是每一个web前台设计师 必须掌握的机能. 为什么浮动这么难? 因为浮动会使当前标签产生向上浮的效果,同时会影响到前后标签.父级标签的位置及 width ...

  5. 前端模板文件化jQuery插件 $.loadTemplates

    工作中使用前端模板引擎,如 artTemplate.jsRender,来替代拼接字符串. 可是直接把模板写在页面上会带来页面臃肿,模板无法重用,与 ASP.NET等后端语言语法冲突等问题. 所以将多个 ...

  6. PHP常用代码段:

    1.PHP加密解密   function encryptDecrypt($key, $string, $decrypt){      if($decrypt){          $decrypted ...

  7. java中处理http连接超时的方法

    声明一个boolean公共变量,表明当前httpconnection是否得到服务器回应. 你的连接线程中在连接之前置这个变量为false; 另起一个监视线程,拿到那个HttpConnection的连接 ...

  8. IOS--UISwitch的使用方法

    IOS--UISwitch的使用方法详细 (2013-08-24 11:09:38) 转载▼ 标签: uiswitch switch 选择控件 ios it 分类: iOS--UI // UISwit ...

  9. swfobject.js IE兼容问题

    错误代码 在562行左右 / add style rule if (ua.ie && ua.win) { if (dynamicStylesheet && typeof ...

  10. ubuntu 解压rar

    Ubuntu下解压rar文件的方法 一般通过默认安装的ubuntu是不能解压rar文件的,只有在安装了rar解压工具之后,才可以解压.其实在ubuntu下安装rar解压工具是非常简单的,只需要两个步骤 ...