[Info-vax] Error Messages in Basic - %BASIC-E-PARMODNOT, mode for parameter <n> of routine <procedure-name> not as declared
Dave Froble
davef at tsoft-inc.com
Sat Jun 8 23:16:01 EDT 2019
On 6/8/2019 4:24 PM, Bob Gezelter wrote:
> On Saturday, June 8, 2019 at 2:21:45 PM UTC-4, Jeffrey H. Coffield wrote:
>> On 06/05/2019 07:45 AM, DuncanMorris wrote:
>>> On Wednesday, June 5, 2019 at 3:28:00 PM UTC+1, Jeffrey H. Coffield wrote:
>>>> The following compiles and runs for me on both Alpha and Itanium. You
>>>> must have something wrong in how you are declaring the function.
>>>>
>>>> program test
>>>>
>>>> external long function lib$convert_date_string
>>>>
>>>> Declare Long Date_Time_Context_gl
>>>> Declare String End_of_Month_Date_gs
>>>> Declare Quad End_of_Month_Date_Time_gq
>>>> Declare Long End_of_Month_Weekday_gl
>>>> Declare Long VMS_Condition_Code_gl
>>>>
>>>> End_of_Month_Date_gs = '31-may-2019 01:23:45.67'
>>>>
>>>> VMS_Condition_Code_gl &
>>>> = LIB$CONVERT_DATE_STRING (End_of_Month_Date_gs, &
>>>> End_of_Month_Date_Time_gq, &
>>>> Date_Time_Context_gl )
>>>>
>>>> print VMS_Condition_Code_gl
>>>> print End_of_Month_Date_Time_gq
>>>>
>>>> end
>>>>
>>>>
>>>>
>>>> On 06/05/2019 06:48 AM, Craig Dedo wrote:
>>>>> VMS_Condition_Code_gl = LIB$CONVERT_DATE_STRING ( End_of_Month_Date_gs, End_of_Month_Date_Time_gq, Date_Time_Context_gl )
>>>
>>> Nothing wrong, per se, with the program.
>>>
>>> As Hoff has pointed out, the external definition in the library expects BASIC$QUADWORD for parameter 2. This is not seen as the same type as QUAD.
>>>
>>> Try this-
>>> program test
>>>
>>> %include "starlet" %from %library "sys$library:basic$starlet" ! System Services declarations
>>> %include "$ssdef" %from %library "sys$library:basic$starlet" ! condition codes
>>> %include "lib$routines" %from %library "sys$library:basic$starlet" ! LIBRTL routines
>>>
>>> Declare Long Date_Time_Context_gl
>>> Declare String End_of_Month_Date_gs
>>> Declare Quad End_of_Month_Date_Time_gq
>>> Declare Long End_of_Month_Weekday_gl
>>> Declare Long VMS_Condition_Code_gl
>>>
>>> End_of_Month_Date_gs = '31-may-2019 01:23:45.67'
>>>
>>> VMS_Condition_Code_gl &
>>> = LIB$CONVERT_DATE_STRING (End_of_Month_Date_gs, &
>>> End_of_Month_Date_Time_gq, &
>>> Date_Time_Context_gl )
>>>
>>> print VMS_Condition_Code_gl
>>> print End_of_Month_Date_Time_gq
>>>
>>> end
>>>
>>> I1 12238 ! LIB$CONVERT_DATE_STRING
>>> I1 12239 !
>>> I1 12240 ! Convert Date String to Quadword
>>> I1 12241 !
>>> I1 12242 ! The Convert Date String to Quadword routine converts an absolute date
>>> I1 12243 ! string into a VMS internal format date-time quadword. That is, given
>>> I1 12244 ! an input date/time string of a specified format,
>>> I1 12245 ! LIB$CONVERT_DATE_STRING converts this string to a VMS internal format
>>> I1 12246 ! time.
>>> I1 12247 !
>>> I1 12248 EXTERNAL LONG FUNCTION lib$convert_date_string &
>>> I1 12249 ( &
>>> I1 12250 STRING BY DESC, &
>>> I1 12251 BASIC$QUADWORD BY REF, &
>>> I1 12252 OPTIONAL LONG BY REF, &
>>>
>>
>> There are a number of places in both text libraries as well as .BAS
>> files that have the following "patch":
>>
>> %IF %DECLARED(%BASIC$QUADWORD_DECLARED) = 0 %THEN
>> RECORD BASIC$QUADWORD
>> LONG FILL(2)
>> END RECORD
>> %LET %BASIC$QUADWORD_DECLARED = 1
>> %END %IF
>>
>> because Basic didn't have a quad data type. It does now and this
>> could/should be cleaned up.
>>
>> There are other long time errors and omissions in Basic support that I
>> have had to keep my own fixed/stable versions of some of the library
>> files so my programs will work. Notably the files concerning XAB
>> structures for Basic would change/break with new versions of OpenVMS.
>>
>> If anyone is interested in fixing, I can dig up some small samples.
>>
>> Also, if there is a list of things to do, Basic still does not support a
>> get/find key "LT" or "LE" which RMS supports.
>
> Jeffrey,
>
> At first glance, when I encountered this I agreed. However, on detailed consideration, the problem is more complex.
>
> Changing the BASIC$QUADWORD definition to a simple quadword would invalidate all existing code. It would be a nasty incompatibility, causing a lot of rework to existing code.
>
> One could do something with conditional code, but it would be complex to implement and document.
>
> Hoff has referred to this type of problem using words along the line of "curse of compatibility". I am forced to agree. The solution (using a struct) made sense when done, but events have made the existing solution awkward and dated. Changing the solution breaks existing code.
>
> - Bob Gezelter, http://www.rlgsc.com
>
I guess where I'm confused is what is the difference between a RECORD
structure that is basically 8 bytes, regardless of the makeup, and the
BASIC QUAD variable definition. I'm assuming there is a difference,
since the reported problem exists. But what is that difference, and, WHY?
If declaring a variable, and passing it by ref, then what I'd expect is
simply the address of the 8 bytes. What am I missing?
--
David Froble Tel: 724-529-0450
Dave Froble Enterprises, Inc. E-Mail: davef at tsoft-inc.com
DFE Ultralights, Inc.
170 Grimplin Road
Vanderbilt, PA 15486
More information about the Info-vax
mailing list