楽屋裏 - ViewWindow

楽屋裏 - Casio Basic グラフィックスでの ViewWindow
e-Gadget


2015/08/09

Casio Basic入門で、グラフィックスプログラミングについて調べて、結果を公開していますが、おそらく ViewWindow コマンドが最大の山場、逆に言えばこれを制覇すれば Casio Basicグラフィックスプログラミングの8割が理解できんじゃないか、とまで思い始めています。

ViewWindow については、当初さらっと1回分の記事で終わるかと思っていたのが、3回に渡って触れても、まだ足りないのです。

というのも、色々な描画コマンドの詳細挙動は、調べれば調べるほど ViewWindow が絡んでくるので、アッチコッッチで絡んでいる話を、どうやってスッキリと切り離して整理できるのか、探索を続けながら試行錯誤しています。

昨日投稿した Casio Basic入門G07 は、実は全面書き直し4回目の内容です。書き直せば書きすほど、分かりやすくなってきました。現在のものが一番分かりやすいという自信もありませんが、先へ進めることを優先させました。

私自身、全てのコマンドを分かっているわけではなく、探索を進めながら、明かになったことを公開しています。従って、全体の進め方や取り上げる話題の順序など、予定がいくらでも変わってゆきます。自分自身の理解を深めることと、それを分かりやすく解説することの両立も当初思っていたように簡単ではないです。

当初の予定では、グラフィックスプログラミングに不可欠なループ処理についても、丁寧な解説を入れるつもりでしたが、そんな余裕も無くなっています。プログラミング理解の山場の1つがループ処理らしいと、最近気づき始めていますので、ここは少々残念です。

==========

ViewWinidow による直交座標系設定の各パラメータは、設定や参照ができるように、それぞれ変数が用意されています。

ViewWindow Xmin,Xmax,Xscl,Ymin,Ymax,Yscl

ところが、Xmin, Xmax, Ymin, Ymax がまたクセ者で、決して min や max というわけでないところが厄介です。

これら以外にも、Xfct, Yfct Factor, ZoomAuto, StoV-Win, RclV-Win, Xdot があります。

さらに、Xdot はあるのに Ydot がない、この非対称性も、何か理由があるのでしょうが、今のところ不明です。2グラフ表示機能があって、グラフを2つ左右に並べて表示できます。それが証拠に、RightXmin, RightXmax, RightXscl, RightXdot, RightYmin, RightYmax, RightYscl が別にあります。しかし RightYdot はありません。

Ydot の計算は内部で行っていることはほぼ確実ですが、何故ないのか?この非対称性の理由が不明で、何か落とし穴があるかも知れないと、気になっています。

さらに ViewWindow 設定には、まだ扱っていない極座標系もあります。

ViewWinndow の奥深さは、まだ底が見えていませんが、ViewWindow のコマンドリファレンスが書けるようになれば、おそらく残りのコマンドのリファレンスも比較的楽に書けるようになるだろう、と思います。

=====

ClrGraph コマンドについても、ViewWindow というか座標系設定が絡みます。これまで、ClrGraphGraph はグラフィックスだと決めてかかっていましたが、これはまさにグラフなんですね。グラフ設定をクリアするコマンドと考えればスッキリします。

グラフ電卓搭載だけあって、座標系設定への気合いの入り方は半端ではありません。カシオの頑張りも垣間見えます。

Casio Basicコンパイラ作成のことを考えながら調べていると、内部処理の定式化を考えるようになって、するとまだ突っ込みが足りないことも分かってきて、面白さ倍増です。





応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: プログラム関数電卓、fx-5800P、fx-9860GII、Casio Basic

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - プログラミング・スタイル?

楽屋裏 -
e-Gadget


2015/07/27

このタイトルを見て、何の話題だと思われましたか?

何か、作りたいプログラムがあって、アレとコレをこうやって、こんな感じで出来そう...とか、この部分はまだ作ったことが無いから、チョットやってみないと分からない...とか、最初は頭のなかでグルグル考えるわけです。

以前、Windowsプログラムを作っていたこともあります.
通信プログラムやWindows の内部を触るような用途のプログラムは主に Visual Cで作って、その他は殆ど Visual Basic です。Cで作るべきプログラムはCで作って、それ以外は楽な Visual Basic や Basic.net が作っていました。Active Basic というフリーの開発環境も使ったことがあります。

