From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on ip-172-31-74-118.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-2.9 required=3.0 tests=BAYES_00,NICE_REPLY_A autolearn=ham autolearn_force=no version=3.4.6 Path: eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail From: "Jeffrey R. Carter" Newsgroups: comp.lang.ada Subject: Re: Gnat bug or mistaken program? Date: Wed, 21 Jul 2021 10:29:18 +0200 Organization: Also freenews.netfront.net; news.tornevall.net; news.eternal-september.org Message-ID: References: <318e5e93-5f66-4bb8-8bf0-7ee3fd2688fan@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Wed, 21 Jul 2021 08:29:20 -0000 (UTC) Injection-Info: reader02.eternal-september.org; posting-host="a03207487f6db667a2bda8746cfc6baf"; logging-data="13177"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+F9vQtufItJSDLY0wA87uk5K6wDtP+m7w=" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 Cancel-Lock: sha1:QBYIDkM8M57bw88/JY7Ebn5PoI8= In-Reply-To: Content-Language: en-US Xref: reader02.eternal-september.org comp.lang.ada:62419 List-Id: On 7/21/21 4:23 AM, Richard Iswara wrote: > On 20/07/2021 21.09, Niklas Holsti wrote: >> On 2021-07-20 15:02, Richard Iswara wrote: >>> I get this error on my program from the menu build => check semantic >>> exponent must be of type Natural, found type "Standard.Float". >>> >>> Should not 10 ** (log10 a + log10 b) = a*b? >>> >>> This is my compiler build: >>> >>> GNAT Studio Community 2020 (20200427) hosted on x86_64-pc-mingw32 >>> GNAT Community 2020 (20200429-93) targetting x86_64-pc-mingw32 >>> SPARK Community 2020 (20200429) >>> >>> Here is the relevant part of program: >>> >>> with Ada.Numerics.Elementary_Functions; >>> use Ada.Numerics; >> >> >> To make Ada.Numerics.Elementary_Functions."**" visible without qualification, >> you should also do "use Ada.Numerics.Elementary_Functions". >> >> Otherwise the compiler will see only the predefined operator: >> >>     function "**"(Left : Float; Right : Integer'Base) return Float >> >> (see RM 4.5.6(9 and 10)) which explains why the compiler does not accept a >> floating-point value as the Right operand to "**". >> >> >>> Logs : Float := 0.0; >>> Multiples : Float; >>     ...> Multiples := 10.0 ** Logs;  => this is where it fails >> >> >> It fails because the compiler sees only the predefined "**" operator which has >> an integral right operand. > > Thank you. So it is a visibility problem. "Understanding visibility is the key to understanding Ada." -- /Ada Distilled/ Recommending the use package clause as a solution to a misunderstanding of visibility is a disservice to a beginning user. Widespread application of use pkg clauses is a crutch to avoid understanding visibility. I recommend that those who do not understand visibility avoid the use clause altogether, as this forces them to learn about visibility. When one understands visibility, one can then make reasoned decisions about whether and when to add use clauses. In decreasing order of specificity, the ways to call an operation in a pkg are * Use the full name: Ada.Numerics.Elementary_Functions."**" (10.0, Logs) This calls the operation once without changing its visibility * Rename the operation: function "**" (Left : Float; Right : Float) return Float renames Ada.Numerics.Elementary_Functions."**"; This makes the specific operation visible * Use type: this makes all operators of the type visible (not applicable in this case) * Use all type: this makes all operations of the type visible (not applicable in this case) * Use package: this makes everything in the package visible Use pkg is clearly overkill for this case, and overuse of it can have negative consequences. -- Jeff Carter "Choose a data representation that makes the program simple." Elements of Programming Style 188