Петли в аде и реализация - PullRequest
       35

Петли в аде и реализация

1 голос
/ 23 апреля 2010

Ниже показан фрагмент кода, и сомнения касаются реализации циклов

               C := character'last; --'// SO code colorizer hack
               I := 1;
               K : loop
                  Done := C = character'first; --'
                  Count2 := I;
                  Exit K when Done;
                  C := character'pred(c);  --'
                  I := I + 1;
               end loop K;

Может кто-нибудь сказать, что означает «K». Я думаю, это не переменная. Как это происходит?К 'контролировать выполнение цикла?

Ответы [ 4 ]

4 голосов
/ 23 апреля 2010

K - это имя цикла. Операторы end loop и Exit ссылаются на это имя, чтобы прояснить, какой цикл завершается.

Справочное руководство Ada называет его "loop_statement_identifier".

2 голосов
/ 23 апреля 2010

K - это, по сути, название цикла. exit k сообщает коду, чтобы он прекратил цикл и переходил к следующему оператору после завершения цикла k.

Обычно вам не нужно называть петли, так как вы можете просто сказать exit, и он выйдет из замкнутого цикла. Однако, если у вас есть цикл, вложенный в другой цикл, и вы хотите выйти не из цикла, непосредственно следующего за оператором выхода, а из самого внешнего, тогда может потребоваться выполнить что-то подобное.

2 голосов
/ 23 апреля 2010

Как уже отмечалось, K является меткой цикла.Это позволяет вам идентифицировать конкретный цикл, чтобы улучшить читаемость, а также выборочно выйти из конкретного цикла из набора вложенных вложенных циклов (т. Е. Быть "goto" ... тссс!: -)

Вотнадуманный пример (не скомпилирован проверен):

   S : Unbounded_String;
   F : File_Type;
   Done_With_Line : Boolean := False;
   All_Done       : Boolean := False;
begin
    Open(F, In_File, "data_file.dat");
  File_Processor:
    while not End_Of_File(F) loop
        S := Get_Line(F);
       Data_Processor:
        for I in 1 .. Length(S) loop
           Process_A_Character
                (Data_Char => Element(S, I),   -- Mode in
                 Line_Done => Done_With_Line,  -- Mode out
                 Finished  => All_Done);       -- Mode out

           -- If completely done, leave the outermost (file processing) loop
           exit File_Processor when All_Done;

           -- If just done with this line of data, go on to the next one.
           exit Data_Processor when Done_With_Line;
        end loop;
    end loop File_Processor;
    Close(F);
 end;
1 голос
/ 23 апреля 2010

K - это метка, которая называет цикл. Вау, я давно не видел ни одной Ады ...

...