Вопрос по file – Ада: запись в файлы внутри оператора блока

3

Я имею дело с массивом, длина которого определяется во время выполнения программы. Так что я используюblock утверждение, в котором я могу установить пределы массива.

У меня проблемы с записью элементов массива в файлas I was using a stub for the write procedure, Я удалил заглушку, чтобы все было в одном коде. Хотя сейчас мой кодcompiles and run, это не запись в файл. Вот код:

with Ada.Float_Text_IO;
with Ada.Integer_Text_IO;
with Ada.Text_IO; 


procedure Compute_Parameters is

Spin_Speed, Whirling_Speed        : Float;
Time_Step, Rotor_Revolutions      : Float;
Number_Of_Steps                   : Float;


begin
Ada.Text_IO.Put("Enter the spin speed ");
Ada.Float_Text_IO.Get (Item => Spin_Speed);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the whirling speed ");
Ada.Float_Text_IO.Get (Item => Whirling_Speed);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the time step ");
Ada.Float_Text_IO.Get (Item => Time_Step);
Ada.Text_IO.New_Line (1);
Ada.Text_IO.Put("Enter the number of revolutions of the rotor ");
Ada.Float_Text_IO.Get (Item => Rotor_Revolutions);


Number_Of_Steps := (360.0 / (Time_Step * Whirling_Speed)) * Rotor_Revolutions *  (Whirling_Speed / Spin_Speed);


declare

   type Vector is array (Integer range <>) of Float;
   Time_Vector                     : Vector (1 .. Integer (Float'Truncation (Number_Of_Steps)) + 1);
   Rotor_Position_Degrees          : Vector (1 .. Integer (Float'Truncation (Number_Of_Steps)) + 1);

   Count       : Integer := 0;
   Start       : Float := 0.0;
   Step        : Float := Time_Step;

   Output_Data_File                            : File_Type;

   procedure Write_Files (Output_File          : File_Type;
                          Out_1                   : Integer;
                          Out_2                   : Float;
                          Prec                    : Natural := 5
                          ) is 
   begin
      Ada.Integer_Text_IO.Put (File => Output_File, Item => Out_1);
      Ada.Text_IO.Put (Output_File, "   ");
      Ada.Float_Text_IO.Put (File => Output_File, Item => Out_2, Fore => 6, Aft => Prec, Exp => 0);
      Ada.Text_IO.New_Line (Output_File);
   end Write_Files;



 begin -- begin of Declare

     Ada.Text_IO.Put ("Put file name to write: ");
     Create (Output_Data_File, Out_File, Get_Line);


     for I in 1 .. Time_Vector'Length  loop
         Count := Count + 1;
         Time_Vector(I) := Start + Step * Float(I-1);
         Put (Integer'Image(Count));
         Ada.Text_IO.Put("   ");
         Rotor_Position_Degrees(I) := Spin_Speed * Time_Step * Float(I-1);
         Ada.Float_Text_IO.Put (Item => Rotor_Position_Degrees(I), Fore => 5, Aft  => 1, Exp  => 0);
         Ada.Text_IO.New_Line(1);

         --write to file
         Write_Files (Output_Data_File,
                      Out_1 => Count,
                      Out_2 => Rotor_Position_Degrees(I)
                      );
     end loop;

 close(Output_Data_File);


 end; -- end of Declare


end Compute_Parameters;

Я заметил, что 2 строки сразу послеbegin вDeclare не выполняются вообще:

Ada.Text_IO.Put ("Put file name to write: ");
Create (Output_Data_File, Out_File, Get_Line);

Что я делаю неправильно?

Спасибо...

@ Роберт Да, я знаю. Слип мой. Спасибо за сообщение. Сообщение отредактировано. yCalleecharan
почему ты пишешьuse Ada.Text_IO; но позже вы используете полное имя пакетаAda.Text_IO.Put("Enter the spin speed "); ? Это имеет мало смысла. Выберите один или другой. Если вы хотите использовать полностью определенное имя, не делайтеuse часть. Robert H

Ваш Ответ

1   ответ
2

Get заRotor_Revolutions оставил пустую строку в стандартном вводе, который еще предстоит прочитать:

 Ada.Text_IO.Put_Line (Ada.Text_IO.Get_Line);
 Ada.Text_IO.Put ("Put file name to write: ");
 Create (Output_Data_File, Out_File, Ada.Text_IO.Get_Line);

Просто чтобы уточнить: этоGet_Line что требуется;Put_Line просто чтобы показать, что это пустая строка.

В качестве альтернативы используйтеAda.Command_Line, как показано в этомпример.

@ trashgod Да, конечно. Вы правы. Поскольку я пишу в файлы напрямую, мне не нужно никакихVector в качестве таких. Спасибо за это замечание. yCalleecharan
Хорошо, мне нужно немного взглянуть наPut_Line а такжеGet_Line. yCalleecharan
@ trashgod Как получить ограничение на длину массива во время вычисления, если нетdeclare блок должен быть использован? yCalleecharan
Я не думаю, чтоdeclare Блок является релевантным, за исключением того, что он разделяет источник и эффект.
@ trashgod. Вот это да. Большое спасибо за совет оPut_Line, 1 голос за yCalleecharan

Похожие вопросы