Guest User

Untitled

a guest
Jun 9th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 1.52 KB | None | 0 0
  1. function FIND_SUM ( A : in INPUT;  SUM : in INTEGER ) return INTEGER  is
  2.  
  3.    protected OUTER_COUNTER is
  4.       function  READ return INTEGER;
  5.       procedure WRITE ( VAL  :  in   INTEGER );
  6.    private
  7.       OUTER_C       :    INTEGER := 0;
  8.    end OUTER_COUNTER;
  9.  
  10.    protected body OUTER_COUNTER is
  11.       function  READ return INTEGER  is
  12.       begin
  13.          return OUTER_C;
  14.       end READ;
  15.      
  16.       procedure WRITE ( VAL  :  in   INTEGER )  is
  17.       begin
  18.          OUTER_C := VAL;
  19.       end WRITE;
  20.    end OUTER_COUNTER;
  21.    
  22.  
  23.    task type FIND_SUM_PARTIAL is
  24.       entry INITIALIZE  ( IND  :  in   INTEGER );
  25.       entry FINISH;
  26.    end FIND_SUM_PARTIAL;
  27.  
  28.    task body FIND_SUM_PARTIAL is
  29.       INDEX            :    INTEGER;
  30.       INNER_COUNTER    :    INTEGER;
  31.    begin
  32.       accept INITIALIZE ( IND  :  in   INTEGER )  do
  33.          INDEX := IND;
  34.          INNER_COUNTER := 0;
  35.       end INITIALIZE;
  36.  
  37.       for J in (INDEX + A'FIRST + 1) .. A'LAST loop
  38.          if A(INDEX + A'FIRST) + A(J) = SUM then
  39.             INNER_COUNTER := INNER_COUNTER + 1;
  40.          end if;
  41.       end loop;
  42.  
  43.       accept FINISH  do
  44.          OUTER_COUNTER.WRITE (OUTER_COUNTER.READ + INNER_COUNTER);
  45.       end FINISH;
  46.    end FIND_SUM_PARTIAL;
  47.  
  48.    TASKS_ARR        :    array ( A'RANGE ) of FIND_SUM_PARTIAL;
  49.  
  50. begin
  51.    for N in A'RANGE loop
  52.       TASKS_ARR(N).INITIALIZE (N - A'FIRST);
  53.    end loop;
  54.  
  55.    for N in reverse A'RANGE loop
  56.       TASKS_ARR(N).FINISH;
  57.    end loop;
  58.  
  59.    return OUTER_COUNTER.READ;
  60. end FIND_SUM;
Add Comment
Please, Sign In to add comment