comp.lang.ada
 help / color / mirror / Atom feed
* When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
@ 2023-07-27  5:26 Kenneth Wolcott
  2023-07-27  8:53 ` Jeffrey R.Carter
  0 siblings, 1 reply; 11+ messages in thread
From: Kenneth Wolcott @ 2023-07-27  5:26 UTC (permalink / raw)


Hi;

When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?

  I'd like to slice out the first two digits from the output of the To_String function of Ada.Big_Numbers.Big_Integers.

  When trying to do the usual string slicing on the output I get a silent failure, it is just as if I typed the  null statement.

  Do I have to save the output to a variable via a declare block in order to get the slice to work?

  This question is prompted by my attempt to solve the Rosetta Code task:

https://rosettacode.org/wiki/First_power_of_2_that_has_leading_decimal_digits_of_12

Thanks,
Ken Wolcott

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-27  5:26 When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced? Kenneth Wolcott
@ 2023-07-27  8:53 ` Jeffrey R.Carter
  2023-07-27 22:47   ` Kenneth Wolcott
  0 siblings, 1 reply; 11+ messages in thread
From: Jeffrey R.Carter @ 2023-07-27  8:53 UTC (permalink / raw)


On 2023-07-27 07:26, Kenneth Wolcott wrote:
> 
> When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
> 
>    I'd like to slice out the first two digits from the output of the To_String function of Ada.Big_Numbers.Big_Integers.
> 
>    When trying to do the usual string slicing on the output I get a silent failure, it is just as if I typed the  null statement.

It would be helpful if you could show what you're doing and what results you 
get. This

with Ada.Numerics.Discrete_Random;
with Ada.Text_IO;

procedure Func_Slice is
    subtype Digit is Character range '0' .. '9';

    package Random is new Ada.Numerics.Discrete_Random (Result_Subtype => Digit);

    Gen : Random.Generator;

    function Image (N : in Natural) return String is
       (if N = 0 then "" else Random.Random (Gen) & Image (N - 1) );
    -- Returns a string of N random Digits
begin -- Func_Slice
    Random.Reset (Gen => Gen);
    Ada.Text_IO.Put_Line (Item => Image (10) (1 .. 2) );
end Func_Slice;

works as expected

$ gnatmake -m -j0 -gnat12 -gnatan -gnato2 -O2 -fstack-check func_slice.adb
x86_64-linux-gnu-gcc-12 -c -gnat12 -gnatan -gnato2 -O2 -fstack-check func_slice.adb
x86_64-linux-gnu-gnatbind-12 -x func_slice.ali
x86_64-linux-gnu-gnatlink-12 func_slice.ali -O2 -fstack-check
$ ./func_slice
10
$ ./func_slice
51

-- 
Jeff Carter
"I would never want to belong to any club that
would have someone like me for a member."
Annie Hall
41

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-27  8:53 ` Jeffrey R.Carter
@ 2023-07-27 22:47   ` Kenneth Wolcott
  2023-07-28 17:19     ` AdaMagica
  2023-07-28 18:21     ` Simon Wright
  0 siblings, 2 replies; 11+ messages in thread
From: Kenneth Wolcott @ 2023-07-27 22:47 UTC (permalink / raw)


On Thursday, July 27, 2023 at 1:53:38 AM UTC-7, Jeffrey R.Carter wrote:
> On 2023-07-27 07:26, Kenneth Wolcott wrote: 
> > 
> > When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced? 
> > 
> > I'd like to slice out the first two digits from the output of the To_String function of Ada.Big_Numbers.Big_Integers. 
> > 
> > When trying to do the usual string slicing on the output I get a silent failure, it is just as if I typed the null statement.
> It would be helpful if you could show what you're doing and what results you 
> get. This 
> 
> with Ada.Numerics.Discrete_Random; 
> with Ada.Text_IO; 
> 
> procedure Func_Slice is 
> subtype Digit is Character range '0' .. '9'; 
> 
> package Random is new Ada.Numerics.Discrete_Random (Result_Subtype => Digit); 
> 
> Gen : Random.Generator; 
> 
> function Image (N : in Natural) return String is 
> (if N = 0 then "" else Random.Random (Gen) & Image (N - 1) ); 
> -- Returns a string of N random Digits 
> begin -- Func_Slice 
> Random.Reset (Gen => Gen); 
> Ada.Text_IO.Put_Line (Item => Image (10) (1 .. 2) ); 
> end Func_Slice; 
> 
> works as expected 
> 
> $ gnatmake -m -j0 -gnat12 -gnatan -gnato2 -O2 -fstack-check func_slice.adb 
> x86_64-linux-gnu-gcc-12 -c -gnat12 -gnatan -gnato2 -O2 -fstack-check func_slice.adb 
> x86_64-linux-gnu-gnatbind-12 -x func_slice.ali 
> x86_64-linux-gnu-gnatlink-12 func_slice.ali -O2 -fstack-check 
> $ ./func_slice 
> 10 
> $ ./func_slice 
> 51 

Hi Jeff;

  After going back and exhaustively reviewing the AdaCore Learning Introduction sections on Strings and Arrays, I determined that I was not slicing with the correct syntax for what I wanted to obtain, it seems that I was slicing built-in whitespace, not the digits I was looking for.  So I am now extracting the two-digit slice using (2 .. 3) rather than (1 .. 2) and I am now obtaining the desired output.  What I was trying to do was to obtain the slice from the string on the fly, not first saving the string to a variable.

This is what I have now (which works great):
---------------------------------------------------------------------------
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Command_Line; use Ada.Command_Line;
with Ada.Numerics.Big_Numbers.Big_Integers; use Ada.Numerics.Big_Numbers.Big_Integers;

procedure Powers_Of_2_With_Leading_Digits_Of_12 is
  Max : Positive := Integer'Value (Argument (1));
  Powers_of_2 : Big_Positive := 1;
begin
  for I in 1 .. Max loop
    Powers_of_2 := Powers_of_2 * To_Big_Integer (2);
    if I >= 4 then
      declare
        Powers_of_2_in_String_Format : String := To_String (Powers_of_2);
        First_Pair_of_String_Digits : String := Powers_of_2_in_String_Format (2 .. 3);
      begin
        if First_Pair_of_String_Digits = "12" then
          Put ("2^");
          Put (I, 0);
          Put_Line (To_String (Powers_of_2));
        end if;
      end; -- declare
    end if;
  end loop;
end Powers_Of_2_With_Leading_Digits_Of_12;
---------------------------------------------------------------------------

Now I can generalize this to more closely match the task requirements.

I think I tried to incorrectly create the slice from the To_String output directly without creating the variable in which to store the slice, which then requires the declare block.

Thanks,
Ken

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-27 22:47   ` Kenneth Wolcott
@ 2023-07-28 17:19     ` AdaMagica
  2023-07-28 18:21     ` Simon Wright
  1 sibling, 0 replies; 11+ messages in thread
