2021年 09月 25日
[BASIC for Android] スマホのBASIC言語でツールを作る(7)[メモプログラム3-SQL+音声処理] (9/25)
前回の[BASIC for Android] スマホのBASIC言語でツールを作る(6)[メモプログラム2-SQL] (9/24) : 体重と今日食べたもの
Commented
by
NS-ware
at 2022-02-10 12:08
では、関数化を考えていたが、実際にやってみるとEX_SQLと関数およびCASE文は相性が悪いようだ。
音声認識のプログラムにSQL文を組み込んだらずいぶんと苦労させられた。
EX_SQL文のON-OFFと、SQLのOPEN-CLOSEの入れ子は、
EX_SQL ,ON
OPEN
(SQL文)
CLOSE
EX_SQL ,OFF
が必須で、逆だとOPENで開いたDBのSQL SELECT結果が、EX_SQLで指定したSQL用配列に入らない。
また関数化すると、プログラム領域がローカル化するためか、EX_SQLの指定によるSQL文のSQL無し文法がエラーを起こす。
EX_SQLの指定が関数外にあるとRun ,cの中間コード解釈で認識してくれない。
かといってEX_SQL文を関数内に閉じ込めてもダメ。
SQL用配列(SELECT結果用)が大きいので引数ではなくグローバル変数である必要があるため、関数内に閉じ込められない。
同じことがSELECT CASE文のそれぞれのCASE節でも起こり、マニュアル「ユーザ関数・分岐」に関数とCASE文がひとまとめになっていることから、標準のBASICとは異なる処理を追加しているようだ。
これと、ON ERROR GOTOでエラートラップさせてると、問題個所が把握できなくなったり、外せば外したで今度はDBやEX_SQLの指定モードがオープンやONになったままで、再実行時に、必ずコマンドであらかじめEX_SQL,OFFやSQL CLOSEしないと余計なエラーになったりする。
またDB自体がうまく書き込まれていなかったりするので、おかしいと思ったらDBをKILLで削除し、BASIC自体も正常終了させて再実行したほうがよい。これもKILL内でCURDIR$(2)が効かず、KILL "フルパス"としなければならなかった。
なかなか癖のあるEX_SQLコマンドだった。
結局EX_SQLとSQLのOPEN-CLOSEとSQL文はごく近くに記述し、局所化した。別にOPENとCLOSEがDB処理で重いわけではなく、頻繁にOPEN-CLOSEして処理することになった。
またIF-ELSEが使えるのにELSEIFが使えないので、CASE文の代わりが書けないのも痛い。
さて、関数はGOSUB化、IF-ELSEは何とかCASE文にならないかもう少し試行錯誤する必要がありそうだ。
とりあえず「メモ」と「追加」だけ1回きりの実行ができるバージョンが以下の通り(endが必要な個所があるかも)。
そうそう、EX_SQLで全体がSQL文になるのかと思って代入文をLET @w$ =xxxとしたり、IF @W$ =xxxとしたが、すべて無駄だった。
100 'Please delete 200 lines of create sentences after the second.
110 dim mm$(2,20) :'(Item,Record)
120 ex_sql ,off
130 m$="" :'メモ
140 s$="" :'システム時間
150 'sql close
160 'on error goto 730 :'to close または1000
170 'on stop goto 730
180 'ex_sql mm$,on :'SQL mode
190 'sql open memo.db
200 'sql create table memo(memo text, systime text)
210 'LOOP:
220 'while (-1)
230 w$=ex_recogn$(0)
240 if w$ ="メモ" then
250 ' f=fshow()
260 ex_sql mm$,on :'SQL mode
270 open memo.db
280 select * from memo
290 close
300 ex_sql ,off :'mode cancel
310 print mm$(0,0);" ";mm$(1,0) :'Item
320 print mm$(0,1);" ";mm$(1,1)
330 else
340 if w$="追加" then
350 pause 1000
360 m$=ex_recogn$(0)
370 s$=str$(ex_time(date$,time$))
380 pause 1000
390 'let f=fins()
400 ex_sql mm$,on :'SQL mode
410 open memo.db
420 sql insert into memo values (@m$ ,@s$ )
430 close
440 ex_sql ,off :'mode cancel
450 else
460 if w$ ="クリア" then
470 'restore
480 'read a$
490 'replace a$,"メモ"+":"
500 else
510 if w$ ="音声" then
520 'restore
530 'read a$
540 'talk a$
550 else
560 if w$ ="削除" then
570 pause 1000
580 let m$=ex_recogn$(0)
590 let f=fdel()
600 goto 730 :'to close
610 'end
620 else
630 if @w$ ="終了" then
640 goto 730 :'to close
650 'end
660 endif :'終了
670 endif :'削除
680 endif :'音声
690 endif :'クリア
700 endif :'追加
710 endif :'メモ
720 'wend :'LOOP-END
730 close :'on error goto の飛び先
740 ex_sql ,off :'mode cancel
750 'end
760 'PROGRAM-END
770 func ferr()
780 'close
790 endfunc
800 func fshow()
810 ex_sql mm$,on :'SQL mode
820 open memo.db
830 select * from memo
840 close
850 ex_sql ,off :'mode cancel
860 endfunc
870 func fins()
880 'sql insert into memo values (@m$ ,@s$ )
890 endfunc
900 func fdel()
910 'sql delete from memo where memo=@m$ :'末尾にスペース
920 endfunc
930 'close
ブログ拝見させていただきました。ご活用ありがとうございます。
記述されていたことを元にSQL関係を中心にver416として修正してみました。
音声認識 ex_recogn$を連続的に使用した時の不具合は修正しました。pauseは不要です。
KILLでCURDIR$(2)が使用できないのはおそらくダイレクトコマンドでのことだと思います。
ダイレクトコマンドで文字変数や文字関数を使用した時のバグがありましたので修正しておきました。
TALK文は文字列変数は未サポートとありますが現行verで文字列変数指定はサポートしているのですが
おそらくこれもダイレクトコマンドでTALK文で文字変数を使った場合だと思います。
上記の修正と共にどの状況でも使えるようになっていると思います。
現在のOSバージョンではTTS音声合成の外部ファイル読み込みは不要となっているので
マニュアルの方修正しておきました。
ブログの例ではSQLモードでなく直接文の接頭にSQLを記述することで解決するものもありますが
SQL, EX_SQLの方を全般的、そして細かい点でも修正しておきました。
FUNC関数内や'SELECT CASE'内で'EX_SQL ,ON'の設定が可能になりました。
SQLモードでの'SELECT CASE'使用が可能になっています。
プログラム終了時にSQLファイルを自動でcloseする設定、'EX_SQL ,ATON'を追加しました。
その他SQL関係等で気になる点がございましたら短いサンプルででも送って頂ければこちらで検証したいと思います。
記述されていたことを元にSQL関係を中心にver416として修正してみました。
音声認識 ex_recogn$を連続的に使用した時の不具合は修正しました。pauseは不要です。
KILLでCURDIR$(2)が使用できないのはおそらくダイレクトコマンドでのことだと思います。
ダイレクトコマンドで文字変数や文字関数を使用した時のバグがありましたので修正しておきました。
TALK文は文字列変数は未サポートとありますが現行verで文字列変数指定はサポートしているのですが
おそらくこれもダイレクトコマンドでTALK文で文字変数を使った場合だと思います。
上記の修正と共にどの状況でも使えるようになっていると思います。
現在のOSバージョンではTTS音声合成の外部ファイル読み込みは不要となっているので
マニュアルの方修正しておきました。
ブログの例ではSQLモードでなく直接文の接頭にSQLを記述することで解決するものもありますが
SQL, EX_SQLの方を全般的、そして細かい点でも修正しておきました。
FUNC関数内や'SELECT CASE'内で'EX_SQL ,ON'の設定が可能になりました。
SQLモードでの'SELECT CASE'使用が可能になっています。
プログラム終了時にSQLファイルを自動でcloseする設定、'EX_SQL ,ATON'を追加しました。
その他SQL関係等で気になる点がございましたら短いサンプルででも送って頂ければこちらで検証したいと思います。
1
by k1segawa
| 2021-09-25 09:16
| BASIC
|
Comments(1)

