Data+without+DATA

//By JGH, May-2006.// 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: code format="bb4w" 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 code 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 **LOCAL**ised

You can avoid the **DATA** pointer being modified by doing the following:

code format="bb4w" DIM mon$(12) mon$ = "","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" code but the data is still held in memory twice.

An alternative for small bits of fixed data like this is to hold them in a string: code format="bb4w" DEF FNmon(mon%)=MID$("JanFebMarAprMayJunJulAugSepOctNovDec",mon%*3-2,3) code 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: code format="bb4w" DEF FNmonth(mon%) \ \ =MID$("JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember", \      \ VALMID$("010816212629333743525967",mon%*2-1,2), \       \ VALMID$("785534469788",mon%,1)) code 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.