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

 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. LaTeX 中插入数学公式

    一.常用的数学符号 1.小写希腊字母 \alpha \nu \beta \xi \gamma o \delta \pi \epsilon \rho \zeta \sigma \eta \tau \th ...

  2. SQL server 如何附加、还原、分离、备份数据库文件

    No1 : 附加 No2 : 还原            一.(需要 .bak文件)首先建立一个数据库,数据库名称与你的.bak文件名要相同. 当然.这时候的这个数据库还是空的,需要还原回去数据.右键 ...

  3. 在iframe中获取iframe外的对象

    parent.document.getElementById("dom ID"); $($(parent.document.getElementById("video-i ...

  4. Eclipse中看java源代码

    如何在Eclipse sdk中查看jar源代码如:*.jar 1.点 “window”-> "Preferences" -> "Java" -> ...

  5. [转]Delphi中ShellExecute的妙用

    Delphi中ShellExecute的妙用       ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件.打开一个目录.打印一个文件等等),并对外部程序有一定的控制.   ...

  6. Java如何连接到MySQL数据库的

    下载:mysql-connector-java-5.1.38.tar.gz http://dev.mysql.com/downloads/connector/j/ tar zxvf mysql-con ...

  7. SetTimer 和 OnTimer 的使用

    最近在公司做一个MFC项目,因为是MFC新手,所以在这里记录一些最近用到和学到的东西留着以后查阅. 今天遇到的一个问题是要在窗口刚刚初始化完成时自动检测一个配置文件是否存在(实际上就是检测是不是首次登 ...

  8. 谷歌地图实现车辆轨迹移动播放(google map api)

    开发技术:jquery,js baidu map api,json,ajax QQ1310651206 谷歌地图(google map api)实现车辆轨迹移动播放(google map api)

  9. 讯飞语音SDK Android平台使用

    1. 支持功能介绍: 2. Android API主要业务接口和流程介绍 -------------------------------------------------------- 工程代码: ...

  10. 常用jQuery选择器总结【转】

    在Dom 编程中我们只能使用有限的函数根据id 或者TagName 获取Dom 对象. 然而在jQuery 中则完全不同,jQuery 提供了异常强大的选择器用来帮助我们获取页面上的对象, 并且将对象 ...