320 likes | 485 Views
Edlin 关键算法设计. 主要内容. 编辑器在内存中的处理 编辑器在文件交换中的处理. Edline 在内存里的处理情况. 在内存中,采用行指针指向块节点的方式处理 系统最大可支持 512 行的处理容量 存储块采用动态申请方式得到. 存储块的管理. struct Block { char area[512]; char *rear; int charcount; int linecount; };. 存储块状态. Blockpointer[0]->area. Linepointer[0] Linepointer[1]
E N D
主要内容 • 编辑器在内存中的处理 • 编辑器在文件交换中的处理
Edline在内存里的处理情况 • 在内存中,采用行指针指向块节点的方式处理 • 系统最大可支持512行的处理容量 • 存储块采用动态申请方式得到
存储块的管理 struct Block { char area[512]; char *rear; int charcount; int linecount; };
存储块状态 Blockpointer[0]->area Linepointer[0] Linepointer[1] Linepointer[2] Linepointer[3] Blockpointer[0]->rear Blockpointer[0]->charcount Blockpointer[0]->linecount
存储块状态 Blockpointer[0]->area Linepointer[0] Linepointer[1] Linepointer[2] Linepointer[3] Linepointer[4] Blockpointer[0]->rear Blockpointer[0]->charcount+=串长 linecount+=1
内存中的关键算法 • 行插入算法 函数Insertline(char *,long) 行删除算法 函数DeleteLine(long) 内存优化算法 函数Optimize()
插入算法的原则 1、新插入的内容总是在相应的存储块中紧密排列。 2、在存储块中有关于剩余字符空间的纪录,在插入时,依次判断相应的存储块中所剩余的字符空间是否足够,当足够时就进行插入。 3、如果用户所输入的字符串大于127(不含行结束符),系统将自动进行截断,分行插入 4、当所有已存在的存储块都已存满,则在内存中开辟一个新块,并且格式化。将内容写进新块中。
插入内容在内存中的维护 属性数组 编号规则 属性数字=块号*1000+实际行号 属性信息获取方法 属性数字/1000==块号 属性数字%1000==实际行号
插入算法 行插入前 行插入后 标志着该行的信息已经插入到第二个存储块中,并且该行在内存中的行号是第12行。
0 Lp[0] Lp[1] Lp[2] Lp[3] Lp[4] Lp[5] Lp[6] Lp[7] Lp[8] 1 2 插入1行后,内存的情况
插入算法 插入前 插入后 插入时,系统自动寻找空间足够的存储块,并且将插入的内容写存储块中。同时改变属性数组的内容,以维护整个系统中行的顺序以及为下一次插入做准备。
删除算法的原则 一、删除算法包括三部分修改 1、行指针的移动 2、块中实际内容的删除 3、属性数组的修改 二、删除算法结束后,保持块中存储 内容的紧密性 三、如果某个存储块中的内容被删空 则将该存储块释放以获得内存空间
0 Lp[0] Lp[1] Lp[2] Lp[3] Lp[4] Lp[5] Lp[6] Lp[7] Lp[8] 1 2 红色部分为待删除的行
0 Lp[0] Lp[1] Lp[2] Lp[2] Lp[3] Lp[4] Lp[5] Lp[6] Lp[7] 1 2 红色部分为待删除的行
删除算法 删除前 删除后 插入时,系统自动寻找空间足够的存储块,并且将插入的内容写存储块中。同时改变属性数组的内容,以维护整个系统中行的顺序以及为下一次插入做准备。
内存优化算法 • 目的 由于频繁的插入和删除操作,在内存中可能产生较大的空闲。此时,对内存进行优化。 条件 当某个存储块中的字符数不足块容量的%40时进行优化。 方法 内存的优化基于插入和删除操作,根据属性数组找到该块中还剩余的行,取得该行的内容并将其删除,然后间该行的内容插入文本。
0 1 2
0 1 2 释放
文件交换算法 • 引入目的 在对文件进行处理时,当行数超过512行时,需要引入一种机制,将文件中的制定部分调入内存。 • 方法 文件交换部分由内存块和两个临时文件组成。调入的内容存放在内存块中,暂时不用的内容放在两个临时文件中。
文件交换的实现 顺序控制数组 int checkfile[2] 存储区域标记数组 long signfile[2][3] 两个文件指针 File *current[2]
关于三个数组 Checkfile[3] 数组中存有三个数字0,1,2,我们约定0表示内存区域,1表示临时文件一,2表示临时文件二。 三个数字的不同排列组合表示真正的源文件在内存中和临时文件中的存储顺序 在引入文件是按照顺序数组中的顺序进行引入。 例如、如果checkfile[0]=1 checkfile[1]=0 checkfile[2]=2 那么 文件的引入顺序就是临时文件一、内存和临时文件二
关于三个数组 Signfile[3][2] Signfile[0][0] 内存中的一行的物理行号 Signfile[0][1] 内存中存储的行数 Signfile[1][0] 临时文件一中的第一行的物理行号 Signfile[1][1] 临时文件一中存储的行数 Signfile[2][0] 临时文件二中的第一行的物理行号 Signfile[2][1] 临时文件二中存储的行数
关于三个数组 Currentfp[2] Currentfp[0] 指向临时文件一的结尾 Currentfp[1] 指向临时文件二的结尾 引入这三个数组可以在文件交换中保证文件的顺序的正确性和稳定性 下面介绍文件交换的过程
文本状态 2 0 1 Signfile[0][0]=701 Signfile[0][1]=200 Signfile[1][0]=1 Signfile[1][1]=700 Signfile[2][0]=901 Signfile[2][1]=300 701 1 901 200 300 700 901 Checkfile[0]=1 Checkfile[1]=0 Checkfile[2]=2 700 1200
在当用户进行编辑时,首先在内存中进行处理,如果所处理内容超过内存的处理能力,那么将内存中的内容写入临时文件,然后调入相应的内容进行处理。如果用户要求出里内存中不存在的部分,也根据用户的要求进行交换引入处理。在当用户进行编辑时,首先在内存中进行处理,如果所处理内容超过内存的处理能力,那么将内存中的内容写入临时文件,然后调入相应的内容进行处理。如果用户要求出里内存中不存在的部分,也根据用户的要求进行交换引入处理。 2 0 1 701 1 1001 200 300 700 901 1001 700 1300
假设此时用户要求处理第300行的内容 0 1 当用户要求处理第200行的内容时,系统准备将第200行至第400行的内容调入内存区域,即图中所时的蓝色部分 701 1 1001 300 200 300 500 901 700 1300
文件交换处理 Temp1 在处理时,系统首先内存部分的内容追加到临时文件一中,然后清空内存中的纪录
文件交换处理 Temp1 系统然后将临时文件二中的内容追加到临时文件一的最后,然后清空临时文件二中的纪录 此时,临时文件一中存有整个文件的信息
文件交换处理 Temp1 系统然后将临时文件一中的前300行的内容写到临时文件二中,然后删除临时文件一中前300行的纪录
文件交换处理 Temp1 系统然后将临时文件一中的前200行的内容写到内存中,然后删除临时文件一中前200行的纪录 交换结束
下一步 • 总结对听众的要求 • 总结您要进行的工作