Line number: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
m (Protected "Line number" ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)))
No edit summary
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
'''Line numbers''' or line labels are used in Qbasic as references to code lines. Numbers are required with [[GOTO]] and numbers or label names are required with [[GOSUB]]. Although not required in Qbasic, other older programming languages such as GW Basic often required them. Line labels require a colon after them to differentiate them from keywords and variable names.
'''Line numbers''' or line labels are used in QBasic as references to code lines. Numbers are required with [[GOTO]] and numbers or label names are required with [[GOSUB]]. Although not required in QBasic, other older programming languages such as GW Basic often required them. Line labels require a colon after them to differentiate them from keywords and variable names.




Line 5: Line 5:




The following program can remove line numbers where they are not required by [[IF...THEN]], [[GOTO]], [[GOSUB]], [[ERL]], [[RUN]] or [[RESUME]]:  
The following program can remove line numbers where they are not required by [[IF...THEN]], [[GOTO]], [[GOSUB]], [[ERL]], [[RUN]] or [[RESUME]]:
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|CLS}}
{{Cl|CLS}}
{{Cl|REDIM}} linenumber(100000)
{{Cl|REDIM}} linenumber(100000)
Line 19: Line 19:
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}(a$, {{Cl|CHR$}}(34)) <> 0 {{Cl|THEN}}
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}(a$, {{Cl|CHR$}}(34)) <> 0 {{Cl|THEN}}
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}({{Cl|INSTR}}(a$, {{Cl|CHR$}}(34)) + 1, a$, {{Cl|CHR$}}(34)) = 0 {{Cl|THEN}} {{Cl|EXIT DO}}: {{Cl|REM}} Mismatched quotes. Illegal code.
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}({{Cl|INSTR}}(a$, {{Cl|CHR$}}(34)) + 1, a$, {{Cl|CHR$}}(34)) = 0 {{Cl|THEN}} {{Cl|EXIT DO}}: {{Cl|REM}} Mismatched quotes. Illegal code.
a$ = {{Cl|MID$}}(a$, 1, {{Cl|INSTR}}(a$, {{Cl|CHR$}}(34)) - 1) + {{Cl|MID$}}(a$, {{Cl|INSTR}}({{Cl|INSTR}}(a$, {{Cl|CHR$}}(34)) + 1, a$, {{Cl|CHR$}}(34)) + 1)
a$ = {{Cl|MID$ (function)|MID$}}(a$, 1, {{Cl|INSTR}}(a$, {{Cl|CHR$}}(34)) - 1) + {{Cl|MID$ (function)|MID$}}(a$, {{Cl|INSTR}}({{Cl|INSTR}}(a$, {{Cl|CHR$}}(34)) + 1, a$, {{Cl|CHR$}}(34)) + 1)
{{Cl|ELSE}}
{{Cl|ELSE}}
{{Cl|EXIT DO}}
{{Cl|EXIT DO}}
Line 25: Line 25:
{{Cl|LOOP}}
{{Cl|LOOP}}


{{Cl|IF...THEN|IF}} {{Cl|INSTR}}({{Cl|UCASE$}}(a$), "{{Cl|REM}} ") <> 0 {{Cl|THEN}} a$ = {{Cl|MID$}}(a$, 1, {{Cl|INSTR}}({{Cl|UCASE$}}(a$), "{{Cl|REM}} "))
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}({{Cl|UCASE$}}(a$), "{{Cl|REM}} ") <> 0 {{Cl|THEN}} a$ = {{Cl|MID$ (function)|MID$}}(a$, 1, {{Cl|INSTR}}({{Cl|UCASE$}}(a$), "{{Cl|REM}} "))
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}({{Cl|UCASE$}}(a$), "' ") <> 0 {{Cl|THEN}} a$ = {{Cl|MID$}}(a$, 1, {{Cl|INSTR}}(a$, "' "))
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}({{Cl|UCASE$}}(a$), "' ") <> 0 {{Cl|THEN}} a$ = {{Cl|MID$ (function)|MID$}}(a$, 1, {{Cl|INSTR}}(a$, "' "))


