Difference between revisions of "Data without DATA"
m (1 revision) |
m |
||
(One intermediate revision by one other user not shown) | |||
Line 1: | Line 1: | ||
− | [[Category:BASIC]] | + | [[Category:BASIC]][[Category:Programming tips]] |
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: | 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) | DIM mon$(12) |
Latest revision as of 21:16, 3 July 2016
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