gm2
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Access of elements of a string constant


From: Gaius Mulley
Subject: Re: Access of elements of a string constant
Date: Mon, 20 Jan 2020 17:58:18 +0000
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Michael Riedl <address@hidden> writes:

> Hallo John,
>
> had a look in the standard (only have a late draft at hand).
>
> Would not have interpreted that in the sense you indicated, but it
> seems you are right !
>
> So I recoded to ...
>
> MODULE TstStrConst;
>
> IMPORT STextIO,SWholeIO;
>
> CONST len     = 16;
>
> TYPE  TNumStr = ARRAY [0..len-1] OF CHAR;
>
> CONST NumStr  = TNumStr{ (* "0123456789ABCDEF" *)
>                  "0","1","2","3","4","5","6","7","8","9",
>                  "A","B","C","D","E","F"
>                };
>
> VAR   i : CARDINAL;
>       c : CHAR;
> BEGIN
>       STextIO.WriteLn;
>       FOR i:=0 TO len-1 DO
>         SWholeIO.WriteCard(i,2);
>         STextIO.WriteString(" '");
>         c := NumStr[i];
>         STextIO.WriteChar(c);
>         STextIO.WriteString("' ");
>         SWholeIO.WriteCard(ORD(c),1);
>         STextIO.WriteLn;
>       END;
>       STextIO.WriteLn;
> END TstStrConst.
>
> This is compiled but does not give the expected result on my machine ...
>
> Should be
>
>  0 '0' 48
>  1 '1' 49
>  2 '2' 50
>  3 '3' 51
>  4 '4' 52
>  5 '5' 53
>  6 '6' 54
>  7 '7' 55
>  8 '8' 56
>  9 '9' 57
> 10 'A' 65
> 11 'B' 66
> 12 'C' 67
> 13 'D' 68
> 14 'E' 69
> 15 'F' 70
>
> but ends up with
>
>  0 '0' 48
>  1 '' 0
>  2 '' 0
>  3 '' 0
>  4 '' 0
>  5 '' 0
>  6 '' 0
>  7 '' 0
>  8 '' 0
>  9 '' 0
> 10 '' 0
> 11 '' 0
> 12 '' 0
> 13 '' 0
> 14 '' 0
> 15 '' 0
>
> interrestingly the fist line is OK ...
>
> Any idea ?
>
> If I use a construct like
>
> ...
>
> CONST digits = "0123456789ABCDEF"
>
> VAR   Digits = ARRAY [0..15] OF CHAR; (* do not need the terminating "0C" *)
>
> BEGIN
>
>       Digits := digits;
>
> ...
>
> all seems fine ..
>
> Michael
>
>
> PS: By the way, does anybody in the audience know if my original code
> would be OK in PIM ? Just for interest.
>
>
> Am 05.01.20 um 03:00 schrieb john o goyo:
>> Greetings, Michael.
>>
>> On 01/04/20 12:05, Michael Riedl wrote (in part):
>>> [...]
>>>
>>> MODULE TstStrConst;
>>>
>>> IMPORT STextIO,SWholeIO;
>>>
>>> CONST NumStr = "0123456789ABCDF";
>>>
>>> VAR   i : CARDINAL;
>>>
>>> BEGIN
>>>       STextIO.WriteLn;
>>>       FOR i:=0 TO LENGTH(NumStr)-1 DO
>>>         SWholeIO.WriteCard(i,2);
>>>         STextIO.WriteString(" '");
>>>         STextIO.WriteChar(NumStr[i]);
>>>         STextIO.WriteString("' ");
>>>         SWholeIO.WriteCard(ORD(NumStr[i]),1);
>>>         STextIO.WriteLn;
>>>       END;
>>>       STextIO.WriteLn;
>>> END TstStrConst.
>>>
>>> It can be fixed by a VAR string initialized in the module body -
>>> but that's less elegant.
>> I know not about PIM but that construct seems to be disallowed by ISO:
>>
>>     NOTE 1 - An indexed value cannot be formed by indexing a string
>> constant.
>>
>>     (ISO/IEC 10514-1, Sect. 6.8.4.2)
>>
>> john

Hi Michael and John,

now fixed in the latest git master branch.  I've added a number of
regression tests along these lines.  After running the regression tests
I'm now seeing 7 failures on gcc-trunk and gm2-trunk on the amd64
platform.

type
   array = array [0..25] of char ;

const
   str = array { "ABCDEF", "GHIJKL", "MNOPQR", "STUVWX", "YZ" } ;

--

type
   array = array [0..25] of char ;

const
   str = array { "A", "B", "C", "D", "E", "F", "G", "H",
                 "I", "J", "K", "L", "M", "N", "O", "P",
                 "Q", "R", "S", "T", "U", "V", "W", "X",
                 "Y", "Z" } ;
all work

regards,
Gaius






reply via email to

[Prev in Thread] Current Thread [Next in Thread]