おっとぉ、開発が最も楽な開発環境として Casio Basic を忘れてはいけません

==========

さて皆様は Casio Basic のプログラムを作る時のスタイルは、どんなですか?

イスに座って、テーブルの上に電卓を置いて、入力しますか?
或いは、手で持って入力しますか?

私は、両手持ちで、左右の親指2本で入力のスタイルです(^^;)
fx-5800P でも fx-9860GII でも同じスタイル。

そして、通勤電車、新幹線、飛行機内...どこでもプログラミングが、私のスタイル。
電卓プログラミングでなければ、できないと思います。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: プログラム関数電卓fx-5800Pfx-9860GII、Casio Basic

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - Input Box 海外デビュー

楽 屋 裏
e-Gadget

2015/07/05

Casio Basic 用入力ボックスは、私自身は結構便利に使っています。

fx-5800P プログラムライブラリ - 入力ボックス
fx-9860GII プログラムライブラリ - 入力ボックス

コンセプトとしてはそんなに悪くないと思っていて、今回海外でも発表してみようと思い、Universal Casio Forum の My Project に、Input Box For Casio Basic という記事を投稿しました。

さて、どういう反応が来るのか? このサイトは、まったりとのんびりペース、反応も遅いのですが、なんせ英語でのコミュニケーションは、のんびりでないとついて行けないので、ここに投稿しました。

Input Box For Casio Basic

このサイトは、まったり・のんびりペース、反応も遅いのです。
英語でのコミュニケーションは、のんびりでないと、ついて行けませんので、のんびりと反応を待ってみることにします。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-9860GII、fx-5800PCasioBasicプログラム関数電卓入力ボックス

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - Casio Basic のグラフィックス プログラミング

楽 屋 裏
e-Gadget

修正 2015/06/24

fx-9860GII は、グラフィックス表示が可能で、fx-5800P には無い楽しさや利便性があります。

以前、簡単に触れました;
楽屋裏 - Casio Basic のグラフィックス描画

fx-9860GII は、グラフ関数電卓の名の通り、数学の学習を主な用途として考えられていて、数式やデータからグラフの描画、変換、比較などを行える各種機能があります。つまり、PCなどで使うプログラミング言語のグラフィックス機能とは、少し方向性が違います。それは、Casio Basic 、特にグラフィックスのコマンド仕様に反映されています。



fx-9860GIIグラフィックス コマンド

fx-5800P の取扱説明書は、Casio Basic のコマンドの説明があまり親切ではありませんが、ほぼ全てのコマンドが簡単な説明付で掲載されています(行列だけが例外と言えます)。

ところが、fx-9860GII の取扱説明書には、実際に機能が搭載されているのに取扱説明書に説明のないコマンドがかなり多くあります。グラフィックス関係のコマンドもそうです。

なお、電卓本体には、[SHIFT] [4] (CATALOG) キーがあり、ここでは全コマンド類が全て含まれています。このリストを手がかりに、色々調べてみようと思っています。


さて、よく使いそうなグラフィックス関係のコマンドは、主に以下のメニューにあります。
・設定コマンド: [SHIFT] [MENU] (SET UP) 
・描画コマンド: [SHIFT] [F4] (Sketch) 
・座標設定: [SHIFT] [F3] (V-Window)
・グラフィックス消去: [SHIFT] [VARS] [F6] (▷) [F1] (CLR) [F2] (Grph)

各種設定、座標設定、点、円、線の描画、消去といった基本的なコマンド類は、これらのメニューから呼び出せます。



Casio Basic 入門 - 新連載の予告

これまで、fx-5800P を中心に Casio Basic 入門を連載してきました。各種コマンド類の使い方、アルゴリズムの紹介をして、ある程度実用的なプログラムを完成させる、といったスタイルです。

これに加えて、fx-9860GII でのグラフィックス プログラミングの紹介を追加してゆくことにしました。先ずは、上記の基本的なコマンド類について、取りあえず私が納得する範囲で調べたその結果を Casio Basic 入門 で紹介します。但し、具体的なゲームなどのプログラム作りは行わず、各コマンドの機能、制限、内部動作が分かるようなプログラムを作ってゆくスタイルにします。

コマンドを実際にみてゆくと、古いグラフ関数電卓から搭載されていたものに加えて、後から追加されたものがあります。このような流れを念頭にして、色々と調べてゆくと、内部動作を垣間見ることもでき、面白いものです。詳しくは Casio Basic 入門で紹介します。さらに、コマンドリファレンスにも追加する予定です。

その後は、グラフ機能や統計計算機能に付随する描画機能も調べてみて、グラフィックス描画性能を上げる可能性も探りたいと思っています。



画面を塗りつぶしてみる

カシオのグラフ関数電卓でのグラフィックス描画は、概して遅いと言えます。しかし、グラフィックス機能といえばゲームプログラミングだと思いますが、そもそも fx-9860GII はどのくらい遅いのか、sentaro 様にご協力頂きながら、実際に調べてみました。

単純に、LCD画面の下半分をドットで塗りつぶすプログラムです。下のプログラムを実際に入力するか、Markout.g1m ファイルをダウンロードして転送し、実際に実行してみてください。

Casio Basic 版 塗りつぶしプログラム MarkOut

ClrGraph
AxesOff
CoordOff
GridOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 31
For 0→X To 126
PlotOn X,Y
Next:Next


以下からダウンロード;
MarkOut.g1m

fx-9860GII でのグラフィックス描画は、一旦メモリにグラフィックスデータを送り、それを LCD 画面に転送する手順で実行されます。Casio Basic では、VRAMへの書き込みとLCDへの転送が、コマンドごとに行われます。

一方、SDK で Addd-in を作る場合は、VRAMへの書き込みとLCDへの転送を、個別に指示できるので、VRAMへのデータ書き込みをある程度まとめて行った後、LCDへ一気に転送すれば描画が速くなる筈です。LCDへのデータ転送の間引きを 1/10 にするのか、1/100 にするのか、1/1000 にするのかで、どの程度速度が変わるのか、試せるように Add-in を作りました。Casio Basic のアルゴリズムをそのまま採用しています。

Casio Basic では、プログラム実行の途中でも [AC] キーで強制終了できます。そこで、Add-in でも描画の途中で [AC] キーで強制終了できるようにしています。

Casio Basic に無い要素として、1ms の分解能のタイマーを同時に走らせて、実行時間の測定を行えるようにしています。このルーチンは sentaro 様が公開されているソースから、流用させて頂いています。

さて、プログラムを作って走らせている際、キースキャン ([AC] キーの検出、Casio Basic の Getkey に相当) が意外と時間を喰っていることに気付き、キースキャンも上と同様に間引きして、その影響をチェックできるようにしました。


Add-in 版塗りつぶしプログラム

以下からダウンロード;
MarkOut.zip


[2015/06/24 修正]
sentaro様からコメントを頂きました。

Add-in 版 MarkOut は、[F1] ~ [F4]を押して測定を開始する。Casio Basic 版と同様に、測定中は [AC] キーを押したら強制終了するようにするため、測定中でもプログラム内で [AC] キーをスキャンして、[AC] キー以外を押すとキースキャンがスキップされてプログラム実行速度が速くなる。逆に言えば、測定開始のために [F1] ~ [F4] を押すと、押した時だけプログラムが加速されていまうので、正しい時間測定にならない。
そこで、[F1] ~ [F4] を押して各測定モードに入った後、[EXE] キーが押されてからキーアップしたタイミングで測定開始させれば、上記の問題は解消される。

その通りですね。そして、これを実現した改良版を作って頂きました。上からダウンロードする Add-in は、この sentaro様の改良版に変更しました。sentaro様、ありがとうございます。
=====

先ずは、LCDへの転送を間引くと瞬間に描画が終わります。Casio Basic では、ドットを1つ描画するたびに LCD転送しているわけで、LCD転送が如何に時間のかかる処理か、とてもよくわかります。

グラフィックス プログラミングは、高速化が必要なプログラムには SDK で作る必要がありそうです。

なお、キースキャンも、LCD転送ほどでは無いのですが、結構な時間がかかっていることが分かります。

