comp.lang.ada
 help / color / mirror / Atom feed
From: Christos Chryssochoidis <C.Chryssochoidis@gmail.com>
Subject: Newbie's question
Date: Mon, 11 Feb 2008 16:31:34 +0200
Date: 2008-02-11T16:31:34+02:00	[thread overview]
Message-ID: <1202740198.391371@athprx03> (raw)

Hello,

I 'm experimenting with Ada, and I'm having trouble getting some toy 
code running. The code is the following: (hope it isn't too complicated)


-- This is a program to test passing subprograms as arguments to other 
subprograms.
-- It consists of a main program, "Test_Filter", and two nested 
subprograms: "Filter" and "Greater_Equal_3". The "Filter" subprogram 
takes as arguments an array of Integers and a function (predicate), and 
returns an array of the same type, having only those elements of the 
input array that satisfy the given predicate. For some reason that I 
can't figure out, I'm getting a "segmentation fault" when I run the 
executable. (It compiles fine.)


with Ada.Containers.Doubly_Linked_Lists;
with Ada.Text_IO;

procedure Test_Filter is

    subtype Index is Natural;
    type Int_Array is array(Index range<>) of Integer;


    function Filter(Elements : Int_Array; Predicate : not null 
access 					function(Element : Integer) return Boolean) 								return 
Int_Array  is
       package Int_Lists is new 									 
Ada.Containers.Doubly_Linked_Lists(Element_Type => Integer);
       Tmp_List : Int_Lists.List;
       Result : access Int_Array;
    begin
       for I in Elements'Range loop
          if Predicate(Elements(I)) then
             Tmp_List.Append(Elements(I));
          end if;
       end loop;

       Result := new Int_Array(1..Index(Tmp_List.Length));
   Copy_List:
       declare
          Tmp_List_Cursor : Int_Lists.Cursor := Tmp_List.First;
          I : Integer := 1;
       begin
          while Int_Lists.Has_Element(Tmp_List_Cursor) loop
             Result(I) := Int_Lists.Element(Tmp_List_Cursor);
             Tmp_List_Cursor := Int_Lists.Next(Tmp_List_Cursor);
             I := I + 1;
          end loop;
       end Copy_List;

       return Result.all;

    end Filter;

    function Greater_Equal_3(Element :Integer) return Boolean is
    begin
       if Element >= 3 then
          return True;
       else
          return False;
       end if;
    end Greater_Equal_3;


    Int_Array1 : Int_Array := Int_Array'(1,2,3,4,5);
    Int_Array2 : Int_Array(1..3);

begin
    Int_Array2 := Filter(Int_Array1, Greater_Equal_3'Access);
    for I in Int_Array1'Range loop
       Ada.Text_IO.Put_Line(Int_Array1(I)'Img);
    end loop;

    Ada.Text_IO.Put_Line("");

    for I in Int_Array2'Range loop
       Ada.Text_IO.Put_Line(Int_Array2(I)'Img);
    end loop;

end Test_Filter;


Thanks very much for any help.



             reply	other threads:[~2008-02-11 14:31 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-11 14:31 Christos Chryssochoidis [this message]
2008-02-11 16:28 ` Newbie's question [SOLVED] Christos Chryssochoidis
2008-02-11 17:42 ` Newbie's question Jeffrey R. Carter
2008-02-12 22:56   ` Christos Chryssochoidis
2008-02-13 11:06     ` Christos Chryssochoidis
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox