1

私は Ada で、小文字を大文字に、またはその逆に変換する文字変換プログラムを作成しました。私のargument_count = 3の部分に到達するまで、すべてが機能します。テキストを別のファイルに出力することになっていますが、まったく機能していません。私の例外エラーwhen others=> errorがポップアップし続けます。

ターミナルまたはコマンドラインに入力すると、次のようになります。

./case_converter u plain.text output

With Ada.Text_IO, Ada.Command_Line, Ada.Characters.Handling;
Use Ada.Text_IO, Ada.Command_Line, Ada.Characters.Handling;

Procedure case_conversion is

    Argument_Error : Exception; --the excpetion raise for bad command-line arguments.
    Input, Output  : File_Type;-- input and output files, if specified.
    File           : File_Type; 
    Eol           : Boolean;
    Char           : Character;

Function To_Upper (upper : Character) Return Character is  

Begin

    Case upper is 

        When 'a' =>
            Return 'A';
        When 'b' =>
            Return 'B';
        When 'c' =>
            Return 'C';
        When 'd' =>
            Return 'D';
        When 'e' =>
            Return 'E';
        When 'f' =>
            Return 'F';
        When 'g' =>
            Return 'G';
        When 'h' =>
            Return 'H';
        When 'i' => 
            Return 'I';
        When 'j' =>
            Return 'J';
        When 'k' =>
            Return 'K';
        When 'l' =>
            Return 'l';
        When 'm' =>
            Return 'M';
        When 'n' =>
            Return 'N';
        When 'o' =>
            Return 'O';
        When 'p' =>
            Return 'P';
        When 'q' =>
            Return 'Q';
        When 'r' =>
            Return 'R';
        When 's' =>
            Return 'S';
        When 't' =>
            Return 'T';
        When 'u' =>
            Return 'U';
        When 'v' =>
            Return 'V';
        When 'w' =>
            Return 'W';
        When 'x' =>
            Return 'X';
        When 'y' =>
            Return 'Y';
        When 'z' =>
            Return 'Z';
        When Others =>
            Return char; -- This will let me know if there is a bug in the code, and to just return char.
    end case;
end To_Upper;


Function To_Lower (lower : Character) Return character is              

Begin

    Case lower is

        When 'A' =>
            Return 'a';
        When 'B' =>
            Return 'b';
        When 'C' =>
            Return 'c';
        When 'D' =>
            Return 'd';
        When 'E' =>
            Return 'e';
        When 'F' =>
            Return 'f';
        When 'G' =>
            Return 'g';
        When 'H' =>
            Return 'h';
        When 'I' =>
            Return 'i';
        When 'J' =>
            Return 'j';
        When 'K' =>
            Return 'k';
        When 'L' =>
            Return 'l';
        When 'M' =>
            Return 'm';
        When 'N' =>
            Return 'n';
        When 'O' =>
            Return 'o';
        When 'P' =>
            Return 'p';
        When 'Q' =>
            Return 'q';
        When 'R' =>
            Return 'r';
        When 'S' =>
            Return 's';
        When 'T' =>
            Return 't';
        When 'U' =>
            Return 'u';
        When 'V' =>
            Return 'v';
        When 'W' =>
            Return 'w';
        When 'X' =>
            Return 'x';
        When 'Y' =>
            Return 'y';
        When 'Z' =>
            Return 'z';
        When Others =>
            Return char; 

    end case;
End To_Lower;


begin

        If argument_count < 1 then
            Raise Argument_Error;
        end if;

           IF Argument_Count > 1 THEN 
        null;     
   END IF; 

   IF Argument_Count > 2 THEN 
        null; 
   END IF;   

      If argument_Count = 1 then
            loop          
                look_Ahead (Char, Eol);       
                    if Argument (1) = "U" or Argument (1) = "u" then
                           Get (char);
                           Char := (To_Upper(char));
                          Put (char);
                        elsif
                               Argument (1) = "L" or Argument (1) = "l" then
                            Get (char);
                            Char := (To_Lower(char));
                            Put (char);
                       end if;  
                   end loop;
            end if;

-----------------------------------------------------------                   

        If Argument_Count = 2 then            
           Open (file, In_File, Argument (2));
        end if;

        While Not End_of_File (file) loop
               Look_Ahead (File, Char, EoL);

                If Argument (1) = "U" or Argument (1) = "u" then
                   Get (file, char);
                   Char := (To_Upper(char));
                   Put (char);
                elsif
                       Argument (1) = "L" or Argument (1) = "l" then
                    Get (file, char);
                    Char := (To_Lower(char));
                    Put (char);
               end if;     


    If EoL then
               New_Line;
        end if; 
