String space in BASICs
Posted: October 13th, 2014, 11:58 am
Dear All
Does anyone know just how much "string space" is allocated in the various BASICs that work on the Altair 8800? I've got a fairly simple program, copied below, that runs of out string space if I add even one word to the DATA statements. Reducing the main array W$ to just 25 elements instead of 100 doesn't seem to help: the program still dies at line 230 trying to add a character to the word being built up (B$=B$+C$). I know it's not the most efficiently written program, but I'm surprised that it doesn't run under 8k BASIC, Extended BASIC, or Muti-User BASIC. Anyone spot the problem, or am I really asking for too much string space?
Regards
Gabriel Egan
Does anyone know just how much "string space" is allocated in the various BASICs that work on the Altair 8800? I've got a fairly simple program, copied below, that runs of out string space if I add even one word to the DATA statements. Reducing the main array W$ to just 25 elements instead of 100 doesn't seem to help: the program still dies at line 230 trying to add a character to the word being built up (B$=B$+C$). I know it's not the most efficiently written program, but I'm surprised that it doesn't run under 8k BASIC, Extended BASIC, or Muti-User BASIC. Anyone spot the problem, or am I really asking for too much string space?
Regards
Gabriel Egan
- Code: Select all
040 REM THIS PROGRAM GIVES A FREQUENCY COUNT OF WORDS IN A TEXT
050 REM W$(0-100) HOLDS THE LIST OF WORDS FOUND
055 REM AND W(0-100) HOLDS THE FREQS
060 REM P POINTS TO THE NEXT FREE SLOT IN W$
070 REM L$ IS A LINE READ IN
080 REM C$ IS A SINGLE CHARACTER PICKED OUT (L-R) FROM L$
090 REM C IS THE ASCII VALUE OF C$
100 REM B$ IS A WORD BEING BUILT UP FROM OCCURRENCES OF C$
110 DIM W$(100) :REM SET UP LIST OF WORDS FOUND
115 DIM W(100) :REM AND FREQ OF EACH ONE
120 LET P=0 :REM POINT TO START OF WORDS-FOUND LIST
130 LET B$="" :REM INITIALIZE HOLDER FOR GROWING A WORD
150 READ N :REM MANY LINES IN OUR TEXT?
160 FOR I = 1 TO N :REM HERE BEGINS LOOP FOR READING LINES
170 READ L$ :REM GET A LINE
180 LET Q=1 :REM WE HAVE LINE, LET'S POINT TO ITS FIRST CHARACTER
190 LET C$ = MID$(L$,Q,1) :REM PULL OUT A CHARACTER
200 LET C = ASC(C$) :REM GET ITS ASCII VALUE TO TEST
210 PRINT "<"; C$; ">"; :REM SPIT OUT THIS CHARACTER
220 IF NOT ((C=>65 AND C<=90) OR (C=>97 AND C<=122)) THEN PRINT "non-letter" : GOSUB 700 :REM IF IT'S NOT A-Za-z THEN WE'VE GOT TO WORD-ENDING PUNCTUATION
230 IF ((C=>65 AND C<=90) OR (C=>97 AND C<=122)) THEN LET B$ = B$+C$ : PRINT "letter" :REM IF IT'S A-Za-z THEN TACK IT ONTO OUR GROWING WORD
410 IF Q<LEN(L$) THEN Q=Q+1 : GOTO 190 :REM IF PRESENT LINE NOT EXHAUSTED GO BACK FOR NEXT CHARACTER
440 GOSUB 700 :REM WE'RE AT LINE-END SO SPIT OUT LAST WORD ON LINE (EVEN THOUGH NOT WORD-ENDING PUNCTUATION, \n TAKES ITS PLACE)
450 NEXT I :REM GO BACK FOR NEXT LINE
460 INPUT Y$ :REM JUST A PAUSE
490 :REM LIST PRINT OUT OUR LIST OF WORDS AND FREQS
500 FOR J = 0 TO P-1 :REM RANGE THROUGH THE WORD LIST (SINCE P IS NEXT-FREE-SLOT WE STOP ONE EARLIER)
510 PRINT W$(J), W(J) :REM PRINT A WORD AND ITS FREQ
520 NEXT J :REM GO BACK FOR NEXT PAIR
525 INPUT Y$ :REM JUST A PAUSE
530 :REM NOW LET'S ALPHABETISE THE WORD LIST
540 FOR L = 0 TO P-1 :REM BUBBLE SORTS NEED TWO PASSES (P-1 IS LAST WORD'S INDEX)
550 FOR M = 0 TO P-2 :REM THE SECOND STOPPING ONE SHORT OF LAST WORD
560 IF W$(M) < W$(M+1) THEN GOTO 630 :REM SKIP SWAP IF NOT NEEDED
570 LET T=W(M) :REM ELSE DO SWAP OF WORD+FREQ
580 LET T$=W$(M) :REM BY TAKING A TEMPORARY COPY OF Mth WORD+FREQ
590 LET W(M) = W(M+1) :REM MAKE Mth WORD+FREQ TAKE THE VALUE OF . . .
600 LET W$(M) = W$(M+1) :REM . . . THE Mth+1 WORD+FREQ
610 LET W(M+1) = T :REM THEN PUT TEMP COPY IN Mth+1 WORD+FREQ
620 LET W$(M+1) = T$
630 NEXT M :REM ROUND FOR ANOTHER PASS
640 NEXT L :REM AND ANOTHER, AS BUBBLE SORTS DO
650 FOR Q = 0 TO P-1 :REM RANGE THROUGH THE WORD LIST (P-1 BEING INDEX OF THE LAST WORD)
660 PRINT W$(Q), W(Q) :REM PRINT ARRAY OF WORDS,
670 NEXT Q :REM LISTING THEIR FREQUENCIES
680 PRINT "_____ENDS____"
690 STOP
700 :REM SUBROUTINE FOR WHEN WE HAVE A WORD-ENDING PUNCTUATION
710 IF B$="" THEN RETURN :REM IF ACTUALLY JUST A WORD-STARTING BRACE (SINCE NO WORD BUILT UP YET), GET OUT
720 PRINT "Word: <"; B$; ">" :REM YEP, WE HAVE A WORD SO PRINT IT
730 LET K = 0 :REM CHECK IF WE'VE SEEN THIS WORD BEFORE BY CYCLING THRU WORD LIST
740 IF W$(K)=B$ THEN W(K)=W(K)+1 : B$="" : RETURN :REM IF WE HAVE, INCREMENT FREQ, CLEAR OUT WORD VARIABLE, RETURN
750 LET K = K + 1 :REM ELSE TRY NEXT WORD IN LIST
760 IF K<P THEN GOTO 740 :REM IF WE HAVEN'T REACHED BOTTOM OF W$ GO BACK AND TRY NEXT SLOT
770 W$(P) = B$ :REM WE HAVE REACHED BOTTOM, SO THIS IS A NEW WORD TO ADD TO END OF W$
780 W(P) = 1 :REM WITH A FREQ OF 1
790 LET P=P+1 :REM MOVE END-OF-LIST POINTER DOWN 1
800 B$="" :REM CLEAR OUT THE VARIABLE
830 RETURN
900 DATA 3
910 DATA "(Sir) Walter Elliot, of Kellynch Hall, in his own Somersetshire, was a man who"
920 DATA "for his own amusement, and never took up any book but his own the Baronetage;"
930 DATA "there he found and his the occupation for an idle his hour, (and) consolation-in (a)"
999 END