From: AdaMagica @ 2023-07-28 17:19 UTC (permalink / raw)


To_String (Powers_of_2) (2 .. 3)  should also work.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-27 22:47   ` Kenneth Wolcott
  2023-07-28 17:19     ` AdaMagica
@ 2023-07-28 18:21     ` Simon Wright
  2023-07-29  3:29       ` Kenneth Wolcott
  2023-07-29 11:07       ` AdaMagica
  1 sibling, 2 replies; 11+ messages in thread
From: Simon Wright @ 2023-07-28 18:21 UTC (permalink / raw)


This works for me:

   for I in 1 .. Max loop
      Powers_of_2 := Powers_of_2 * To_Big_Integer (2);
      if I >= 4 then
         if To_String (Powers_Of_2)(2 .. 3) = "12" then
            Put ("2^");
            Put (I, 0);
            Put_Line (To_String (Powers_of_2));
         end if;
      end if;
   end loop;

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-28 18:21     ` Simon Wright
@ 2023-07-29  3:29       ` Kenneth Wolcott
  2023-07-29 11:07       ` AdaMagica
  1 sibling, 0 replies; 11+ messages in thread
From: Kenneth Wolcott @ 2023-07-29  3:29 UTC (permalink / raw)


On Friday, July 28, 2023 at 11:21:13 AM UTC-7, Simon Wright wrote:
> This works for me:
> for I in 1 .. Max loop 
> Powers_of_2 := Powers_of_2 * To_Big_Integer (2); 
> if I >= 4 then
> if To_String (Powers_Of_2)(2 .. 3) = "12" then
> Put ("2^"); 
> Put (I, 0); 
> Put_Line (To_String (Powers_of_2)); 
> end if;
> end if; 
> end loop;


Thanks to all for your responses...

I don't know exactly what I had tried that had failed, but I have learned more now, especially to be more observant.

I was able to simplify my code.

Greatly appreciate your patience with me.

Thanks,
Ken

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-28 18:21     ` Simon Wright
  2023-07-29  3:29       ` Kenneth Wolcott
