Re: Class Notes for a PL/I Course.

"Bernd Oppolzer berndoppolzer-/[email protected] [H390-MVS]" <[email protected]> Thu, 3 Oct 2019 13:21:32 +0200
Newsgroups gmane.comp.emulators.hercules390.mvs
Message-ID <[email protected]>
One more error:

"It is possible to pass structures, but then you will get real trouble
with structure aggregates."

should read:

"It is possible to pass structures, but then you will get real trouble
with structure DESCRIPTORS."

Sorry again. Time for a little afternoon rest ...

Kind regards

Bernd



Am 03.10.2019 um 13:19 schrieb Bernd Oppolzer:
>
> One minor error:
>
> "that is, only parameters are passed."
>
> should read:
>
> "that is, only POINTERS are passed."
>
> Sorry
>
> Bernd
>
>
> Am 03.10.2019 um 13:16 schrieb Bernd Oppolzer:
>> Am 03.10.2019 um 12:42 schrieb Giuseppe Vitillaro 
>> giuseppe-yuD/ahkh7LvrZ44/[email protected] [H390-MVS]:
>>>
>>> On Thu, 3 Oct 2019, Bernd Oppolzer berndoppolzer-/[email protected] 
>>> [H390-MVS] wrote:
>>> >
>>> > Kind regards
>>> >
>>>
>>> I guess declaring this way a variable in the main program:
>>>
>>> DECLARE ZAZA CHARACTER(10) STATIC EXTERNAL INITIAL ( 'GIGIO' );
>>>
>>> and using it in an external procedure in this way:
>>>
>>> ZZ: PROCEDURE;
>>> DECLARE ZAZA CHARACTER(10) EXTERNAL;
>>> PUT FILE(SYSPRINT) SKIP EDIT ('ZAZA=', ZAZA ) (2(A));
>>> RETURN;
>>> END ZZ;
>>>
>>> it is the best which can be done in PL/I(F) to get something
>>> which looks like a global C variable?
>>>
>>
>> The short answer is: yes, this is the best.
>>
>> The long answer is: this does not really help you, if you want to
>> do some sort of dynamic linking, because you need the linker to
>> resolve those external references.
>>
>> BTW: STATIC in the main program is not needed or even forbidded,
>> because EXTERNAL variables are STATIC by default.
>>
>>
>>>
>>> Another thing I'm looking for is something like
>>> the C typedef syntax.
>>>
>>> The "LIKE" syntax looks to do something similar,
>>> but for an already "allocated" variable, if
>>> the variable is not actually a pointer.
>>>
>>> Anything better can be done with PL/I (F)?
>>>
>>> Peppe.
>>>
>>>
>>
>> This is somehow related to the question above.
>>
>> If you want parameters to be passed between external functions,
>> they may be structures - in the general case.
>>
>> The C way to do this would be
>>
>> - have a typedef of the struct in an include file
>> - then use this include file on both sides
>> - pass pointers of this struct between caller and called function
>>
>> This way the called function can read and write values from and
>> to the parameter structure.
>>
>> In traditional PL/1, there is no typedef. There is simply no concept
>> of type. See the funny assignment of structures (called aggregates),
>> where it is only needed that the layout of the structures are
>> congruent in a certain way, but the types of the components may differ.
>>
>> Or the second variant: BY NAME.
>>
>> This is all very different from what other languages do.
>>
>> So what is done "in real word" is often the following:
>>
>> we use %INCLUDE files, too. This works in PL/1, even if you don't
>> use the preprocessor (which is another very interesting topic;
>> the PL/1 preprocessor is much more powerful than the C macro processor,
>> for example).
>>
>> in these %INCLUDE files, we define PL/1 structures (or aggregates)
>> without the structure header, that is, without the DCL and the level 1
>> definition. Only level 3 or 5 ...
>>
>> these structure bodies are used at both sides (caller and callee).
>>
>> But the caller declares:
>>
>> DCL 1 PARM_STRUCT AUTO,
>> %INCLUDE (PARMINC);;
>>
>> and the callee declares:
>>
>> DCL 1 PARM_STRUCT BASED (PARM_PTR),
>> %INCLUDE (PARMINC);;
>>
>> and the call looks like this:
>>
>> CALL CALLEE (ADDR (PARM_STRUCT));
>>
>> that is, only parameters are passed.
>>
>> It is possible to pass structures, but then you will get real trouble
>> with structure aggregates.
>>
>> Passing pointers to structures will work well, when calling other
>> languages, too. There will be some issues with component alignment
>> (the PL/1 methods differ from that of other languages), but that
>> can be solved.
>>
>> This is not typedef, but it works a little bit like typedef :-)
>> == COBOL copybooks :-)
>>
>> HTH,
>> kind regards
>>
>> Bernd
>>
>>