File io Ada-空文件

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语言编写一个程序,创建一个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循环中的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;