|
From: Sébastien Morand on 17 Jun 2008 12:44 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, I'm implementing a B-Tree in Ada using indefinite private type: generic -- Element to be stored in the btree type Element (<>) is private; -- Null element when not found Element_Null: Element; -- Key of the element in the B-Tree wich must be compareable type Key (<>) is private; with function "<"(k1: in Key; k2: in Key) return Boolean; with function ">"(k1: in Key; k2: in Key) return Boolean; with procedure Put_Line(k: in Key); -- Order of the B-Tree Order: Positive; package SCMAL.Tools.BTrees is -- Omitted end SCMAL.Tools.BTrees; When I create an instance of the package using the following code: 9 package IT is new SCMAL.Tools.BTrees( 10 Element => Integer, 11 Element_Null => 0, 12 Key => Integer, 13 "<" => "<", 14 ">" => ">", 15 Put_Line => Put_Line, 16 Order => 1 17 ); I got the following warnings: btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:159 btreetests.adb:9:04: warning: value not in range of subtype of "Standard.Integer" defined at scmal-tools-btrees.ads:82, instance at line 9 btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:160 btreetests.adb:9:04: warning: value not in range of subtype of "Standard.Integer" defined at scmal-tools-btrees.ads:83, instance at line 9 btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:161 btreetests.adb:9:04: warning: value not in range of subtype of "Standard.Integer" defined at scmal-tools-btrees.ads:84, instance at line 9 btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:177 btreetests.adb:9:04: warning: value not in range of subtype of "Standard.Integer" defined at scmal-tools-btrees.ads:82, instance at line 9 btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:178 btreetests.adb:9:04: warning: value not in range of subtype of "Standard.Integer" defined at scmal-tools-btrees.ads:83, instance at line 9 btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time but I run time it works fine and I have no constraint error. Where theses warnings come from? How to correct my code? Is there a way to avoid to take the default "<" and ">" function? Thanks by advance, Sebastien -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (Cygwin) iD8DBQFIV+na+zV9xm4PlDQRAn1vAJ4hWuphvyP5DAU/zTB2iH4jP+DuMQCdF252 4ZGus6+yxjCwqug3lqycgsY= =XSuj -----END PGP SIGNATURE-----
From: Dmitry A. Kazakov on 17 Jun 2008 13:17 On Tue, 17 Jun 2008 16:44:10 +0000, S�bastien Morand wrote: > When I create an instance of the package using the following code: > > 9 package IT is new SCMAL.Tools.BTrees( > 10 Element => Integer, > 11 Element_Null => 0, > 12 Key => Integer, As a guess, there could be a conflict upon instantiation when Element and Key are the same type. I had once such a problem. GNAT always had problems with generics. > Where theses warnings come from? How to correct my code? Maybe it is just a compiler bug. But you should post a complete compilable code. > Is there a way to avoid to take the default "<" and ">" function? I don't see you using defaults for the formal parameters "<" and ">". You have: with function "<"(k1: in Key; k2: in Key) return Boolean; with function ">"(k1: in Key; k2: in Key) return Boolean; not with function "<"(k1: in Key; k2: in Key) return Boolean is <>; with function ">"(k1: in Key; k2: in Key) return Boolean is <>; -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de
From: Sébastien Morand on 17 Jun 2008 14:33 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 > Maybe it is just a compiler bug. But you should post a complete compilable > code. Here is a complete code with the same warning: procedure Main is generic -- Element to be stored in the btree type Element (<>) is private; Order: Positive; package TestGen is type ElementPtr is access all Element; Buffer: array(1 .. Order*2) of ElementPtr; procedure Store(E: in Element; index: in Positive); end TestGen; package body TestGen is procedure Store(E: in Element; index: in Positive) is begin -- In my real procedure, index is calculated and there is some -- check. Index can't be > Order*2 for i in Positive range Order+2 .. index-1 loop Buffer(i) := new Element'(E); end loop; end Store; end TestGen; package IntTestGen is new TestGen( Element => Integer, Order => 1 ); use IntTestGen; begin Store(1, 4); end Main; -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (Cygwin) iD8DBQFIWAOF+zV9xm4PlDQRAqdzAJ9Oa+0fS1VgOMo8dypPhkDgpNC0pQCfWwC1 cCWtqImCosykrr1tzGBf8gY= =J0c5 -----END PGP SIGNATURE-----
From: Dmitry A. Kazakov on 17 Jun 2008 15:04 On Tue, 17 Jun 2008 18:33:42 +0000, S�bastien Morand wrote: >> Maybe it is just a compiler bug. But you should post a complete compilable >> code. No, it is not. The compiler is correct. > Here is a complete code with the same warning: > > procedure Main is > > generic > -- Element to be stored in the btree > type Element (<>) is private; > Order: Positive; > package TestGen is > type ElementPtr is access all Element; > Buffer: array(1 .. Order*2) of ElementPtr; > procedure Store(E: in Element; index: in Positive); > end TestGen; > > package body TestGen is > procedure Store(E: in Element; index: in Positive) is > begin > -- In my real procedure, index is calculated and there is some > -- check. Index can't be > Order*2 > for i in Positive range Order+2 .. index-1 loop The problem is here. You instantiate TestGen with Order = 1. So the upper bound of Buffer is 2. Therefore the range is 1+2..Index, which should cause Constraint_Error in Buffer(I). Bravo GNAT! (Though the warning message could be better) > Buffer(i) := new Element'(E); > end loop; > end Store; > end TestGen; > package IntTestGen is new TestGen( > Element => Integer, > Order => 1 > ); > use IntTestGen; > begin > Store(1, 4); > end Main; -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de
From: Sébastien Morand on 18 Jun 2008 04:41 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 > The problem is here. You instantiate TestGen with Order = 1. So the upper > bound of Buffer is 2. Therefore the range is 1+2..Index, which should cause > Constraint_Error in Buffer(I). I understand, if Order = 1, then the code could never occur. Anyway, There is a test just before in the real code that avoid the impossible situation (index is between 1 and Order*2 always). I could remove all the warnings except one that I had to change in a While clause. But I put a comment in the code to explain why. Thanks to show what I actually should have seen by myself. Sebastien -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (Cygwin) iD8DBQFIWMo7+zV9xm4PlDQRAuDMAJ9/qDRM1TL617fgDICj1JIYfgxcCgCgh2aI Xsga9iFVpUAYBO5FKHJ6wXk= =qGlV -----END PGP SIGNATURE-----
|
Next
|
Last
Pages: 1 2 3 Prev: Question on initialization of packages Next: gnat GPL 2008 and annex E |