[fpc-pascal] Initialization of constant record member of pointer type

Sven Barth pascaldragon at googlemail.com
Sun Dec 20 13:37:33 CET 2020


Am 14.12.2020 um 09:08 schrieb Marc Weustink via fpc-pascal:
>
>
> On 4-12-2020 13:01, LacaK via fpc-pascal wrote:
>>
>> Dňa 2.12.2020 o 16:09 Tomas Hajny via fpc-pascal napísal(a):
>>> On 2020-12-02 16:01, LacaK via fpc-pascal wrote:
>>>> Dňa 2.12.2020 o 13:55 Tomas Hajny via fpc-pascal napísal(a):
>>>>> On 2020-12-01 11:39, Ladislav Karrach via fpc-pascal wrote:
>>>>>>>
>>>>>>> Because MyConst1 is not an *untyped* constant. Only untyped 
>>>>>>> constants can be used in constant expressions (a pointer to 
>>>>>>> something can be considered an untyped constant).
>>>>>>>
>>>>>>> The following might work though I did not test it:
>>>>>>>
>>>>>>> === code begin ===
>>>>>>>
>>>>>>> const
>>>>>>>    MyStr = 'abc'
>>>>>>>    MyConst1: AnsiString = MyStr;
>>>>>>>    MyConst2: TMyRec = (l: Length(MyStr); a: @MyConst1[1]);
>>>>>>>
>>>>>>>
>>>>>>> === code end ===
>>>>>>>
>>>>>> Yes it works, but I must define 2 constants (MyStr and MyConst1),
>>>>>> which is not so nice ;-)
>>>>>>
>>>>>> It would be nice to have support for true constants:
>>>>>>
>>>>>> const
>>>>>>    MyConst1 = 'abc' ;
>>>>>>    MyConst2: TMyRec = (l: Length(MyConst1); a: @MyConst1[1]);
>>>>>>
>>>>>> But may be that there are technical reasons why it is problematic 
>>>>>> (may
>>>>>> be that true constants are stored in another memory locations, which
>>>>>> can not be easy addressed)
>>>>>
>>>>> Yes, that's one of possible reasons.
>>>>>
>>>>> Regarding Length in constant value assignment - remember that 
>>>>> Length is a function. In case of real constants, the call may be 
>>>>> replaced by the compiler with the constant value. However typed 
>>>>> constants may not be constant, so generic replacement throughout 
>>>>> the source code at compile time is not possible (if it appears in 
>>>>> the main body or some function, the length may already be changed 
>>>>> to something else) and selective replacement may result in a 
>>>>> behaviour not expected by the user. The only questionable case is 
>>>>> IMHO the case of {$WRITEABLECONST OFF} - the compiler _might_ be 
>>>>> able to perform the compile-time substition in that case (and thus 
>>>>> allow using Length of such a constant in constant value 
>>>>> assignment), but it doesn't do that in that case either apparently.
>>>>
>>>> Yes I have no problem with {$WRITEABLECONST OFF} if it will allow 
>>>> Length().
>>>>
>>>> Somewhere I read (may be in Delphi documentation) that some intristic
>>>> functions like Low(), High(), Pred() and also Length() etc. can be
>>>> used in constant expressions because compiler can evaluate them if
>>>> theirs arguments are also constants.
>>>> Which is the case in my example.
>>>> For now {$WRITEABLECONST OFF} does not help ;-)
>>>
>>> Yes, that's what I mentioned as well, but it might be changed for 
>>> this particular case. You might create a ticket for that if Delphi 
>>> allows to use Length that way; obviously, you might create such a 
>>> ticket even if Delphi doesn't allow to do that. ;-)
>>>
>> I checked it with older Delphi XE and it seems, that Delphi XE does 
>> not support Length() for typed constant also when {$WRITEABLECONST OFF}
>>
>> I do not believe that this will be accepted for FPC, so I don not 
>> open new feature request in bug tracker.
>>
>> On other side FPC developers read this mailing list so if they 
>> consider this as a useful/doable feature may be that someone will 
>> take look at it 
>
> I just happened to write a construct like this (in Delphi):
>
> const
>   X_0: array[0..4276] of SmallInt = (.....
>
>   MAP: array['0'..'9'] of TSomething = (
>     (Samples: @X_0; Count: Length(X_0)), ...

That works, because the size of the *type* is known at compile time. 
String data however is not part of the type, it's content.

Regards,
Sven


More information about the fpc-pascal mailing list