Data without DATA

From BeebWiki
Revision as of 23:32, 22 June 2007 by Jgharston (talk)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

It is common for programs to put commonly used data in DATA statements which are then read into a set a variables at startup. A classic example is the names of months:

     DIM mon$(12)
     RESTORE
     FOR mon%=1 TO 12:READ mon$(mon%):NEXT mon%
     DATA Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec

This has a few immediate disadvantages:

  • The data is held in memory twice, in the program itself, and in mon$()
  • The DATA pointer is modified, unless LOCALised, with BASIC V

You can avoid the DATA pointer being modified by holding small bits of fixed data like this in a string:

     DEF FNmon(mon%)=MID$("JanFebMarAprMayJunJulAugSepOctNovDec",mon%*3-2,3)

This has several advantages:

  • The data string only occurs in the memory once
  • The DATA pointer is not affected

This can even be done for data that at first sight doesn't look like fixed data:

     DEF FNmonth(mon%) 
     =MID$("JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember", 
     VALMID$("010816212629333743525967",mon%*2-1,2), 
     VALMID$("785534469788",mon%,1))

Note that the above code should by typed all on one line. The first VALMID$ string is a series of initial start positions of the month name strings for each month. The second VALMID$ string is the length of each month name. Note: the example functions only give valid results for valid month numbers. By JGH, May 2006