String space in BASICs

General discussions related to the Altair 8800 Clone

String space in BASICs

Postby mail@gabrielegan.com » 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


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
mail@gabrielegan.com
 
Posts: 104
Joined: October 11th, 2014, 8:12 am

Re: String space in BASICs

Postby toml_12953 » October 13th, 2014, 1:22 pm

You only have 100 bytes of string space unless you use the CLEAR statement before allocating any strings. Try adding
Code: Select all
105 CLEAR 1000

to your program.
toml_12953
 
Posts: 297
Joined: June 7th, 2013, 12:54 pm

Re: String space in BASICs

Postby mail@gabrielegan.com » October 13th, 2014, 1:26 pm

Thanks, I'll give that a try.

Gabriel
mail@gabrielegan.com
 
Posts: 104
Joined: October 11th, 2014, 8:12 am

Re: String space in BASICs

Postby mail@gabrielegan.com » October 17th, 2014, 11:55 am

That worked! Thanks for educating me on this CLEAR statement.

Regards

Gabriel
mail@gabrielegan.com
 
Posts: 104
Joined: October 11th, 2014, 8:12 am


Return to General Discussions

Who is online

Users browsing this forum: No registered users and 14 guests

cron