LCD Trasnfer Check モードで実行中に、[AC] キー以外を長押ししてみると、さらに増速します。キースキャンを減らしていることになるからです。


Casio Basic でのグラフィックス描画は、遅いという弱点がありますが、画面を全て塗りつぶすような重い処理でなければ、利用価値は多くあると思います。先ずは 実装されているコマンドをしっかりと理解して、使いこなそうと思います。



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-9860GII、fx-5800PCasioBasicプログラム関数電卓

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - Casio Basic のグラフィックス描画

楽 屋 裏
e-Gadget

2015/02/17

fx-9860GII の Casio Basic でグラフィックス描画を色々と触っていて、どのようなプログラムを作れるのか興味を持っています。

モンテカルロ法をグラフィックス化してみましたが (fx-9860GII グラフィックス - モンテカルロ法) ノーマル(29MHz)では描画速度が遅いので、オーバークロック(280MHz)で少しマシになる程度です。

全画面描画のプログラムは、現実使い物にならない可能性が高く、ライフゲームなど作ってみたいと思ったのですが、チト無理そうです。

例えば、各ドット(ピクセル)を、表示する/しないの判定をして、全画面表示するとその遅さが分かります。

千鳥配置でドット表示
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 62
For 0→C To 126
Mod(X+Y)⇒Plot X,Y
Next:Next



乱数でドット表示
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 62
For 0→X To 126
Ran# >0.5⇒Plot X,Y
Next:Next



全画面表示を伴うグラフィックスは、オーバークロックしてもCasio Basic には向かなくて、Cで書く必要がありそうですね。

「千鳥配置でドット表示」で、CoordOn に変更したり、ViewWindow 0,127,0,0,63,0 に変更したりすると、何がどう変化するのか分かって面白いです。ViewWindow は何か色々とありそうです。





応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasic換算プログラムプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - Casio Basic超入門

楽 屋 裏
e-Gadget

2015/01/31
更新: 2015/02/07

最近 fx-5800P の実売価格が下がってきて 5,000円台になる気配です。益々入手しやすくなっています。

そこで、fx-5800P を買ってきて、初めてプログラムを作ってみようというケースを想定した Casio Basic 超入門 を始めてみることにしました。

先ずは、、fx-5800P でプログラムを作るための操作方法について、できるだけ分かりやすく説明することを試みます。
そして、旧来の 入力/出力命令の使い方からスタートしてみることにしました。

旧来の入力/出力命令が分かりやすいのか、Locate / Getkey の方が分かりやすいのか、ここが悩みどころです。

Casio Basic の旧来の命令は、多くの機能を内蔵しているので、記述はシンプルですが、奥の深いところがあります。一方、典型的な Basic コマンドである LocateコマンドやGetkkeyコマンドの方が、私には明示的で分かりやすいように思うわけです。

ところで、Getkey を使うにはループを併用する必要があり、ループはプログラミング学習における敷居になっているらしい、と言う話が以前からあるようで、私はたまたま最近知りました。
 ⇒ 60%の人はプログラミングの素養がない
 ⇒ プログラマの適正検査

ならば、Getkey に加えて、入力待ち機能を持つ GetkeyWait があれば敷居が下がる筈です。

それはともかく、旧来の入力/出力命令は、表現はシンプルですが、その動作は意外に複雑であり、使いづらい面もあります。尤も、これは私の感覚です。しかし例えは、Casio Basic 旧来の入力命令は、入力待ちの機能が内蔵されており、ループを使う必要がありません。そこで、仮にループの理解が無くても、この旧来の入力命令は理解しやすい可能性があるわけです。

一方、Casio Basic を紹介しているプログやサイトでは、旧来の命令を利用した説明やプログラム例を多く見受けます。当ブログの Casio Basic 入門の最初に紹介しているような Getkey を使いこなす事例をあまり見ません(調べ方がまだ足りないのかも...)。これは、旧来の命令の方が分かりやすいと感じる人が多いことの反映かも知れません。

そこで、改めて旧来の命令を使ったプログラムを色々と検討してみました。その動作を正しく理解すれば、少ない記述量で所定のプログラムを作れることが分かってきました。当然制限はありますが、入力→計算→出力 を繰り返すプログラムなら、確かにシンプルに作れます。

