[Search for users]
[Overall Top Noters]
[List of all Conferences]
[Download this site]
Title: | DEC BASIC Conference |
Notice: | SSB Kit Now available - Note 2.29 |
Moderator: | TLE::HAYNES |
|
Created: | Wed Sep 15 1993 |
Last Modified: | Thu Jun 05 1997 |
Last Successful Update: | Fri Jun 06 1997 |
Number of topics: | 210 |
Total number of notes: | 976 |
204.0. "ACCVIO (MEMMANVIO) with LIB$INIT_DATE_TIME_CONTEXT, V7.1" by CSC32::D_SANFORD () Fri Mar 28 1997 13:32
DEC BASIC V2.1-000, OpenVMS Alpha V7.1
The following example fails with an ACCVIO (MEMMANVIO) during a
function call to LIB$INIT_DATE_TIME_CONTEXT. This same program
works with OpenVMS Alpha V6.2, did not test with V7.0. I also
tried this with DEC$BASRTL.EXE from a V7.1 system on V6.2 and it
did not fail, so does not look like a RTL/Compiler issue.
If you remove one statement:
PRINT ESC; '<'; SI;
It will also work on V7.1. I suspect something getting corrupted,
but it does not look like the application can be causing it.
Regards, Drew Sanford
Language Support Team
C970226-3137
$ ! Command file to create sources/link image PCHEK.EXE
$ !
$ create datefn.bas
!
! Initialize MD Date Functions
!
RECORD quadword
long QUAD.DATE.WORD(1%)
END RECORD
EXTERNAL quadword FUNCTION fn_MDSIN (string)
EXTERNAL string FUNCTION fn_MDSOUT (quadword)
EXTERNAL quadword FUNCTION fn_MDLIN (string)
EXTERNAL string FUNCTION fn_MDOOUT (quadword)
EXTERNAL string FUNCTION fn_MDLOUT (quadword)
EXTERNAL string FUNCTION fn_MDIOUT (quadword)
EXTERNAL quadword FUNCTION fn_MDADD (quadword, long)
EXTERNAL long FUNCTION fn_MDINT (quadword, quadword)
EXTERNAL quadword FUNCTION fn_MDTODA ()
DECLARE quadword QUAD.DATE.Q
MAP (MDCOM) long MD.CONTEXT.L
$ !
$ create fn_mdlout.bas
1 FUNCTION string fn_MDLOUT (quadword USER.TIME.Q)
OPTION &
TYPE = real &
, SIZE = (REAL double, INTEGER long) &
, SCALE = 0
RECORD quadword
long D(1%)
END RECORD
EXTERNAL long FUNCTION LIB$INIT_DATE_TIME_CONTEXT &
(long, long, string)
EXTERNAL long FUNCTION LIB$FORMAT_DATE_TIME &
(string,quadword,long,long,long)
!
! C o n s t a n t D e f i n i t i o n s
!
EXTERNAL long CONSTANT LIB$M_DATE_FIELDS, LIB$K_OUTPUT_FORMAT
EXTERNAL long CONSTANT SS$_NORMAL
!
! L o c a l D e f i n i t i o n s
!
DECLARE long STATUS.L, DL.L
MAP (MDCOM) long MD.CONTEXT.L
ON ERROR GO BACK
A% = CTRLC
!
! If a date of 0,0 is passed in, return a string of blanks
!
IF User.time.q::D(0%) = 0% AND User.time.q::D(1%) = 0% THEN
fn_MDLOUT = ' '
EXIT FUNCTION
END IF
DATE.FORMAT$ = '!D0-!MAAC-!Y4'
!
! Initilize input format
!
print "calling init_date_time_context" ! trace
print md.context.l
PRINT "LIB$K_OUTPUT_FORMAT "; LIB$K_OUTPUT_FORMAT
STATUS.L = LIB$INIT_DATE_TIME_CONTEXT &
(MD.CONTEXT.L ,LIB$K_OUTPUT_FORMAT, "|" + DATE.FORMAT$ &
+ "| !H04:!M0:!S0.!C2|")
PRINT "RETURN FROM INIT_DATE..."
print md.context.l
IF STATUS.L <> SS$_NORMAL THEN
CALL LIB$SYS_GETMSG (STATUS.L, , SMG.ERT$)
CAUSE ERROR 194%
END IF
!
! Do the conversion
!
print "calling format_date_time" ! trace
STATUS.L = LIB$FORMAT_DATE_TIME &
(D$, USER.TIME.Q, MD.CONTEXT.L, DL.L, LIB$M_DATE_FIELDS)
IF STATUS.L <> SS$_NORMAL THEN
CALL LIB$SYS_GETMSG (STATUS.L, , SMG.ERT$)
CAUSE ERROR 194%
END IF
fn_MDLOUT = LEFT (D$ + ' ', 11%)
END FUNCTION
$ !
$ create fn_mdsin.bas
1 FUNCTION quadword fn_MDSIN (D$)
OPTION &
TYPE = real &
, SIZE = (REAL double, INTEGER long) &
, SCALE = 0
RECORD quadword
long D(1%)
END RECORD
EXTERNAL long FUNCTION LIB$INIT_DATE_TIME_CONTEXT &
(long, long, string)
EXTERNAL long FUNCTION LIB$CONVERT_DATE_STRING
EXTERNAL long CONSTANT LIB$K_INPUT_FORMAT
EXTERNAL long CONSTANT SS$_NORMAL
DECLARE quadword USER.TIME.Q
DECLARE long STATUS.L, CONVERT.FLAGS%, LOCAL.CONTEXT%, INPUT.FORMAT%
MAP (MDCOM) long MD.CONTEXT.L
ON ERROR GO BACK
A% = CTRLC
!
!=====================|
! M a i n l i n e |
!=====================|
!
! If a blank date or a date of all 0's is passed in, return
! a quad date of 0,0
!
LOCAL.D$ = D$
IF LOCAL.D$ <= '00000000' THEN
User.time.q::D(0%) = 0%
User.time.q::D(1%) = 0%
fn_MDSIN = USER.TIME.Q
EXIT FUNCTION
END IF
!
! Initialize input format
!
INPUT.FORMAT% = LIB$K_INPUT_FORMAT
LOCAL.CONTEXT% = MD.CONTEXT.L
print "calling init_date_time_context" ! trace
print md.context.l
DATE.FORMAT$ = '|!Y4!MN0!D0 !H04:!M0:!S0.!C2|'
PRINT "LIB$K_INPUT_FORMAT "; INPUT.FORMAT%
STATUS.L = LIB$INIT_DATE_TIME_CONTEXT &
(LOCAL.CONTEXT% BY REF, INPUT.FORMAT% BY REF, &
DATE.FORMAT$ BY DESC)
PRINT "RETURN FROM INIT_DATE..."
print local.context%
MD.CONTEXT.L = LOCAL.CONTEXT%
IF STATUS.L <> SS$_NORMAL THEN
CALL LIB$SYS_GETMSG (STATUS.L, , SMG.ERT$)
CAUSE ERROR 194%
END IF
!
! Do the conversion
!
CONVERT.FLAGS% = 8% + 16% + 32% + 64%
print "calling convert_date_string" ! trace
STATUS.L = LIB$CONVERT_DATE_STRING &
(LOCAL.D$ BY DESC, USER.TIME.Q BY REF, LOCAL.CONTEXT% BY REF, &
CONVERT.FLAGS% BY REF)
MD.CONTEXT.L = LOCAL.CONTEXT%
IF STATUS.L <> SS$_NORMAL THEN
CALL LIB$SYS_GETMSG (STATUS.L, , SMG.ERT$)
CAUSE ERROR 194%
END IF
fn_MDSIN = USER.TIME.Q
END FUNCTION
$ !
$ create minit.bas
1 SUB MINIT (CHANNEL%)
OPTION &
TYPE = REAL &
, SIZE = (REAL DOUBLE, INTEGER WORD) &
, SCALE = 0
!
! L o c a l S t o r a g e
!
DECLARE LONG P.STATUS &
, NORMAL, BOLD, REVERSE, BLINK, UNDERLINE, DISPLAY, PASTEBOARD
EXTERNAL LONG FUNCTION &
LIB$SYS_GETMSG
EXTERNAL LONG CONSTANT SS$_NORMAL
!
! ENSURE: ANSI MODE, G0 CHARACTER SET
!
PRINT ESC; '<'; SI;
!
! Open keyboard on channel KB.CHANNEL%, disable echo,
! and discard any pending type ahead.
!
OPEN 'TT:' AS FILE CHANNEL%
SUBEXIT
32767 SUBEND
$ !
$ create pchek.bas
1 !======================================|
! P C H E K |
OPTION TYPE = REAL &
, SIZE = (REAL DOUBLE, INTEGER WORD) &
, SCALE = 0
!
! I N I T I A L I Z E
!
%INCLUDE 'MA:DATEFN.BAS'
CALL MINIT (2%)
MD.CONTEXT.L = '0'L
CALL PCHEK0 (ERROR%)
32767 END
$ !
$ create pchek0.bas
1 SUB PCHEK0 (ERROR%)
OPTION TYPE = REAL &
, SIZE = (REAL DOUBLE, INTEGER WORD) &
, SCALE = 0
!
! Date functions
!
%INCLUDE 'MA:DATEFN.BAS'
PM.START.DATE$ = '19970318'
PM.END.DATE$ = '19970331'
1050 START.DATE$ = fn_MDLOUT (fn_MDSIN ('19970318'))
PRINT "Date to convert: 19970331" ! TRACE
QUAD.DATE.Q = fn_MDSIN('19970331')
END.DATE$ = fn_MDLOUT (QUAD.DATE.Q)
PRINT 'Converted date: '; END.DATE$ ! trace
1052 START.DATE$ = fn_MDLOUT (fn_MDSIN (PM.START.DATE$))
1053 PRINT "Date to convert: "; PM.END.DATE$ ! TRACE
1054 QUAD.DATE.Q = fn_MDSIN(PM.END.DATE$)
1055 END.DATE$ = fn_MDLOUT (QUAD.DATE.Q)
1056 PRINT 'Converted date: '; END.DATE$ ! trace
32767 END SUB
$ !
$ def = f$parse("",,,"DEVICE") + f$parse("",,,"DIRECTORY")
$ define ma 'def
$ WRITE SYS$OUTPUT "***Compile"
$ !
$ basic := basic/debug/noopt
$ BASIC PCHEK0.BAS
$ BASIC PCHEK.BAS
$ BASIC FN_MDSIN.BAS
$ BASIC FN_MDLOUT.BAS
$ BASIC MINIT.BAS
$ !
$ WRITE SYS$OUTPUT "***Link image PCHEK.EXE"
$ !
$ LINK/DEBUG PCHEK,PCHEK0,FN_MDSIN,FN_MDLOUT,MINIT
$ EXIT
T.R | Title | User | Personal Name | Date | Lines |
---|
204.1 | LIBRTL change? | GIDDAY::GILLINGS | a crucible of informative mistakes | Tue Apr 01 1997 02:35 | 20 |
| > I also
> tried this with DEC$BASRTL.EXE from a V7.1 system on V6.2 and it
> did not fail, so does not look like a RTL/Compiler issue.
I'm not so sure about this. I compiled and linked on OpenVMS V6.1, no
errors when run. Execute the same image under V7.1 and I get the ACCVIO.
Sure sounds like RTL involvement to me. It may not be DEC$BASRTL though,
perhaps LIBRTL? Remember there were some changes in LIBRTL for V7.1,
especially in the time routines (can you spell 10K?). Note that you can't
run against a V7.1 LIBRTL on a lower version of OpenVMS so it's not
easy to test the theory. I wouldn't discount a coding error just yet
though.
First thing I'd suggest is to clean up the code. For a start, get rid of
all the variable names with "."s in them. Very confusing! I'd also
double check all the data types. I'd also be a bit suspicious of the
dynamic strings. Might be worth replacing them with static strings to
one by one to see if it makes a difference.
John Gillings, Sydney CSC
|