DO
DO
Line 38: Line 38:
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}(a$, "{{Cl|RESUME}} ") <> 0 {{Cl|THEN}} flag = 1: n = {{Cl|INSTR}}(a$, "{{Cl|RESUME}} ") + 7: {{Cl|GOSUB}} tracknumber
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}(a$, "{{Cl|RESUME}} ") <> 0 {{Cl|THEN}} flag = 1: n = {{Cl|INSTR}}(a$, "{{Cl|RESUME}} ") + 7: {{Cl|GOSUB}} tracknumber
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}(a$, "{{Cl|RETURN}} ") <> 0 {{Cl|THEN}} flag = 1: n = {{Cl|INSTR}}(a$, "{{Cl|RETURN}} ") + 7: {{Cl|GOSUB}} tracknumber
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}(a$, "{{Cl|RETURN}} ") <> 0 {{Cl|THEN}} flag = 1: n = {{Cl|INSTR}}(a$, "{{Cl|RETURN}} ") + 7: {{Cl|GOSUB}} tracknumber
{{Cl|IF...THEN|IF}} flag = 0 {{Cl|THEN}} {{Cl|EXIT DO}} {{Cl|ELSE}} a$ = {{Cl|MID$}}(a$, n)
{{Cl|IF...THEN|IF}} flag = 0 {{Cl|THEN}} {{Cl|EXIT DO}} {{Cl|ELSE}} a$ = {{Cl|MID$ (function)|MID$}}(a$, n)
{{Cl|LOOP}}
{{Cl|LOOP}}
{{Cl|LOOP}}
{{Cl|LOOP}}
Line 49: Line 49:
{{Cl|LINE INPUT (file statement)|LINE INPUT}} #1, a$
{{Cl|LINE INPUT (file statement)|LINE INPUT}} #1, a$
flag = 0
flag = 0
{{Cl|IF...THEN|IF}} {{Cl|VAL}}({{Cl|MID$}}(a$, 1, 1)) <> 0 {{Cl|THEN}}
{{Cl|IF...THEN|IF}} {{Cl|VAL}}({{Cl|MID$ (function)|MID$}}(a$, 1, 1)) <> 0 {{Cl|THEN}}
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} count
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} count
{{Cl|IF...THEN|IF}} {{Cl|VAL}}(a$) = linenumber(i) {{Cl|THEN}} flag = 1: {{Cl|EXIT}} {{Cl|FOR...NEXT|FOR}}
{{Cl|IF...THEN|IF}} {{Cl|VAL}}(a$) = linenumber(i) {{Cl|THEN}} flag = 1: {{Cl|EXIT}} {{Cl|FOR...NEXT|FOR}}
{{Cl|NEXT}}
{{Cl|NEXT}}
{{Cl|IF...THEN|IF}} flag = 0 {{Cl|THEN}} a$ = {{Cl|MID$}}(a$, {{Cl|INSTR}}(a$, " ") + 1)
{{Cl|IF...THEN|IF}} flag = 0 {{Cl|THEN}} a$ = {{Cl|MID$ (function)|MID$}}(a$, {{Cl|INSTR}}(a$, " ") + 1)
{{Cl|END IF}}
{{Cl|END IF}}
{{Cl|PRINT (file statement)|PRINT}} #2, a$
{{Cl|PRINT (file statement)|PRINT}} #2, a$
Line 77: Line 77:
{{Cl|CASE}} "Y"
{{Cl|CASE}} "Y"
{{Cl|ON ERROR}} {{Cl|GOTO}} resnxt
{{Cl|ON ERROR}} {{Cl|GOTO}} resnxt
{{Cl|KILL}} {{Cl|MID$}}(filename$, 1, {{Cl|INSTR}}(filename$, ".") - 1) + ".org"
{{Cl|KILL}} {{Cl|MID$ (function)|MID$}}(filename$, 1, {{Cl|INSTR}}(filename$, ".") - 1) + ".org"
{{Cl|ON ERROR}} {{Cl|GOTO}} 0
{{Cl|ON ERROR}} {{Cl|GOTO}} 0
{{Cl|NAME}} filename$ {{Cl|AS}} {{Cl|MID$}}(filename$, 1, {{Cl|INSTR}}(filename$, ".") - 1) + ".org"
{{Cl|NAME}} filename$ {{Cl|AS}} {{Cl|MID$ (function)|MID$}}(filename$, 1, {{Cl|INSTR}}(filename$, ".") - 1) + ".org"
{{Cl|NAME}} "filename.tmp" {{Cl|AS}} filename$
{{Cl|NAME}} "filename.tmp" {{Cl|AS}} filename$
{{Cl|PRINT}} : {{Cl|PRINT}} "File conversion completed. Press any key to end."
{{Cl|PRINT}} : {{Cl|PRINT}} "File conversion completed. Press any key to end."
Line 91: Line 91:
DO
DO
count = count + 1
count = count + 1
linenumber(count) = {{Cl|VAL}}({{Cl|MID$}}(a$, n))
linenumber(count) = {{Cl|VAL}}({{Cl|MID$ (function)|MID$}}(a$, n))
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}(a$, "ON") <> 0 {{Cl|AND (boolean)|AND}} {{Cl|INSTR}}(a$, "{{Cl|GOSUB}}") <> 0 {{Cl|OR (boolean)|OR}} {{Cl|INSTR}}(a$, "ON") <> 0 {{Cl|AND (boolean)|AND}} {{Cl|INSTR}}(a$, "{{Cl|GOTO}}") <> 0 {{Cl|THEN}}
{{Cl|IF...THEN|IF}} {{Cl|INSTR}}(a$, "ON") <> 0 {{Cl|AND (boolean)|AND}} {{Cl|INSTR}}(a$, "{{Cl|GOSUB}}") <> 0 {{Cl|OR (boolean)|OR}} {{Cl|INSTR}}(a$, "ON") <> 0 {{Cl|AND (boolean)|AND}} {{Cl|INSTR}}(a$, "{{Cl|GOTO}}") <> 0 {{Cl|THEN}}
{{Cl|FOR...NEXT|FOR}} i = n {{Cl|TO}} {{Cl|LEN}}(a$)
{{Cl|FOR...NEXT|FOR}} i = n {{Cl|TO}} {{Cl|LEN}}(a$)
{{Cl|IF...THEN|IF}} {{Cl|VAL}}({{Cl|MID$}}(a$, i, 1)) = 0 {{Cl|AND (boolean)|AND}} {{Cl|MID$}}(a$, i, 1) <> "0" {{Cl|AND (boolean)|AND}} {{Cl|MID$}}(a$, i, 1) <> "," {{Cl|AND (boolean)|AND}} {{Cl|MID$}}(a$, i, 1) <> " " {{Cl|THEN}} {{Cl|EXIT}} {{Cl|FOR...NEXT|FOR}}
{{Cl|IF...THEN|IF}} {{Cl|VAL}}({{Cl|MID$ (function)|MID$}}(a$, i, 1)) = 0 {{Cl|AND (boolean)|AND}} {{Cl|MID$ (function)|MID$}}(a$, i, 1) <> "0" {{Cl|AND (boolean)|AND}} {{Cl|MID$ (function)|MID$}}(a$, i, 1) <> "," {{Cl|AND (boolean)|AND}} {{Cl|MID$ (function)|MID$}}(a$, i, 1) <> " " {{Cl|THEN}} {{Cl|EXIT}} {{Cl|FOR...NEXT|FOR}}
{{Cl|IF...THEN|IF}} {{Cl|MID$}}(a$, i, 2) = ", " {{Cl|THEN}} n = i + 1: {{Cl|EXIT}} {{Cl|FOR...NEXT|FOR}}
{{Cl|IF...THEN|IF}} {{Cl|MID$ (function)|MID$}}(a$, i, 2) = ", " {{Cl|THEN}} n = i + 1: {{Cl|EXIT}} {{Cl|FOR...NEXT|FOR}}
{{Cl|NEXT}}
{{Cl|NEXT}}
{{Cl|IF...THEN|IF}} n <> i + 1 {{Cl|THEN}} {{Cl|EXIT DO}}
{{Cl|IF...THEN|IF}} n <> i + 1 {{Cl|THEN}} {{Cl|EXIT DO}}
Line 105: Line 105:


resnxt:
resnxt:
{{Cl|RESUME|RESUME NEXT}} '' ''
{{Cl|RESUME|RESUME NEXT}}
{{CodeEnd}}
{{CodeEnd}}
{{small|Code courtesy of Pete from the Network 54 Qbasic Forum}}
{{Small|Code courtesy of Pete}}




''See also:''
{{PageSeeAlso}}
* [[GOTO]] , [[RUN]]
* [[GOTO]] , [[RUN]]
* [[GOSUB]] , [[RETURN]]
* [[GOSUB]] , [[RETURN]]
Line 117: Line 117:
* [[IF...THEN]]
* [[IF...THEN]]


{{PageNavigation}}
 
{{PageReferences}}

Latest revision as of 13:23, 19 November 2024

Line numbers or line labels are used in QBasic as references to code lines. Numbers are required with GOTO and numbers or label names are required with GOSUB. Although not required in QBasic, other older programming languages such as GW Basic often required them. Line labels require a colon after them to differentiate them from keywords and variable names.


Microsoft's REMLINE.BAS program removes unnecessary line numbers


The following program can remove line numbers where they are not required by IF...THEN, GOTO, GOSUB, ERL, RUN or RESUME:

CLS
REDIM linenumber(100000)
PRINT "This Program removes unnecessary line numbers.": PRINT
INPUT "Name of file: ", filename$: PRINT

OPEN filename$ FOR INPUT AS #1
DO UNTIL EOF(1)
LINE INPUT #1, a$
REM Get rid of quotes and REM statements.
DO
IF INSTR(a$, CHR$(34)) <> 0 THEN
IF INSTR(INSTR(a$, CHR$(34)) + 1, a$, CHR$(34)) = 0 THEN EXIT DO: REM Mismatched quotes. Illegal code.
a$ = MID$(a$, 1, INSTR(a$, CHR$(34)) - 1) + MID$(a$, INSTR(INSTR(a$, CHR$(34)) + 1, a$, CHR$(34)) + 1)
ELSE
EXIT DO
END IF
LOOP

IF INSTR(UCASE$(a$), "REM ") <> 0 THEN a$ = MID$(a$, 1, INSTR(UCASE$(a$), "REM "))
IF INSTR(UCASE$(a$), "' ") <> 0 THEN a$ = MID$(a$, 1, INSTR(a$, "' "))

DO
flag = 0
REM Break down compound statements and get line numbers.
IF INSTR(a$, "GOTO ") <> 0 THEN flag = 1: n = INSTR(a$, "GOTO ") + 5: GOSUB tracknumber
IF INSTR(a$, "GOSUB ") <> 0 THEN flag = 1: n = INSTR(a$, "GOSUB ") + 6: GOSUB tracknumber
IF INSTR(a$, "THEN ") <> 0 THEN flag = 1: n = INSTR(a$, "THEN ") + 5: GOSUB tracknumber
IF INSTR(a$, "ELSE ") <> 0 THEN flag = 1: n = INSTR(a$, "ELSE ") + 5: GOSUB tracknumber
IF INSTR(a$, "RUN ") <> 0 THEN flag = 1: n = INSTR(a$, "RUN ") + 4: GOSUB tracknumber
IF INSTR(a$, "RESUME ") <> 0 THEN flag = 1: n = INSTR(a$, "RESUME ") + 7: GOSUB tracknumber
IF INSTR(a$, "RETURN ") <> 0 THEN flag = 1: n = INSTR(a$, "RETURN ") + 7: GOSUB tracknumber
IF flag = 0 THEN EXIT DO ELSE a$ = MID$(a$, n)
LOOP
LOOP
PRINT "Number of line-numbered statements kept:"; count
CLOSE #1

OPEN filename$ FOR INPUT AS #1
OPEN "filename.tmp" FOR OUTPUT AS #2
DO UNTIL EOF(1)
LINE INPUT #1, a$
flag = 0
IF VAL(MID$(a$, 1, 1)) <> 0 THEN
FOR i = 1 TO count
IF VAL(a$) = linenumber(i) THEN flag = 1: EXIT FOR
NEXT
IF flag = 0 THEN a$ = MID$(a$, INSTR(a$, " ") + 1)
END IF
PRINT #2, a$
LOOP
CLOSE #1, #2
SHELL _DONTWAIT "notepad filename.tmp"
PRINT
PRINT "Back up original file as .org and give edited file original file name? [Y/N]"
DO
b$ = UCASE$(INKEY$)
SELECT CASE b$
CASE CHR$(27): SYSTEM
CASE "N"
ON ERROR GOTO RESNXT
KILL "filename.tmp"
ON ERROR GOTO 0
PRINT
PRINT "Temporary "+ CHR$(34) + "filename.tmp" + CHR$(34) + " was removed and no changes were made to original file."
PRINT
PRINT "Press any key to end."
EXIT DO

CASE "Y"
ON ERROR GOTO resnxt
KILL MID$(filename$, 1, INSTR(filename$, ".") - 1) + ".org"
ON ERROR GOTO 0
NAME filename$ AS MID$(filename$, 1, INSTR(filename$, ".") - 1) + ".org"
NAME "filename.tmp" AS filename$
PRINT : PRINT "File conversion completed. Press any key to end."
EXIT DO
END SELECT
LOOP
SLEEP
SYSTEM

tracknumber:
DO
count = count + 1
linenumber(count) = VAL(MID$(a$, n))
IF INSTR(a$, "ON") <> 0 AND INSTR(a$, "GOSUB") <> 0 OR INSTR(a$, "ON") <> 0 AND INSTR(a$, "GOTO") <> 0 THEN
FOR i = n TO LEN(a$)
IF VAL(MID$(a$, i, 1)) = 0 AND MID$(a$, i, 1) <> "0" AND MID$(a$, i, 1) <> "," AND MID$(a$, i, 1) <> " " THEN EXIT FOR
IF MID$(a$, i, 2) = ", " THEN n = i + 1: EXIT FOR
NEXT
IF n <> i + 1 THEN EXIT DO
ELSE
EXIT DO
END IF
LOOP
RETURN

resnxt:
RESUME NEXT
Code courtesy of Pete


See also


QB64 Programming References

Wiki Pages
Main Page with Articles and Tutorials
QB64 specific keywords (alphabetical)
Original QBasic keywords (alphabetical)
QB64 OpenGL keywords (alphabetical)
Keywords by Usage
Got a question about something?
Frequently Asked Questions about QB64
QB64 Phoenix Edition Community Forum
Links to other QBasic Sites:
Pete's QBasic Forum
Pete's QBasic Downloads