このようなことを考えた結果、Casio Basic入門38から、旧来の命令を使って、みかけは超シンプルなプログラム作成からスタートし、徐々に改造してゆく内容を試みます。


[2015/02/07 更新]
現在のところ、Casio Basic入門38~39 まで公開したところです。旧来の命令を使いこなすことをテーマにしています。私自身、計算を繰り返す簡単なプログラムなら、旧来の命令が結構使えることを再認識しています。

但し、やはり構造化Basic である Caso Basic の真価は、旧来の命令以外のところにあると思っていて、これの良さを伝えたいと言う思いはさらに強くなっています。

面白いことに、これらのエントリーへのアクセス数が、Casio Basic入門1~8 へのアクセス数と同等になっていて、特に Casio Basic入門3~8 は、GetkeyLocate の使いこなしをテーマにしています。これが何を意味しているのか、とても興味深いです。

さらに、旧来の命令の使いこなしをご覧になっている方のうち、無視できない数の方が fx-9860GII のエントリーも同時にご覧になっているのも、興味深い結果です。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasic換算プログラムプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - Dsz によるループ脱出

楽 屋 裏
e-Gadget


2015/01/11 ポイントを整理するため修正
2015/02/01 カシオからの回答のまとめ

※ 本件に関する注記を Casio Basic 入門14 の最後に追加しています


以前、Do や While を使った2重ループで、内側ループを脱出するために Dsz 命令を使うとエラーになる、と言う問題を取り上げました。
 ⇒ 楽屋裏 - 多重ループの謎
 ⇒ 楽屋裏 - ループ脱出の問題(カシオの回答)


カシオお客様センターとやりとりをし、カシオ殿の回答にも多少の時間はかかっておりましたが、それ以上に私が中途半端なままにしておりました。そこで、一旦カシオ殿の回答をまとめて掲載致します。以前のコメント欄を追いかけて頂ければ、お分かりの方にはお分かりだと思うのですが、それではカシオ殿には申し訳ないので、改めて別エントリーとしました。

他の方からもコメントがあるように、カシオお客様センターは、時間がかかってもきちんと対応をしてくれます。


さて、問題の起点は、以下の2重ループで Syntax ERRORが出ることでした。

While 1
20→C
Do
Dsz C
LpWhile 1
WhileEnd


これに対して、カシオ殿の回答は、以下のものでした。

2重ループ構造という条件はございません。
Dsz/Isz/⇒で偽の場合に、次のコマンドをスキップするという
仕様のため、次の条件の場合にSynERRORとなります。
・条件1: DoやWhileを用いたループがあること
・条件2:ループ脱出に Dsz/Isz/⇒を利用すること
・条件3:Dsz/Isz/⇒ の次のコマンドが、LpwileかWhileEndであること

この期待しない動作については、制御のスタック管理において、古くからある Dsz / Isz / ⇒  と 後から実装された Do ループと While ループ で整合性がとれていないのではないか?と言う質問については、

ご指摘の通りでございます。従来のコマンドに慣れ親しんだユーザー様に配慮し、従来仕様をあえて残させて頂きました。

とのことでした。結果として現行 Casio Basic の内部実装通りの動作と言うことです。

これを反映させた具体的な対応策は、下記のようになります。カシオ殿の提示はIf 文を用いたものですが、私が敢えて ⇒ 命令を使って書き直しています(上の不具合条件に抵触しません)。

1) Dsz / Isz を用いて脱出するループに Do / While ループを使わず Lbl / Goto を使う方法

While 1
20→C
Lbl 0
C-1→C
C⇒Goto 0
WhileEnd



2) Do / While ループの脱出に Dsz / Isz の代わりに Break を使う方法

While 1
20→C
Do
C-1→C
C=0⇒Break
LpWhile 1
WhileEnd




さて、

これまでのところ、sentaro様により、以下の回避方法が提示されています。

While 1
20→C
Do
Dsz C
LpWhile 1
LoWhile 0
WhileEnd



私も、以下の回避方法を見つけております。

While 1
20→C
Dsz C
LpWhile 1
Goto 0:Lbl 0
WhileEnd