end loop;

------------------------------------------------------------    
          If Argument_Count = 3 then
            Open (file, In_File, Argument (2));
            Create (Output, Out_file, Argument(3));



              While Not End_of_File (file) loop 
             -- Look_Ahead (file, Char, EoL);
                              If EoL then
                             New_Line(output);
                         end if;   
                 If Argument (1) = "U" or Argument (1) = "u" then


                           Get (file, char);
                           Char := (To_Upper(char));
                           Put (output, char);

                       elsif Argument (1) = "L" or Argument (1) = "l" then                           
                               ---------
                                  If Eol then
                                      new_line (output);
                                  end if;
                                Get (file, char);
                                Char := (To_Lower(char));
                                Put (output, char);

                      end if;             
    end loop;
end if;


   IF Is_Open(input) THEN 
      Close(Input); 
   END IF; 

   IF Is_Open(Output) THEN 
      Close(Output); 
   END IF;



EXCEPTION
   WHEN Name_Error =>
      Put_Line("The file " & Argument(2) & " cannot be used for input");
   WHEN OTHERS =>
      Put_Line("Usage: case_converter U|L [infile [outfile]]");

end case_conversion;
4

3 に答える 3

4

なぜAda.Characters.Handling.To_Upper(とTo_Lower)関数ではないのですか?

文字がアルファベットであることを本当に確認する必要がある場合は、を使用してくださいIs_Letter

于 2013-01-30T05:11:54.887 に答える
3

例外が発生する可能性があることがわかっていない限り、 , で例外をキャッチすることはしばしば悪い考えwhen othersです (非常に経験豊富な開発者でさえ、これを間違える可能性があります)。

あなたの場合、「when other」行をコメントアウトする必要があります。プログラムを実行して例外が発生すると、それが報告されます(通常、発生した行番号が表示されますが、この場合は私のマシンでは発生しません)。スタック トレースを取得すると役立ちます。これは、他のマシンよりも Mac OS X の方が難しいため、ここに書きました。

走った

$ ./case_conversion u case_conversion.adb t  

Execution terminated by unhandled exception
Exception name: ADA.IO_EXCEPTIONS.STATUS_ERROR
Message: file not open
Call stack traceback locations:
0x1000103bc 0x10000c9eb 0x100001e9a 0x100001a19

スタックトレースをデコードしました

$ atos -o case_conversion 0x1000103bc 0x10000c9eb 0x100001e9a 0x100001a19
system__file_io__check_read_status (in case_conversion) (s-fileio.adb:207)
ada__text_io__end_of_file (in case_conversion) (a-textio.adb:304)
_ada_case_conversion (in case_conversion) (case_conversion.adb:177)
main (in case_conversion) (b~case_conversion.adb:265)

そして見たcase_conversion.adb:177

173    if Argument_Count = 2 then
174       Open (File, In_File, Argument (2));
175    end if;
176
177    while not End_Of_File (File) loop

Argument_Countでは、 3の場合はどうなるでしょうか。

Mac OS X で実行していない場合は、atosの代わりにaddr2lineを試してください。

于 2013-01-30T11:24:05.080 に答える
-1

サメはそれを正しく持っています。これに組み込みルーチンを使用しないのはばかげています。

ただし、奇妙な理由で自分で書きたい場合は、文字が連続していて、上と下の順序が同じであるという事実により、その方法はさらにばかげています。あなたのそれらの大きな警笛のケースステートメントのすべてのエントリは、互いに同じ距離にあることに注意してください. 各ケース エントリを作成するには、前のエントリをコピーして、両側の値を 1 ずつ増やします。これは、私たちがコンピュータを発明して私たちを助けるために発明した、繰り返される機械的活動の正確な種類ですよね? :-)

2 つの文字を変換する従来の方法は、2 つの文字セットの違いを照合シーケンスに追加するだけです (ほとんどの人は文字 'A' を選択します)。例えば:

Upper_To_Lower_Difference : constant := character'pos('a') - character'pos('A');

function To_Upper (Lower : character) return character is
begin
    if Lower in 'a'..'z' then
        return character'val(character'pos(Lower) + Upper_To_Lower_Difference);
    end if;
    return Lower;
end To_Upper;
于 2013-01-31T14:29:29.417 に答える