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