sentaro様の方法は、内側の Do ループのスタック制御が必ず行われるようにした自然な方法です。しかしこの方法は、Doループでは使えますが、While ループでは使えないと思います。一方、私が見つけた方法は Do / While ループのいずれでも使えるように見え、Goto の実装に深入りする方法です。

これらの方法は、たまたまうまく言っているだけの可能性があります。

さらに、下記のようなコードは、上記の異常動作の条件に合致しますが、これまで動作異常の経験がありません。

20→C
Do
Dsz C
LpWhile 1
[スタック制御を行う何かの処理]

これも、たまたまうまくいっているだけの可能性があります。その1つの例として、Goto 0:Lbl 0 だったと考えられます。


今回、外側のループに Dsz で脱出させてみたところ、上の対処療法では問題があることが分かりました。

例えば、

20→D
While 1
20→C
Do
Dsz C
LpWhile 1
LpWhile 0
Dsz D
WhileEnd


は、D が 0 になった段階で Syntax ERROR になります。

20→D
Do
20→C
Do
Dsz C
LpWhile 1
LpWhile 0
Dsz D
LpWhile 1


も、D が 0 になった段階で Suntax ERROR になります。

外側のループにも同じ対処療法を施すと、

20→D
Do
20→C
Do
Dsz C
LpWhile 1
LpWhile 0
Dsz D
LpWhile 1
LpWhile 0


これでは、Syntax ERROR の表示は出ませんが、D が 1 の状態で固まってしまい、先に進みません。Dsz でのループ脱出は、やはり本質的なスタック管理のエラーがあるようで、対処療法も効きません。

Dsz の実行速度は魅力的ですが、少なくとも、

D-1→D:D=0⇒Beak
WhileEnd


或いは

D-1→D:D=0⇒Break
LpWhile 1


といった記述で、Break を使うのが安全のようです。カシオが提示した対処方法には、If 文での Break でしたが、可読性や処理速度を考えれば、条件ジャンプ命令 ⇒ を使う方がマシなので、これを対処方法とします。


但し、今のところ、Do や While ループの脱出に Dsz を使い、上記のような対処療法(Goto 0:Lbl 0 の挿入)の結果、エラーや異常動作を経験していません。たまたまなのかどうか、今はそこに最大の興味が移っています。



[2015/02/01] カシオお客様センターからの回答

以下の質問をカシオお客様センターに投げかけました。

 A) 上記の Goto 0:Lbl 0 による対処方法の是非

 B) 上記の LpWhile 0 による対処方法の是非

 C) Do / While ループに比べて、制御構造が複雑になると Goto/Lbl ループが遅くなる理由 

 以上について、関連する Goto の内部動作について教えて欲しい。

その結果、Goto の内部動作に関する情報と共に、丁寧で貴重な回答が得られました。それを以下にまとめます。


Goto と その他のスタック制御を行うコマンドでは内部管理が異なっている。

Goto 以外の制御コマンドは、1本のスタックを使って、制御構文開始コマンドでスタックを1つ積み、制御構文終了コマンドででスタックを1つ破棄する。ここで積まれるスタックとスタック段数を"正式なもの"と呼ぶ。

Goto については、それが実行されると、先ずプログラムの先頭から対応する Lbl を検索し、見つからない場合はエラーになる。

対応する Lbl が見つかるまで、Goto は 他の制御コマンドも検索し、Goto 専用の仮スタックと仮スタック段数カウンタに記録する。
そして Goto に対応する Lbl が見つかると、その Lbl の仮スタック段数と、正式スタック段数を比較する。

正式と仮のスタック段数の比較;
(A) Goto 実行時の正式スタック段数が、Lbl の仮スタック段数よりも大きい場合は、正式スタック段数を段数の差だけ破棄する。
(B) Goto 実行時の正式スタック段数が、Lbl の仮スタック段数よりも小さい場合は、正式スタック段数を更新して、仮スタック段数と同じにする。

以上の内部動作の後、Lbl の位置までプログラム動作を飛ばす。


1) Goto 0:Lbl 0 による対処について
20→C
Do
Dsz C
LpWhile 1
Goto 0:Lbl 0


Goto 0 が実行される時、
LpWhile 1 がスキップされているので、正式スタック段数は +1
Goto 専用仮スタック段数は、Lbl 0までの検索で LpWhile 1 を見つけた時に 仮スタック段数が1つ戻されるので 0、つまり、Lbl 0 での仮スタック段数は 0

正式と仮のスタック段数の比較の結果、上記の(A)に相当するので、正式スタックを1段だけ破棄するので、正式スタック段数は 0 となり、正しく修正される。

つまり、Dsz C で制御構文終了コマンドがスキップされる場合でも、その後に Goto 0:Lbl 0 があれば、正常に修正される。


2) LpWhile 0 による対処について
20→C
Do
Dsz C
LpWhile 1
LpWhile 0


の場合、制御構文終了コマンド LpWhile 1 がスキップされても LpWhile 0 があるので、スタックが1段破棄される。
正式スタックが1本しかないので、LpWhile 0 の代わりに、WhileEnd、Next などスタックを1つ破棄するような他の制御構文終了コマンドがあれば、正常動作する。


20→C
Do
Dsz C
LpWhile 1
・・・
・・・
Retuen

このように、・・・ の部分で、LpWhie 1 を超えて前に戻るジャンプがなければ、Return で全てのスタックが破棄されるので、プログラムは正常動作する。


20→C
Do
Dsz C
LpWhile 1
Break
LpWhile 1


の場合、Break の後に制御構文終了コマンドが必要だが、それには LpWhile 1 など何でも良いことになる。


3) Goto / Lbl ループが他のループよりも大幅に処理速度遅くなる条件について
Goto / Lbl ループは、ループが回るたびに上記の Goto による仮スタック管理と正式スタックとの比較を行い、Do, While For ループでは、スタックに記録されたアドレスへジャンプする動作のみ。従って、制御構造が複雑になるほど Goto / Lbl ループが遅くなる。

さらに、Goto / Lbl ループでは、Lbl がプログラムの先頭から遠くなるに従って、動作が遅くなる。


例1      例2
Lbl 0     ・・・・
・・・・     ・・・・
・・・・     ・・・・
・・・・     ・・・・
・・・・     Lbl 0
・・・・     ・・・・
Goto 0   Goto 0


例1は、Lbl 0 がプログラム先頭にあり、検索時に最初にヒットするため、すぐにジャンプ処理ができる。

例2は、Lbl 0 に行き着くまでの間、制御構文の処理なども実施しながら検索していくことから、処理の負担がかなり大きくなり、その分処理時間も長くなる。


4) 他の Casio Basic バージョンへの適用について
今回説明した Goto の内部動作については、fx-5800P、fx-9860シリーズ、fx-CG20シリーズ、fx-FD10Pro など、カシオのプログラム関数電卓の殆どのモデルに当てはまる。


以上が、カシオによる回答をまとめたものです。

ここまでの情報を開示頂いたカシオ殿に、深く感謝致します。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasic換算プログラムプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - fx-5800Pで換算プログラム

楽 屋 裏
e-Gadget

更新: 2015/01/23

有用な電卓プログラムの代表格が換算プログラムではないかと思っています。

・年齢換算
・和暦・西暦換算
・割り勘計算
・海外時間の換算
・各種通貨換算
・消費税計算
・様々な技術的な単位の換算


いくらでも、ありそうですね...

これらは、パソコンをいちいち起動しないで、出先やフィールドで電卓をサッと出して、パッと使えると便利なことが多いものです。



貧弱な標準入力命令:?

換算するパラメータが全て1画面に表示されていて、1つを変更すると、他が同時に変更される...そんな一覧性の高い変換プログラムは、fx-5800Pでは意外に作りづらいものです。

その最大のネックが、入力命令が貧弱なことにあります。CasioBasic標準の入力命令だと、要らぬ所に入力結果を表示したり、勝手にスクロールしたり、入力したい位置に入力できず...

標準の入力命令は、画面構成を破壊するので、一覧性の高い換算プログラムを作れません。



ついに公開

換算プログラムを作るために、fx-5800P用「入力ボックス」プログラム(サブルーチン)を、長らく暖めていました。