@ 2023-07-29 11:07       ` AdaMagica
  2023-07-29 23:49         ` Kenneth Wolcott
  1 sibling, 1 reply; 11+ messages in thread
From: AdaMagica @ 2023-07-29 11:07 UTC (permalink / raw)


> Powers_of_2 := Powers_of_2 * To_Big_Integer (2); 

With the aspect Integer_Literal, also Powers_of_2 * 2 must work. The attributes Integer_Literal, Real_Literal, Put_Image make the new big numbers nearly work like numeric types (they are not). A difference: The range syntax for instance in loops A .. B is illegal.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-29 11:07       ` AdaMagica
@ 2023-07-29 23:49         ` Kenneth Wolcott
  2023-07-29 23:53           ` Kenneth Wolcott
  0 siblings, 1 reply; 11+ messages in thread
From: Kenneth Wolcott @ 2023-07-29 23:49 UTC (permalink / raw)


On Saturday, July 29, 2023 at 4:07:17 AM UTC-7, AdaMagica wrote:
> > Powers_of_2 := Powers_of_2 * To_Big_Integer (2);
> With the aspect Integer_Literal, also Powers_of_2 * 2 must work. The attributes Integer_Literal, Real_Literal, Put_Image make the new big numbers nearly work like numeric types (they are not). A difference: The range syntax for instance in loops A .. B is illegal.

  I understand that the range syntax in loops implies that the loop variable is acting like an enumerated type which is not true for Big_Integers.

  What confused me is that I thought I had to convert the numeric literal (I'll have to go back and look at the package spec again to get this firmly understood.

  I have an another question about string slicing: I've tried (obviously incorrectly) to use a variable is one of the slice integers. Can this be done?

Thanks,
Ken

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-29 23:49         ` Kenneth Wolcott
@ 2023-07-29 23:53           ` Kenneth Wolcott
  2023-07-30  4:43             ` Randy Brukardt
  0 siblings, 1 reply; 11+ messages in thread
From: Kenneth Wolcott @ 2023-07-29 23:53 UTC (permalink / raw)


