[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