38. Hľadanie chýb: ERR, ERL, TRACE, *B, *F, *L

Na čo to je

Program, ktorý sa preloží, ešte nemusí robiť, čo má. Turbo-BASIC XL má niekoľko pomôcok, ktoré pomáhajú zistiť, kadiaľ program ide a čo sa pokazilo.

Ako sa to píše

ZápisČo robí
ERRfunkcia: číslo poslednej chyby (to isté ako PEEK(195))
ERLfunkcia: riadok, na ktorom nastala
TRACEzapne stopovanie: pred každým riadkom sa vypíše jeho číslo v hranatých zátvorkách
TRACE -vypne stopovanie
*Bkláves BREAK sa dá zachytiť cez TRAP ako chyba 128
*B -BREAK program zastaví ako zvyčajne
*Fslučka FOR, ktorej začiatok je už za koncom, sa nevykoná ani raz
*F -FOR sa správa ako v Atari BASICu: telo prebehne aspoň raz
*L, *L -zapína a vypína odsadzovanie výpisu v editore – v preloženom programe nemá čo robiť

Celý program

Súbor examples/debug.tbas:

Turbo Basic XL
10 REM TRACE, ERR and ERL
20 TRACE
30 FOR I=1 TO 3
40   S=S+I
50 NEXT I
60 TRACE -
70 PRINT
80 PRINT "Sum ";S
90 TRAP #FAULT
100 DIM A(5)
110 FOR I=4 TO 7:A(I)=I*I:NEXT I
120 END
130 # FAULT
140 PRINT "Error ";ERR;" at line ";ERL;", I was ";I

Preklad a spustenie

Basic26 debug.tbas --sim

Čo uvidíš

[30][40][50][40][50][40][50][60]
Sum 6
Error 9 at line 110, I was 6

Ako to funguje

Stopa spomaľuje a zaplní obrazovku, preto sa zapína len okolo podozrivého miesta.

*F: slučka, ktorá nemusí prebehnúť

V kapitole 10 bolo, že FOR I=5 TO 1 telo raz vykoná. S *F nie:

Turbo Basic XL
10 FOR I=5 TO 1:PRINT "once":NEXT I
20 *F
30 FOR I=5 TO 1:PRINT "never":NEXT I
40 PRINT "after, I=";I
once
after, I=5

Prvá slučka (bez *F) vypíše once, druhá sa preskočí celá. Je to rozumnejšie správanie a v nových programoch sa *F oplatí dať na začiatok; dobové programy však niekedy s jedným prechodom počítajú.

*B: BREAK ako chyba

Bežne kláves BREAK program zastaví s hlásením STOPPED AT LINE …. Po *B sa BREAK stane chybou číslo 128, ktorú zachytí TRAP. Program tak môže pred koncom upratať – zavrieť súbory, vypnúť zvuk – alebo BREAK úplne ignorovať:

Turbo Basic XL
10 *B
20 TRAP #BRK
30 DO:PRINT "Press BREAK ";:PAUSE 25:LOOP
40 # BRK
50 PRINT:PRINT "Break caught, error ";ERR

Čo patrilo editoru

DUMP (výpis všetkých premenných), RENUM (prečíslovanie riadkov), DEL (zmazanie riadkov) a *L sú príkazy editora Turbo-BASICu. V preloženom programe len vypíšu NOT IN COMP PRG, tak ako LIST v kapitole 25.

Pomôcky prekladača

Pri hľadaní chýb pomáha aj prekladač sám:

Viac v kapitole 39.

Časté chyby

Čo sa staloČo sa stane
TRACE ostal zapnutýobrazovka plná čísel v zátvorkách
ERR a ERL pred prvou chybousú 0
*F v programe, ktorý počíta s jedným prechodomslučka sa nevykoná a program sa správa inak
*B bez TRAPBREAK program zastaví ako vždy
obsluha chyby nevypíše ničchyba je „zjedená“ a program pokračuje s nezmyslami – pri ladení vždy vypíš aspoň ERR a ERL

Vyskúšaj si

  1. Zapni TRACE v programe menu.tbas z kapitoly 30 a sleduj, kadiaľ ide pri voľbe 1 a 2.
  2. Pridaj do debug.tbas na začiatok *F a zmeň slučku na riadku 30 na FOR I=3 TO 1. Aká bude stopa?
  3. Napíš obsluhu chyby, ktorá vypíše ERR, ERL a podľa čísla aj slovný popis aspoň pre chyby 3, 5, 8, 9 a 11.

Zhrnutie

Tým sa končí časť o Turbo-BASICu XL. Zvyšok knihy je o prekladači.

Späť: 37. Disketa · Ďalej: 39. Prekladač Basic26