Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

problemn with string'last

49 views
Skip to first unread message

Daniel Gaudry

unread,
May 5, 2023, 5:51:55 AM5/5/23
to
hi,
here is a code that i simplified

with Ada.Text_Io;
procedure Help
is
Double_Quote : constant String(1 .. 1) := (others => '"' );
Data : constant String := " PLUS_STRING : CONSTANT STRING(1..3) :=(1 =>'" & Double_Quote & "' , 2 =>'+' , 3 =>'" & Double_Quote & ");";
begin

Ada.Text_Io.Put_Line(" 05 10 15 20 25 30 35 40 45 50 55 65 70 75 80 85 90");
Ada.Text_Io.Put_Line(" ....|....!....|....!....|....!....|....!....|....!....|....!....|....!....|....!....|....!");
Ada.Text_Io.Put_Line("»" & Data & "« " & Data'Last'Img);

end Help;


but the data'last seems not to match the string size

Any help is welcome
best regards

Dmitry A. Kazakov

unread,
May 5, 2023, 6:04:06 AM5/5/23
to
It matches. You missed the "60" tick in your scale. (:-))

--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

Jeffrey R.Carter

unread,
May 5, 2023, 7:19:37 AM5/5/23
to
On 2023-05-05 11:51, Daniel Gaudry wrote:
>
> Ada.Text_Io.Put_Line(" 05 10 15 20 25 30 35 40 45 50 55 65 70 75 80 85 90");
> Ada.Text_Io.Put_Line(" ....|....!....|....!....|....!....|....!....|....!....|....!....|....!....|....!....|....!");
> Ada.Text_Io.Put_Line("»" & Data & "« " & Data'Last'Img);

As Kazakov pointed out, your scale is incorrect.

However, it's important to remember that 'Last is not necessarily the same as
'Length because 'First is not necessarily one. This is especially important in
subprograms that take String parameters, as they are often passed slices.

Some questions:

> Double_Quote : constant String(1 .. 1) := (others => '"' );

ARM 2.1(15/3)
(http://www.ada-auth.org/standards/aarm12_w_tc1/html/AA-2-1.html#I1199) defines
the name of '"' as "quotation mark". Why do you refer to a single quotation mark
as Double_Quote?

> Data : constant String := " PLUS_STRING : CONSTANT STRING(1..3) :=(1 =>'" & Double_Quote & "' , 2 =>'+' , 3 =>'" & Double_Quote & ");";

Wouldn't it be simpler and clearer to write this as

Data : constant String := " PLUS_STRING : CONSTANT STRING := " & '"' & '+' & '"';

? Note also that you seem to be missing an apostrophe (''') before the right
parenthesis if you intend Data to be a valid Ada declaration.

--
Jeff Carter
"All citizens will be required to change their underwear
every half hour. Underwear will be worn on the outside,
so we can check."
Bananas
29

Dmitry A. Kazakov

unread,
May 5, 2023, 8:08:09 AM5/5/23
to
On 2023-05-05 13:17, Jeffrey R.Carter wrote:

> However, it's important to remember that 'Last is not necessarily the
> same as 'Length because 'First is not necessarily one. This is
> especially important in subprograms that take String parameters, as they
> are often passed slices.

Non-sliding indices is one of the most useful Ada features. You can pass
indices around as-is, which is extremely helpful when processing strings.

You will also find that actually 'Length and 'Last have different types,
which is quite useful as well.

Manuel Gomez

unread,
May 5, 2023, 12:29:01 PM5/5/23
to
El 5/5/23 a las 13:17, Jeffrey R.Carter escribió:
> On 2023-05-05 11:51, Daniel Gaudry wrote:
>>    Data         : constant String         := "  PLUS_STRING    :
>> CONSTANT STRING(1..3) :=(1 =>'" & Double_Quote & "' , 2 =>'+' , 3 =>'"
>> & Double_Quote & ");";
>
> Wouldn't it be simpler and clearer to write this as
>
> Data : constant String := "  PLUS_STRING : CONSTANT STRING := " & '"' &
> '+' & '"';
>
> ? Note also that you seem to be missing an apostrophe (''') before the
> right parenthesis if you intend Data to be a valid Ada declaration.
>

Or like this (doubling the quotes, which is the way to _escape_ the
double quote inside Ada strings):

Data : constant String := " PLUS_STRING :
CONSTANT STRING(1..3) :=(1 =>'""' , 2 =>'+' , 3 =>'""');";

Simon Wright

unread,
May 5, 2023, 12:34:42 PM5/5/23
to
Manuel Gomez <mgr...@gmail.com> writes:

> Or like this (doubling the quotes, which is the way to _escape_ the
> double quote inside Ada strings):
>
> Data : constant String := " PLUS_STRING :
> CONSTANT STRING(1..3) :=(1 =>'""' , 2 =>'+' , 3 =>'""');";

'"' is a single quote character.
"""" is a string containing one quote character.

Manuel Gomez

unread,
May 5, 2023, 2:20:08 PM5/5/23
to
El 5/5/23 a las 18:33, Simon Wright escribió:
Yes, and "'""'" is a string containing a quote as an Ada character (when
displayed).

J-P. Rosen

unread,
May 5, 2023, 3:52:42 PM5/5/23
to
Le 05/05/2023 à 20:18, Manuel Gomez a écrit :
> Yes, and "'""'" is a string containing a quote as an Ada character (when
> displayed).

Even more fun (I use this for people who write a naive Ada parser):
subtype C is Character;
V : String := C'(')')'Img;

--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
https://www.adalog.fr https://www.adacontrol.fr

Simon Wright

unread,
May 5, 2023, 4:44:58 PM5/5/23
to
Oh, I see. Ugh.

Jeffrey R.Carter

unread,
May 5, 2023, 7:28:54 PM5/5/23
to
As you have discovered, using doubled quotation marks within a String literal
can be significantly less clear than concatenating the quotation-mark Character
with the rest of the String.
0 new messages