esb_dbg
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* ES-BASIC (ver.0.2b時点) でのデバッグ機能について
-(by [[K]], 2020.05.16)
** (0) はじめに
-ES-BASICは簡易デバック機能があります。その活用事例を紹介...
** (1) オーバーフロー自動検出の例
-数学には組み合わせ数の計算としてコンビネーションという計...
-そのコンビネーションを使って 20C10 の値を計算してみたい...
-これは
(20*19*18*17*16*15*14*13*12*11)/(10*9*8*7*6*5*4*3*2*1)
-で計算できる値です。
-これが実際どんな値になるのかというと 184756 になります。
--適当に検索して見つけた http://cute.sh/solairo/p_c/c_01....
-当然ですがこの結果は32ビット整数に余裕で収まる値です。
-ということで、32ビット版のES-BASIC(esbasic32.exe)でも...
1000 A=1
1010 FOR I=11,20
1020 A=A*I
1030 NEXT
1040 B=1
1050 FOR I= 1,10
1060 B=B*I
1070 NEXT
1080 PRINT "20C10=",A/B
-というプログラムを書いてみました。
-そして実行しました。出てきた結果は・・・
Ok
RUN
20C10=117
Ok
-となってしまいます!・・・はい、おかしいですね。見事にバ...
--ちなみに、32ビットのC言語で同じアルゴリズムで計算しても...
----
-さてこんな時、ES-BASICではどうするのでしょうか。はい、LW...
--LWAIT命令は、line-waitという意味で、つまり1行実行するご...
--実行が速すぎて何が起きているのかよくわからなくなった時...
-ということで、実行速度を下げてから再度RUNしてみます。
Ok
LWAIT 0
Ok
RUN
exectime error
break in 1020
Ok
-お、なんかエラーで止まってくれました。実行時エラーです。...
--LWAIT 0 は行ウェイトが0で減速しないのですが、デバッグ機...
-どのくらい実行してから止まったのか、まずはそこを観察して...
Ok
LINECOUNTER
0000000000000001 1000 A=1
0000000000000001 1010 FOR I=11,20
0000000000000009 1020 A=A*I
0000000000000008 1030 NEXT
0000000000000000 1040 B=1
0000000000000000 1050 FOR I= 1,10
0000000000000000 1060 B=B*I
0000000000000000 1070 NEXT
0000000000000000 1080 PRINT "20C10=",A/B
Ok
-おお、1010~1030のFORループの途中で死んでしまったようで...
Ok
PRINT A,,I
1764322560 19
Ok
-なるほどー。どうやらA=176432250でI=19のときに、A*Iを計算...
--[註] 11*12*13*14*15*16*17*18 は 176432250 になりますの...
-ということで、簡単にバグ原因を突き止めることができました...
----
-[Q] 最初から LWAIT 0 にしておけば、もっと早くこのバグに...
--[A] 全くその通りです。だからデフォルトを LWAIT 0 にして...
--しかし私は、スピード狂でもあるので(笑)、しょっちゅう ...
-[Q] 64bit版のES-BASICでは問題なく正しい答えがでてしまう...
--[A] 64bit版のES-BASICは64bit整数を使っているので、問題...
--ここで32bitのES-BASICを例に出したのは、32bit版なら64bit...
-[Q] 64bit版のES-BASICでも、結果が64bit整数に収まらないよ...
--[A] はい、LWAIT 0 以上であれば、ちゃんと教えてくれます。
-[Q] 場合によってはオーバーフローしても無視して続行させた...
--[A] はい。そういうこともあると思って、「 LWAIT 0 以上で...
** (2) 無限ループに陥ってしまった場合の例
-これは私が[[esbasic02a]]の(5-4)の迷路作成プログラムを作...
1000 $RANDSEED=1; GETARG $RANDSEED
1005 ALIAS XY:R03, T:R06; // これを付けるとサイズを小さ...
1010 ARY INT NEW A[1504]
1020 FOR T=0,1503; A[T]=1; NEXT
1030 A[33]=0; // 1<<5|1 // 左上に一つだけ穴をあける
1040 FOR I=0,1000000
1050 X=(RAND%23)*2+1
1060 Y=(RAND%15)*2+1
1070 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
1080 DOLOOP
1090 D0=0; D1=0; D2=0; D3=0
1100 IF X<45 THEN D0=A[XY+32]; T=A[XY+64]; D0=D0&T...
1110 IF X> 1 THEN D1=A[XY-32]; T=A[XY-64]; D1=D1&T...
1120 IF Y<29 THEN D2=A[XY+ 1]; T=A[XY+ 2]; D2=D2&T...
1130 IF Y> 1 THEN D3=A[XY- 1]; T=A[XY- 2]; D3=D3&T...
1140 T=D0+D1+D2+D3
1150 IF T==0 GOTO BRK; D=T
1160 T=RAND%D
1170 IF D0!=0 THEN IF T==0 THEN A[XY+32]=0; X=X+2;...
1180 IF D1!=0 THEN IF T==0 THEN A[XY-32]=0; X=X-2;...
1180 IF D2!=0 THEN IF T==0 THEN A[XY+ 1]=0; Y=Y+2;...
1200 IF D3!=0 THEN IF T==0 THEN A[XY- 1]=0; Y=Y-2;...
1210 XY=X<<5|Y; A[XY]=0;
1220 ENDDO
1230 FI
1240 BRK:
1250 NEXT
1260 FOR Y=0,30
1270 FOR X=0,46
1280 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
1290 PRINTF " "
1300 ELSE
1310 PRINTF "##"
1320 FI
1330 NEXT
1340 PRINTF "\n"
1350 NEXT
-一見するとどこも間違っているようには見えません。
-それなのに実行すると・・・迷路は出力されず、無限ループっ...
----
-さてどうしましょう。はい、 LWAIT 0 にして実行することに...
-それでも当然ですが無限ループすることに変わりはありません...
Ok
RUN
pause in 1110
(Ok)
-なんか変なプロンプトが出ました。これはプログラムを一時的...
-まずは毎度の LINECONTER コマンドです。
(Ok)
LINECOUNTER
0000000000000001 1000 $RANDSEED=1; GETARG $RANDSEED
0000000000000001 1005 ALIAS XY:R03, T:R06; // これを付...
0000000000000001 1010 ARY INT NEW A[1504]
0000000000000001 1020 FOR T=0,1503; A[T]=1; NEXT
0000000000000001 1030 A[33]=0; // 1<<5|1 // 左上に一つ...
0000000000000001 1040 FOR I=0,1000000
0000000000000187 1050 X=(RAND%23)*2+1
0000000000000187 1060 Y=(RAND%15)*2+1
0000000000000187 1070 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
0000000000000002 1080 DOLOOP
000000000197887b 1090 D0=0; D1=0; D2=0; D3=0
000000000197887b 1100 IF X<45 THEN D0=A[XY+32]; T...
000000000197887b 1110 IF X> 1 THEN D1=A[XY-32]; T...
000000000197887a 1120 IF Y<29 THEN D2=A[XY+ 1]; T...
000000000197887a 1130 IF Y> 1 THEN D3=A[XY- 1]; T...
000000000197887a 1140 T=D0+D1+D2+D3
000000000197887a 1150 IF T==0 GOTO BRK; D=T
0000000001978879 1160 T=RAND%D
0000000001978879 1170 IF D0!=0 THEN IF T==0 THEN ...
0000000001978879 1180 IF D2!=0 THEN IF T==0 THEN ...
0000000001978879 1200 IF D3!=0 THEN IF T==0 THEN ...
0000000001978879 1210 XY=X<<5|Y; A[XY]=0;
0000000001978879 1220 ENDDO
0000000000000000 1230 FI
0000000000000185 1240 BRK:
0000000000000186 1250 NEXT
0000000000000000 1260 FOR Y=0,30
0000000000000000 1270 FOR X=0,46
0000000000000000 1280 XY=X<<5|Y; T=A[XY]; IF T==0 T...
0000000000000000 1290 PRINTF " "
0000000000000000 1300 ELSE
0000000000000000 1310 PRINTF "##"
0000000000000000 1320 FI
0000000000000000 1330 NEXT
0000000000000000 1340 PRINTF "\n"
0000000000000000 1350 NEXT
(Ok)
-言い忘れましたが、 LINECOUNTER のカウンタは16進数表示に...
-でもこれだけでは無限ループなのかどうかいまいち判断できま...
(Ok)
RESUME
pause in 1180
(Ok)
LINECOUNTER
0000000000000001 1000 $RANDSEED=1; GETARG $RANDSEED
0000000000000001 1005 ALIAS XY:R03, T:R06; // これを付...
0000000000000001 1010 ARY INT NEW A[1504]
0000000000000001 1020 FOR T=0,1503; A[T]=1; NEXT
0000000000000001 1030 A[33]=0; // 1<<5|1 // 左上に一つ...
0000000000000001 1040 FOR I=0,1000000
0000000000000187 1050 X=(RAND%23)*2+1
0000000000000187 1060 Y=(RAND%15)*2+1
0000000000000187 1070 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
0000000000000002 1080 DOLOOP
0000000002db8218 1090 D0=0; D1=0; D2=0; D3=0
0000000002db8218 1100 IF X<45 THEN D0=A[XY+32]; T...
0000000002db8218 1110 IF X> 1 THEN D1=A[XY-32]; T...
0000000002db8218 1120 IF Y<29 THEN D2=A[XY+ 1]; T...
0000000002db8218 1130 IF Y> 1 THEN D3=A[XY- 1]; T...
0000000002db8218 1140 T=D0+D1+D2+D3
0000000002db8218 1150 IF T==0 GOTO BRK; D=T
0000000002db8217 1160 T=RAND%D
0000000002db8217 1170 IF D0!=0 THEN IF T==0 THEN ...
0000000002db8217 1180 IF D2!=0 THEN IF T==0 THEN ...
0000000002db8216 1200 IF D3!=0 THEN IF T==0 THEN ...
0000000002db8216 1210 XY=X<<5|Y; A[XY]=0;
0000000002db8216 1220 ENDDO
0000000000000000 1230 FI
0000000000000185 1240 BRK:
0000000000000186 1250 NEXT
0000000000000000 1260 FOR Y=0,30
0000000000000000 1270 FOR X=0,46
0000000000000000 1280 XY=X<<5|Y; T=A[XY]; IF T==0 T...
0000000000000000 1290 PRINTF " "
0000000000000000 1300 ELSE
0000000000000000 1310 PRINTF "##"
0000000000000000 1320 FI
0000000000000000 1330 NEXT
0000000000000000 1340 PRINTF "\n"
0000000000000000 1350 NEXT
(Ok)
-ということで、どうやら何らかの理由で、1080~1220の DOLOO...
-じゃあちょっと状況を確認してみることにします(改行幅のせ...
-(こういう状況でカジュアルに実行できるところが、ただのデ...
(Ok)
PRINT X,,Y
25 3
(Ok)
FOR Y=0,30; FOR X=0,46; XY=X<<5|Y; T=A[XY]; IF T==0 THEN...
########################################################...
## ###### ## ## ## ## ...
########## ###### ## ## ## ## ## ## ###### ## ...
########## ## ## ## ## ## ###### ## ...
############## ## ################## ## ########## ...
############## ################## ## ## ...
###################################### ## ## ########...
###################################### ########...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
(Ok)
-これで、状況が分かりました。どうやら穴掘りで左に曲がらな...
-・・・でも、なぜ??
-ということで、プログラムを確認してみると・・・あーー!11...
-ということで、行番号を打ち間違えるという、実に恥ずかしい...
-コンソールでEND命令を実行して、プロンプトを「Ok」に戻し...
----
-[Q] まあまあ面白かった。ところで、デバッガのようなステッ...
--[A] 今のところ、自分の利用ケースでステップ実行が必要に...
--その代わり、怪しい処理に差し掛かるまでは LWAIT 0 で実行...
--またプログラム中でLWAIT命令を実行することもできるので、...
** (3) 検出できる実行時エラー
-オーバーフロー(参考:(1))
-配列アクセスで宣言範囲を超えたアクセスをしようとした場合
-ゼロ除算、ゼロ剰余算しようとしたとき
-現状では、この程度しかなくてすみません。メモリをmallocし...
-また未初期化変数参照とかもいつかやりたいなと思っています。
** (4) LWAIT 命令の考え方
-ES-BASICでは、各種の実行時エラー検出をON/OFFできるように...
-しかしそうなるとどうしても実行速度は落ちます。実行速度が...
-また高速に実行できるモードがあるからこそ、実行時エラーの...
** (9) 感想
-私は、普段はデバッガなどを使わずに、基本的にprintfデバッ...
-だからこそなのかもしれませんが、この ES-BAISC のデバッグ...
-ES-BASICの基本的な考えとして、「デバッグ時と通常時でコマ...
* こめんと欄
#comment
終了行:
* ES-BASIC (ver.0.2b時点) でのデバッグ機能について
-(by [[K]], 2020.05.16)
** (0) はじめに
-ES-BASICは簡易デバック機能があります。その活用事例を紹介...
** (1) オーバーフロー自動検出の例
-数学には組み合わせ数の計算としてコンビネーションという計...
-そのコンビネーションを使って 20C10 の値を計算してみたい...
-これは
(20*19*18*17*16*15*14*13*12*11)/(10*9*8*7*6*5*4*3*2*1)
-で計算できる値です。
-これが実際どんな値になるのかというと 184756 になります。
--適当に検索して見つけた http://cute.sh/solairo/p_c/c_01....
-当然ですがこの結果は32ビット整数に余裕で収まる値です。
-ということで、32ビット版のES-BASIC(esbasic32.exe)でも...
1000 A=1
1010 FOR I=11,20
1020 A=A*I
1030 NEXT
1040 B=1
1050 FOR I= 1,10
1060 B=B*I
1070 NEXT
1080 PRINT "20C10=",A/B
-というプログラムを書いてみました。
-そして実行しました。出てきた結果は・・・
Ok
RUN
20C10=117
Ok
-となってしまいます!・・・はい、おかしいですね。見事にバ...
--ちなみに、32ビットのC言語で同じアルゴリズムで計算しても...
----
-さてこんな時、ES-BASICではどうするのでしょうか。はい、LW...
--LWAIT命令は、line-waitという意味で、つまり1行実行するご...
--実行が速すぎて何が起きているのかよくわからなくなった時...
-ということで、実行速度を下げてから再度RUNしてみます。
Ok
LWAIT 0
Ok
RUN
exectime error
break in 1020
Ok
-お、なんかエラーで止まってくれました。実行時エラーです。...
--LWAIT 0 は行ウェイトが0で減速しないのですが、デバッグ機...
-どのくらい実行してから止まったのか、まずはそこを観察して...
Ok
LINECOUNTER
0000000000000001 1000 A=1
0000000000000001 1010 FOR I=11,20
0000000000000009 1020 A=A*I
0000000000000008 1030 NEXT
0000000000000000 1040 B=1
0000000000000000 1050 FOR I= 1,10
0000000000000000 1060 B=B*I
0000000000000000 1070 NEXT
0000000000000000 1080 PRINT "20C10=",A/B
Ok
-おお、1010~1030のFORループの途中で死んでしまったようで...
Ok
PRINT A,,I
1764322560 19
Ok
-なるほどー。どうやらA=176432250でI=19のときに、A*Iを計算...
--[註] 11*12*13*14*15*16*17*18 は 176432250 になりますの...
-ということで、簡単にバグ原因を突き止めることができました...
----
-[Q] 最初から LWAIT 0 にしておけば、もっと早くこのバグに...
--[A] 全くその通りです。だからデフォルトを LWAIT 0 にして...
--しかし私は、スピード狂でもあるので(笑)、しょっちゅう ...
-[Q] 64bit版のES-BASICでは問題なく正しい答えがでてしまう...
--[A] 64bit版のES-BASICは64bit整数を使っているので、問題...
--ここで32bitのES-BASICを例に出したのは、32bit版なら64bit...
-[Q] 64bit版のES-BASICでも、結果が64bit整数に収まらないよ...
--[A] はい、LWAIT 0 以上であれば、ちゃんと教えてくれます。
-[Q] 場合によってはオーバーフローしても無視して続行させた...
--[A] はい。そういうこともあると思って、「 LWAIT 0 以上で...
** (2) 無限ループに陥ってしまった場合の例
-これは私が[[esbasic02a]]の(5-4)の迷路作成プログラムを作...
1000 $RANDSEED=1; GETARG $RANDSEED
1005 ALIAS XY:R03, T:R06; // これを付けるとサイズを小さ...
1010 ARY INT NEW A[1504]
1020 FOR T=0,1503; A[T]=1; NEXT
1030 A[33]=0; // 1<<5|1 // 左上に一つだけ穴をあける
1040 FOR I=0,1000000
1050 X=(RAND%23)*2+1
1060 Y=(RAND%15)*2+1
1070 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
1080 DOLOOP
1090 D0=0; D1=0; D2=0; D3=0
1100 IF X<45 THEN D0=A[XY+32]; T=A[XY+64]; D0=D0&T...
1110 IF X> 1 THEN D1=A[XY-32]; T=A[XY-64]; D1=D1&T...
1120 IF Y<29 THEN D2=A[XY+ 1]; T=A[XY+ 2]; D2=D2&T...
1130 IF Y> 1 THEN D3=A[XY- 1]; T=A[XY- 2]; D3=D3&T...
1140 T=D0+D1+D2+D3
1150 IF T==0 GOTO BRK; D=T
1160 T=RAND%D
1170 IF D0!=0 THEN IF T==0 THEN A[XY+32]=0; X=X+2;...
1180 IF D1!=0 THEN IF T==0 THEN A[XY-32]=0; X=X-2;...
1180 IF D2!=0 THEN IF T==0 THEN A[XY+ 1]=0; Y=Y+2;...
1200 IF D3!=0 THEN IF T==0 THEN A[XY- 1]=0; Y=Y-2;...
1210 XY=X<<5|Y; A[XY]=0;
1220 ENDDO
1230 FI
1240 BRK:
1250 NEXT
1260 FOR Y=0,30
1270 FOR X=0,46
1280 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
1290 PRINTF " "
1300 ELSE
1310 PRINTF "##"
1320 FI
1330 NEXT
1340 PRINTF "\n"
1350 NEXT
-一見するとどこも間違っているようには見えません。
-それなのに実行すると・・・迷路は出力されず、無限ループっ...
----
-さてどうしましょう。はい、 LWAIT 0 にして実行することに...
-それでも当然ですが無限ループすることに変わりはありません...
Ok
RUN
pause in 1110
(Ok)
-なんか変なプロンプトが出ました。これはプログラムを一時的...
-まずは毎度の LINECONTER コマンドです。
(Ok)
LINECOUNTER
0000000000000001 1000 $RANDSEED=1; GETARG $RANDSEED
0000000000000001 1005 ALIAS XY:R03, T:R06; // これを付...
0000000000000001 1010 ARY INT NEW A[1504]
0000000000000001 1020 FOR T=0,1503; A[T]=1; NEXT
0000000000000001 1030 A[33]=0; // 1<<5|1 // 左上に一つ...
0000000000000001 1040 FOR I=0,1000000
0000000000000187 1050 X=(RAND%23)*2+1
0000000000000187 1060 Y=(RAND%15)*2+1
0000000000000187 1070 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
0000000000000002 1080 DOLOOP
000000000197887b 1090 D0=0; D1=0; D2=0; D3=0
000000000197887b 1100 IF X<45 THEN D0=A[XY+32]; T...
000000000197887b 1110 IF X> 1 THEN D1=A[XY-32]; T...
000000000197887a 1120 IF Y<29 THEN D2=A[XY+ 1]; T...
000000000197887a 1130 IF Y> 1 THEN D3=A[XY- 1]; T...
000000000197887a 1140 T=D0+D1+D2+D3
000000000197887a 1150 IF T==0 GOTO BRK; D=T
0000000001978879 1160 T=RAND%D
0000000001978879 1170 IF D0!=0 THEN IF T==0 THEN ...
0000000001978879 1180 IF D2!=0 THEN IF T==0 THEN ...
0000000001978879 1200 IF D3!=0 THEN IF T==0 THEN ...
0000000001978879 1210 XY=X<<5|Y; A[XY]=0;
0000000001978879 1220 ENDDO
0000000000000000 1230 FI
0000000000000185 1240 BRK:
0000000000000186 1250 NEXT
0000000000000000 1260 FOR Y=0,30
0000000000000000 1270 FOR X=0,46
0000000000000000 1280 XY=X<<5|Y; T=A[XY]; IF T==0 T...
0000000000000000 1290 PRINTF " "
0000000000000000 1300 ELSE
0000000000000000 1310 PRINTF "##"
0000000000000000 1320 FI
0000000000000000 1330 NEXT
0000000000000000 1340 PRINTF "\n"
0000000000000000 1350 NEXT
(Ok)
-言い忘れましたが、 LINECOUNTER のカウンタは16進数表示に...
-でもこれだけでは無限ループなのかどうかいまいち判断できま...
(Ok)
RESUME
pause in 1180
(Ok)
LINECOUNTER
0000000000000001 1000 $RANDSEED=1; GETARG $RANDSEED
0000000000000001 1005 ALIAS XY:R03, T:R06; // これを付...
0000000000000001 1010 ARY INT NEW A[1504]
0000000000000001 1020 FOR T=0,1503; A[T]=1; NEXT
0000000000000001 1030 A[33]=0; // 1<<5|1 // 左上に一つ...
0000000000000001 1040 FOR I=0,1000000
0000000000000187 1050 X=(RAND%23)*2+1
0000000000000187 1060 Y=(RAND%15)*2+1
0000000000000187 1070 XY=X<<5|Y; T=A[XY]; IF T==0 THEN
0000000000000002 1080 DOLOOP
0000000002db8218 1090 D0=0; D1=0; D2=0; D3=0
0000000002db8218 1100 IF X<45 THEN D0=A[XY+32]; T...
0000000002db8218 1110 IF X> 1 THEN D1=A[XY-32]; T...
0000000002db8218 1120 IF Y<29 THEN D2=A[XY+ 1]; T...
0000000002db8218 1130 IF Y> 1 THEN D3=A[XY- 1]; T...
0000000002db8218 1140 T=D0+D1+D2+D3
0000000002db8218 1150 IF T==0 GOTO BRK; D=T
0000000002db8217 1160 T=RAND%D
0000000002db8217 1170 IF D0!=0 THEN IF T==0 THEN ...
0000000002db8217 1180 IF D2!=0 THEN IF T==0 THEN ...
0000000002db8216 1200 IF D3!=0 THEN IF T==0 THEN ...
0000000002db8216 1210 XY=X<<5|Y; A[XY]=0;
0000000002db8216 1220 ENDDO
0000000000000000 1230 FI
0000000000000185 1240 BRK:
0000000000000186 1250 NEXT
0000000000000000 1260 FOR Y=0,30
0000000000000000 1270 FOR X=0,46
0000000000000000 1280 XY=X<<5|Y; T=A[XY]; IF T==0 T...
0000000000000000 1290 PRINTF " "
0000000000000000 1300 ELSE
0000000000000000 1310 PRINTF "##"
0000000000000000 1320 FI
0000000000000000 1330 NEXT
0000000000000000 1340 PRINTF "\n"
0000000000000000 1350 NEXT
(Ok)
-ということで、どうやら何らかの理由で、1080~1220の DOLOO...
-じゃあちょっと状況を確認してみることにします(改行幅のせ...
-(こういう状況でカジュアルに実行できるところが、ただのデ...
(Ok)
PRINT X,,Y
25 3
(Ok)
FOR Y=0,30; FOR X=0,46; XY=X<<5|Y; T=A[XY]; IF T==0 THEN...
########################################################...
## ###### ## ## ## ## ...
########## ###### ## ## ## ## ## ## ###### ## ...
########## ## ## ## ## ## ###### ## ...
############## ## ################## ## ########## ...
############## ################## ## ## ...
###################################### ## ## ########...
###################################### ########...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
########################################################...
(Ok)
-これで、状況が分かりました。どうやら穴掘りで左に曲がらな...
-・・・でも、なぜ??
-ということで、プログラムを確認してみると・・・あーー!11...
-ということで、行番号を打ち間違えるという、実に恥ずかしい...
-コンソールでEND命令を実行して、プロンプトを「Ok」に戻し...
----
-[Q] まあまあ面白かった。ところで、デバッガのようなステッ...
--[A] 今のところ、自分の利用ケースでステップ実行が必要に...
--その代わり、怪しい処理に差し掛かるまでは LWAIT 0 で実行...
--またプログラム中でLWAIT命令を実行することもできるので、...
** (3) 検出できる実行時エラー
-オーバーフロー(参考:(1))
-配列アクセスで宣言範囲を超えたアクセスをしようとした場合
-ゼロ除算、ゼロ剰余算しようとしたとき
-現状では、この程度しかなくてすみません。メモリをmallocし...
-また未初期化変数参照とかもいつかやりたいなと思っています。
** (4) LWAIT 命令の考え方
-ES-BASICでは、各種の実行時エラー検出をON/OFFできるように...
-しかしそうなるとどうしても実行速度は落ちます。実行速度が...
-また高速に実行できるモードがあるからこそ、実行時エラーの...
** (9) 感想
-私は、普段はデバッガなどを使わずに、基本的にprintfデバッ...
-だからこそなのかもしれませんが、この ES-BAISC のデバッグ...
-ES-BASICの基本的な考えとして、「デバッグ時と通常時でコマ...
* こめんと欄
#comment
ページ名: