gm2
[Top][All Lists]
Advanced

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

Re: Inconsistent HIGH values with 'ARRAY OF CHAR'


From: Gaius Mulley
Subject: Re: Inconsistent HIGH values with 'ARRAY OF CHAR'
Date: Thu, 11 May 2023 12:44:35 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux)

Rudolf Schubert <rudolf@muc.de> writes:

>         Hi Gaius,
>
>         I find handling of C-strings somehow 'difficult' or even ugly
>         because of this terminating 0C. The idea of terminating a string
>         (or as we say an ARRAY OF CHAR) with a 0C immediately shows 2
>         disadvantages:
>
>         1. we do not know the length of the string until we search the
>         terminating 0C. Wouldn't it be much simpler just to have another
>         variable which tells us the length?
>         2. with 0C having this special meaning, 0C itself can never be
>         part of our ARRAY. But sometimes this might be useful!
>
>         But of course we now must live with this situation. So if we
>         want to deal with 'real' C-strings we need this terminating 0C.
>         Either as a 'real' CAHR which we put somewhere into memory or
>         as some 'virtual' thing which we 'imagine' would be located
>         beyond the very end of our ARRAY OF CHAR.
>
>         And thus at different occasions we have no other chance than
>         generating this 0C and putting it at the end of the ARRAY.
>
>         Two such occasions are simple assignments to variables of TYPE
>         ARRAY OF CHAR or when passing things as parameter to a PROCEDURE.
>
>         For instance for a
>
>         VAR
>           str_c:                        ARRAY[0..2] OF CHAR;
>
>         an assignment
>
>         str_c := '';
>
>         will in any case place 0C at index 0.
>
>         str_c := 'a';
>
>         will place 'a' at index 0 and 0C at index 1.
>
>         str_c := 'abc';
>
>         just places all characters into str_c but a 'real' 0C is
>         put nowehere!

Hi Rudolf,

indeed...

>         I think this is the way to go also for passing parameters into
>         a PROCEDURE. So yes, as you suggested, I think when passing just
>         one literal character into our ARRAY OF CHAR we should also put
>         a 'real' 0C at the end, i.e. right after this one character.
>
>
>         As an aside: while playing a bit with strings I could trigger
>         another ICE with this simple method:
>
>
>         MODULE port_test8b_gm2;
>
>         VAR
>           str_a:                        ARRAY[0..0] OF CHAR;
>
>         BEGIN                           (* MODULE port_test8b_gm2 *)
>           str_a:='ab';
>         END port_test8b_gm2.
>
>
>         First there is a
>
>         Warnung: string constant is too large to be assigned to the array
>
>         but then I also see an ICE which I find a bit exaggerated;-)

ah many thanks - I'll squash this bug,

regards,
Gaius



reply via email to

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