とても便利なので、いよいよCasioBasic入門で公開することにしました。もっと良い名前がありそうですが、暫定的に「入力ボックス」と命名しました...(´д`)

CasioBasic入門15 から連載します。

実際に私が作った「換算プログラム」の一例を、CasioBasic入門15 で紹介しています。

Casio Basic入門15 から「入力ボックス」の作成方法を紹介していますが、ここで完成したものは動作が遅いので、より高速化して実用的改造しています(以下参照)。


優れたアルゴリズムによる高速化、と言う課題は残っているのですが、一人で暖めておくよりも、いっそ公開することで、凄いアルゴリズムがあれば是非知りたいと言う思いもあります。

[2015/1/23 追記]
入力応答の大幅な改善を行いました。以下をご参照ください。
 ⇒ Casio Basic入門32
 ⇒ fx-5800P プログラムライブラリ - 入力ボックス

併せて、fx-9860GII 用の入力ボックスも公開しています。
 ⇒ Casio Basic入門37

「入力ボックス」は、プログラムライブラリでも紹介しています;
 ⇒ 入力ボックス 2.0 / 2.1 - fx-5800P専用
 ⇒ 入力ボックス 2.1G - fx-9860Gシリーズ、fx-CG20、fx-CG50用




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: fx-5800PCasioBasic換算プログラムプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - 換算プログラム2

楽 屋 裏
e-Gadget


ここのところ、かなり忙しくて新しい記事の準備がなかなか進みません。なんとか週1回の更新をキープしたいものだと思っています。

連載中の CasioBasic入門も、今日の更新で一区切りついて、西暦・和暦変換プログラムの完成まできました。


手元には、題材となるプログラムがまだまだ有り、私自身が日常的に便利に使っているものも多くあります。例えば、

1. 日本時間と海外時間の換算プログラム

2. 摂氏・華氏温度変換プログラム

3. 圧力単位換算プログラム


興味を持って使いたくなるようなプログラムを題材にしたいと思っているのですが、ここをご覧の皆さんが興味を持つとも限らず、それを題材にするのをためらっています。


そこで、相談です。

上のようなプログラムは、みなさんにご興味を持ってもらえるでしょうか?




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasic換算プログラムプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

楽屋裏 - ループ脱出の問題(カシオの回答)

楽 屋 裏
e-Gadget


原因不明のループ脱出について、カシオからの回答が得られました。

発端は以下のコードでの異常動作です。

問題プログラム1
While 1
20→C
Do
Dsz C
LpWhile 1
WhileEnd


これは、最後のWhileEndでSyntax ERROR が発生します。


問題プログラム2
Do
20→C
Do
Dsz C
LpWhile 1
LpWhile 1

この場合は、Syntax ERORR の表示はないものの、外側の LoWhile から外側のDo へ戻りません。


カシオの回答では、

1.2重ループ構造という条件は無い。
Dsz/Isz/⇒で偽の場合に、次のコマンドをスキップするという
仕様のため、次の条件の場合にSynERRORとなる。
・条件1: DoやWhileを用いたループがあること
・条件2:ループ脱出に Dsz/Isz/⇒を利用すること
・条件3:Dsz/Isz/⇒ の次のコマンドが、LpwileかWhileEndであること


これまでのところ、Do / While ループの脱出に Dsz / Isz / ⇒ を使っても、2重ループでなければ問題発生の経験が無いので、本質はここだけにないと思われます。


2. 制御のスタック管理において、古くからあるDsz/Isz/⇒ と 後で実装された DoループやWhileループで整合性がとれないのが原因ではないかと想像される件については、その通りであって、従来のコマンドを慣れ親しんだユーザーを配慮し、従来仕様をあえて残したとのこと。


3. Goto 0:Lbl 0 による回避策について
これについては、私の質問の仕方に問題があったため、改めて質問をする予定です。


Santaro様が見つけられた Goto の謎が、項目1に対する理解を深めるものと思いますので、引き続きカシオとの対話を続けようと思います。


Santaro様によるGoto の謎については、以下のエントリーに続くコメントにあります。

楽屋裏 - 多重ループの謎 


以上、報告でした。


⇒ その後のカシオとのやりとりから得られた結論



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: fx-5800PCasioBasicDo/Whileループ脱出のエラープログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

最新記事
検索フォーム
最新コメント
カテゴリ
C# (3)
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを作って、使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR