Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function FIND_SUM ( A : in INPUT; SUM : in INTEGER ) return INTEGER is
- protected OUTER_COUNTER is
- function READ return INTEGER;
- procedure WRITE ( VAL : in INTEGER );
- private
- OUTER_C : INTEGER := 0;
- end OUTER_COUNTER;
- protected body OUTER_COUNTER is
- function READ return INTEGER is
- begin
- return OUTER_C;
- end READ;
- procedure WRITE ( VAL : in INTEGER ) is
- begin
- OUTER_C := VAL;
- end WRITE;
- end OUTER_COUNTER;
- task type FIND_SUM_PARTIAL is
- entry INITIALIZE ( IND : in INTEGER );
- entry FINISH;
- end FIND_SUM_PARTIAL;
- task body FIND_SUM_PARTIAL is
- INDEX : INTEGER;
- INNER_COUNTER : INTEGER;
- begin
- accept INITIALIZE ( IND : in INTEGER ) do
- INDEX := IND;
- INNER_COUNTER := 0;
- end INITIALIZE;
- for J in (INDEX + A'FIRST + 1) .. A'LAST loop
- if A(INDEX + A'FIRST) + A(J) = SUM then
- INNER_COUNTER := INNER_COUNTER + 1;
- end if;
- end loop;
- accept FINISH do
- OUTER_COUNTER.WRITE (OUTER_COUNTER.READ + INNER_COUNTER);
- end FINISH;
- end FIND_SUM_PARTIAL;
- TASKS_ARR : array ( A'RANGE ) of FIND_SUM_PARTIAL;
- begin
- for N in A'RANGE loop
- TASKS_ARR(N).INITIALIZE (N - A'FIRST);
- end loop;
- for N in reverse A'RANGE loop
- TASKS_ARR(N).FINISH;
- end loop;
- return OUTER_COUNTER.READ;
- end FIND_SUM;
Add Comment
Please, Sign In to add comment