From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=unavailable autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,c7d1f3e726c03ea8 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2003-02-23 05:38:38 PST Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!oleane.net!oleane!jussieu.fr!enst.fr!not-for-mail From: "David C. Hoos, Sr." Newsgroups: comp.lang.ada Subject: Re: constraint error with tagged type Date: Sun, 23 Feb 2003 07:39:52 -0600 Organization: ENST, France Message-ID: References: <5e59165b.0302230431.2a482db7@posting.google.com> Reply-To: "comp.lang.ada mail to news gateway" NNTP-Posting-Host: marvin.enst.fr Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Trace: avanie.enst.fr 1046007517 35790 137.194.161.2 (23 Feb 2003 13:38:37 GMT) X-Complaints-To: usenet@enst.fr NNTP-Posting-Date: Sun, 23 Feb 2003 13:38:37 +0000 (UTC) To: "comp.lang.ada mail to news gateway" Return-Path: X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1106 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 X-BeenThere: comp.lang.ada@ada.eu.org X-Mailman-Version: 2.1 Precedence: list List-Id: comp.lang.ada mail to news gateway List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Xref: archiver1.google.com comp.lang.ada:34472 Date: 2003-02-23T07:39:52-06:00 The reason for the constraint error is quite simple. Since The index type for vertices is Integer, your call to make_polygon in main creates an array with indices Integer'First .. Integer'First + 3 -- i.e., -2147483648 ..-2147483645 Then, in put_values, you try to assign to poly.vertex (1 .. 4) (i.e., the range of Pt_Array). There are at least two ways to solve the problem. The simplest would be to get rid of the procedure put_values altogether, and in make_polygon simply say: This_Shape.Vertex := Point_Array; This requires only that the lengths of the arrays be equal, not that their indices coincide. Another way is to simply assign indices 1 .. 4 in your call to make_polygon, i.e.: shape_array(3) := shape_ptr(make_polygon ((1 => (0.0, 0.0), 2 => (0.0, 3.0), 3 => (4.0, 0.0), 4 => (4.0, 3.0)))); It would probably be better to use the type natural for Edges and the vertex indices, as a polygon with a negative number of edges probably has no meaning. ----- Original Message ----- From: "Uri" Newsgroups: comp.lang.ada To: Sent: February 23, 2003 6:31 AM Subject: constraint error with tagged type > Hello, > > I am trying to write a program that create polygons > > I created a package called 'shapes': > > -- shapes.ads > > package shapes is > type point is record > X, Y : float; > end record; > > type shape is abstract tagged null record; > ... some function dealing with shape ... > type shape_ptr is access all shape'CLASS; > > type Polygon_Points is array (integer range <>) of point; > type polygon(Edges : integer) is new shape with record > vertex : Polygon_Points (1..Edges); > end record; > type polygon_ptr is access all polygon'CLASS; > ... some function dealing with polygon ... > function make_polygon(Point_Array : Polygon_Points) > return polygon_ptr; > procedure put_values (poly : out polygon; > Pt_Array : Polygon_Points); > private > ... some private function ... > end shapes; > > -------------------------------------------------------------------------------- > > -- shapes.adb > > package body shapes is > > ... some finctions ... > > function make_polygon(Point_Array : Polygon_Points) > return > polygon_ptr is > -- create a polygon > This_Shape : polygon_ptr := new polygon(Point_Array'LENGTH); > begin > put_values(This_Shape.all, Point_Array); > return This_Shape; > end make_polygon; > > procedure put_values (poly : out polygon; > Pt_Array : Polygon_Points) is > -- put values in a polygon > begin > for I in Pt_Array'RANGE loop > poly.vertex(I) := Pt_Array(I); > end loop; > end put_values; > > end shapes; > > I tried to create a polygon in my main program: > > -- main.adb > > with shapes; > use shapes; > > procedure main is > shape_array : array (1..4) of shape_ptr; > begin > -- create a polygon > ... blah, blah, blah ... > shape_array(3) := shape_ptr(make_polygon (((0.0, 0.0), > (0.0, 3.0), > (4.0, 0.0), > (4.0, 3.0)))); > ... blah, blah, blah ... > end main; > > but when I ran it I got a CONTRAINT_ERROR, while using the debuger I > got something that looks like ____gant_malloc, but I don't understad > why the program can't create an array of points with only 4 members. > > Please tell me what I did wrong. > _______________________________________________ > comp.lang.ada mailing list > comp.lang.ada@ada.eu.org > http://ada.eu.org/mailman/listinfo/comp.lang.ada > >