Skip to content

Instantly share code, notes, and snippets.

@shintakezou
Created April 14, 2019 19:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shintakezou/af1eb98c9d02d95610b3ad98c290bb63 to your computer and use it in GitHub Desktop.
Save shintakezou/af1eb98c9d02d95610b3ad98c290bb63 to your computer and use it in GitHub Desktop.
Nested functions/procedures in Ada, and count unique according to a certain idea of equality.
package Counting is
type Element is
record
S : String (1 .. 3);
E1 : Integer;
E2 : Integer;
end record;
type Elements is array (Positive range <>) of Element;
function Count_Unique (S : Elements) return Integer;
end Counting;
package body Counting is
function Count_Unique (S : Elements) return Integer
is
Found : Boolean;
C : Integer := 0;
function Compare (I, J : Integer) return Integer
is
begin
if S(I).E2 = S(J).E2 then
return 0;
elsif S(I).E1 /= S(J).E1 then
return S(J).E1 - S(I).E1;
else
return S(J).E2 - S(I).E2;
end if;
end;
begin
for I in S'Range loop
Found := False;
for J in S'First .. I - 1 loop
if Compare(I, J) = 0 then
Found := True;
exit;
end if;
end loop;
if not Found then
C := C + 1;
end if;
end loop;
return C;
end Count_Unique;
end Counting;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Counting; use Counting;
procedure CTest is
S : Elements := (
("zak", 2, 0),
("mac", 3, 1),
("abc", 4, 2),
("zak", 5, 0)
);
begin
Put (Count_Unique (S));
New_Line;
end CTest;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment