File io Ada-空文件
我正在用Ada语言编写一个程序,创建一个WEP密钥字典,用于测试。代码如下:File io Ada-空文件,file-io,ada,is-empty,File Io,Ada,Is Empty,我正在用Ada语言编写一个程序,创建一个WEP密钥字典,用于测试。代码如下: 带有Ada.Text\u IO、Ada.Integer\u Text\u IO; 使用Ada.Text\u IO、Ada.Integer\u Text\u IO; 创建WEPDICT的过程是 IntegerTab类型是整数的数组(1..29); --初始化密码 过程PasswdInit(Passwd:in-out IntegerTab;LgPasswd:in-Integer)是 开始 对于1..LgPasswd循环中的
带有Ada.Text\u IO、Ada.Integer\u Text\u IO;
使用Ada.Text\u IO、Ada.Integer\u Text\u IO;
创建WEPDICT的过程是
IntegerTab类型是整数的数组(1..29);
--初始化密码
过程PasswdInit(Passwd:in-out IntegerTab;LgPasswd:in-Integer)是
开始
对于1..LgPasswd循环中的i
Passwd(i):=0;
端环;
结束PasswdInit;
--将当前密码写入字典文件
过程writeUpdict(PasswdInt:in IntegerTab;LgPasswd:in Integer)为
PasswdDict:文件类型;
PasswdStr:字符串(1..29);
开始
如果未打开(PasswdDict),则
打开(PasswdDict,Append_文件,“WepDict.txt”);
如果结束;
对于1..LgPasswd循环中的i
case PasswdInt(i)是
当1=>PasswdStr(i):='0';
当2=>PasswdStr(i):='1';
当3=>PasswdStr(i):='2';
当4=>PasswdStr(i):='3';
当5=>PasswdStr(i):='4';
当6=>PasswdStr(i):='5';
当7=>PasswdStr(i):='6';
当8=>PasswdStr(i):='7';
当9=>PasswdStr(i):='8';
当10=>PasswdStr(i):='9';
当11=>PasswdStr(i):='A';
当12=>PasswdStr(i):='B';
当13=>PasswdStr(i):='C';
当14=>PasswdStr(i):='D';
当15=>PasswdStr(i):='E';
当16=>PasswdStr(i):='F';
当others=>pragma断言(false)时;
终例;
端环;
新的_线(PasswdDict);
关闭(PasswdDict);
结束写入更新;
PasswdDict:文件类型;
LgPasswd:整数:=5;
PassCur:Integer:=1;
Passwd:IntegerTab;
开始
--创建字典文件
创建(PasswdDict,Append_文件,“WepDict.txt”);
PasswdInit(Passwd,LgPasswd);
虽然LgPasswda'pragma'不是实际有效的语言语句,但它是一个编译器指令。在C中相当于#pragma(有点)。将其更改为引发异常或打印错误消息,看看是否有效。这可能不应该是答案,但不适合作为注释:
我将用常量数组中的查找替换整个案例
Lookup : constant array(1 .. 16) of Character :=
('0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
PasswdStr(i) := Lookup(PasswdInt(i));
您还可以通过声明:
亚型PW_指数为自然范围1-29代码>
并始终使用它,如以下不完整的代码片段所示:
类型IntegerTab是整数的数组(PW_索引)代码>
procedure WriteWepDict (PasswdInt : in IntegerTab; LgPasswd : in PW_Index) is
PasswdStr : String(PW_Index);
begin
。。。您能看到沿着这些行重写会使缓冲区溢出无处藏身吗
如果更改密码长度,更不用说维护的简单性了
使用“exit when”的外观不熟悉的循环结构可以说比处理LgPasswd的丑陋的超出范围的值更可取,因为上面的声明将给出一个约束\u错误异常…标准方法是使用null代码>语句(以及pragma
)。哇哦。。。我不希望有那么多的优化。谢谢你的帮助,我现在就来试试。这不是关于优化(一个好的编译器应该有效地翻译这个案例),而是关于尝试制作一个更好的(更少的错误,更可读,更可维护)程序。例如,原始While循环将把LgPasswd增加到30,并在终止之前将其传递给PasswdInit和writepdict,这可能不是您想要的!将LgPasswd声明为PW_索引,最后一个增量将在ConstraintError出现问题时终止您的程序,而不是在其他地方(或在某些语言中,注销数组的结尾)声明PasswdDict:File_Type代码>两次;也许一个在隐藏另一个?请注意,如果您在本地过程writepdict之前声明它,那么该过程将可以看到它(如果您还删除了writepdict中的第二个声明)。如果您希望我们帮助您找出重写程序的问题所在,您是否应该发布重写程序?在最初的程序中,您费尽心思设置PasswdStr
,但之后就什么都不做了。新代码也是这样吗?你忘了写一行了吗?是的,最好把这个问题的标题改过来,用新的代码问一个新问题…F***@ajb你说得对:我忘了在WriteUpdict中输入行!!!我的头在云端!!!!!
LgPasswd : PW_Index := 5;
PassCur : PW_Index := 1;
begin
...
loop
...
else
exit when LgPasswd = PW_Index'Last;
LgPasswd := LgPasswd + 1;
PasswdInit(Passwd,LgPasswd);
end if;
...
end loop;