On Saturday, July 29, 2023 at 4:49:08 PM UTC-7, Kenneth Wolcott wrote:
> On Saturday, July 29, 2023 at 4:07:17 AM UTC-7, AdaMagica wrote: 
> > > Powers_of_2 := Powers_of_2 * To_Big_Integer (2); 
> > With the aspect Integer_Literal, also Powers_of_2 * 2 must work. The attributes Integer_Literal, Real_Literal, Put_Image make the new big numbers nearly work like numeric types (they are not). A difference: The range syntax for instance in loops A .. B is illegal.
> I understand that the range syntax in loops implies that the loop variable is acting like an enumerated type which is not true for Big_Integers. 
> 
> What confused me is that I thought I had to convert the numeric literal (I'll have to go back and look at the package spec again to get this firmly understood. 
> 
> I have an another question about string slicing: I've tried (obviously incorrectly) to use a variable is one of the slice integers. Can this be done? 
> 
> Thanks, 
> Ken

Apparently not :-(

gnatmake main.adb
gcc -c main.adb
main.adb:28:67: error: named parameters not permitted for attributes
     9	with Ada.Text_IO; use Ada.Text_IO;
    10	with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
    11	with Ada.Float_Text_IO; use Ada.Float_Text_IO;
    12	with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions;
    13	with Ada.Command_Line; use Ada.Command_Line;
    14
    15	procedure Main is
    16	  Substr : String := Argument (1);
    17	  Nth : Positive := Integer'Value (Argument (2));
    18	  I, J : Natural;
    19	  Temp : Float;
    20	begin
    21	  I := 0;
    22	  J := 0;
    23	  loop
    24	    I := I + 1;
    25	    exit when I >= 10;
    26	    Temp := 10.0 ** (log (2.0, 10.0) * Float (I));
    27	    if I >= 4  then
    28	      if (Float'Image (10.0 ** (log (2.0, 10.0) * Float (I)), Aft => 0, Exp => 0) (1 .. Substr'Length) = Substr then
    29	        J := J + 1;
    30	        if J = Nth then
    31	          Put (I, 0);
    32	          New_Line;
    33	          exit;
    34	        end if;
    35	      end if;
    36	    end if;
    37	  end loop;
    38	end Main;

Thanks,
Ken

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-29 23:53           ` Kenneth Wolcott
@ 2023-07-30  4:43             ` Randy Brukardt
  2023-07-31 19:36               ` Kenneth Wolcott
  0 siblings, 1 reply; 11+ messages in thread
From: Randy Brukardt @ 2023-07-30  4:43 UTC (permalink / raw)


'Image doesn't support any formatting, so no "Aft" or "Exp". The slicing 
isn't the problem. :-)

You can use Text_IO to write to a string if you need formatting. 'Image is 
for quick & dirty debugging, not fancy output. (Of course, if you're lucky 
and it does what you need, then feel free to use it.)

                                 Randy.

"Kenneth Wolcott" <kennethwolcott@gmail.com> wrote in message 
news:2a5702b3-dbbc-4255-a4d4-e801f227fed3n@googlegroups.com...
On Saturday, July 29, 2023 at 4:49:08?PM UTC-7, Kenneth Wolcott wrote:
> On Saturday, July 29, 2023 at 4:07:17?AM UTC-7, AdaMagica wrote:
> > > Powers_of_2 := Powers_of_2 * To_Big_Integer (2);
> > With the aspect Integer_Literal, also Powers_of_2 * 2 must work. The 
> > attributes Integer_Literal, Real_Literal, Put_Image make the new big 
> > numbers nearly work like numeric types (they are not). A difference: The 
> > range syntax for instance in loops A .. B is illegal.
> I understand that the range syntax in loops implies that the loop variable 
> is acting like an enumerated type which is not true for Big_Integers.
>
> What confused me is that I thought I had to convert the numeric literal 
> (I'll have to go back and look at the package spec again to get this 
> firmly understood.
>
> I have an another question about string slicing: I've tried (obviously 
> incorrectly) to use a variable is one of the slice integers. Can this be 
> done?
>
> Thanks,
> Ken

Apparently not :-(

gnatmake main.adb
gcc -c main.adb
main.adb:28:67: error: named parameters not permitted for attributes
     9 with Ada.Text_IO; use Ada.Text_IO;
    10 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
    11 with Ada.Float_Text_IO; use Ada.Float_Text_IO;
    12 with Ada.Numerics.Elementary_Functions; use 
Ada.Numerics.Elementary_Functions;
    13 with Ada.Command_Line; use Ada.Command_Line;
    14
    15 procedure Main is
    16   Substr : String := Argument (1);
    17   Nth : Positive := Integer'Value (Argument (2));
    18   I, J : Natural;
    19   Temp : Float;
    20 begin
    21   I := 0;
    22   J := 0;
    23   loop
    24     I := I + 1;
    25     exit when I >= 10;
    26     Temp := 10.0 ** (log (2.0, 10.0) * Float (I));
    27     if I >= 4  then
    28       if (Float'Image (10.0 ** (log (2.0, 10.0) * Float (I)), Aft => 
0, Exp => 0) (1 .. Substr'Length) = Substr then
    29         J := J + 1;
    30         if J = Nth then
    31           Put (I, 0);
    32           New_Line;
    33           exit;
    34         end if;
    35       end if;
    36     end if;
    37   end loop;
    38 end Main;

Thanks,
Ken 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced?
  2023-07-30  4:43             ` Randy Brukardt
@ 2023-07-31 19:36               ` Kenneth Wolcott
  0 siblings, 0 replies; 11+ messages in thread
From: Kenneth Wolcott @ 2023-07-31 19:36 UTC (permalink / raw)


On Saturday, July 29, 2023 at 9:43:42 PM UTC-7, Randy Brukardt wrote:
> 'Image doesn't support any formatting, so no "Aft" or "Exp". The slicing 
> isn't the problem. :-) 
> 
> You can use Text_IO to write to a string if you need formatting. 'Image is 
> for quick & dirty debugging, not fancy output. (Of course, if you're lucky 
> and it does what you need, then feel free to use it.) 

Hi Randy;

  Thank you for your input.

  I think I was (maybe I still am) suffering from the "sprintf" "disease" from Perl (and C).

Thanks,
Ken

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2023-07-31 19:36 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-27  5:26 When using the Ada Big_Numbers.Big_Integers package, can the To_String function output be sliced? Kenneth Wolcott
2023-07-27  8:53 ` Jeffrey R.Carter
2023-07-27 22:47   ` Kenneth Wolcott
2023-07-28 17:19     ` AdaMagica
2023-07-28 18:21     ` Simon Wright
2023-07-29  3:29       ` Kenneth Wolcott
2023-07-29 11:07       ` AdaMagica
2023-07-29 23:49         ` Kenneth Wolcott
2023-07-29 23:53           ` Kenneth Wolcott
2023-07-30  4:43             ` Randy Brukardt
2023-07-31 19:36               ` Kenneth Wolcott

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