楽屋裏 - 多重ループの謎

楽 屋 裏
e-Gadget

最終更新: 2014/03/10

[2014/03/10 追記]: 今回の異常が発生する条件以外でも多重ループの異常が見つかりましたこちらへ


原因不明の Syntac ERROR の件の続報:

問題を単純化すると、こうなります。

以下のようなWhile ループ内にDoをループが入ったプログラムで、Syntax Errorが発生し、問題の発生場所が WhileEnd だと表示されます。

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


=====

頭のWhile 1 を Lbl 0 に、お尻の WhileEnd を Goto 0 に変更した以下のプログラムでは エラーが発生しません。

プログラム2
Lbl 0
20→C
Do
Dsz C
LpWhile 1
Goto 0


エラーの発生源である WhileEnd を無くせばエラーが消えるわけで、問題はWhile ループにあることが確認されます。

=====

次に、Dsz C の代わりに、C-1→C とジャンプのためのGoto / Lbl に置き換えます。

プログラム3
While 1
20→C
Do
C-1→C:C=0⇒Goto 0
LpWhile 1
Lbl 0
WhileEnd


この場合は、エラーは発生せず、正常動作します。
どうやら、Dsz C で WhileEnd にジャンプする時にエラーが発生するようです。

=====

While ループの代わりに Doループを使うと、以下になります。

プログラム4
Do
20→C
Do
Dsz C
LpWhile 1
LpWhile 1


内側の Doループから抜けると、外側の LpWhile 1 から外側の Do までジャンプするのが正常動作ですが、内側の Do にジャンプするようです。ループの相手を見つける検索に問題が発生してるようです。

具体的には、以下を実行してはっきりました。

プログラム5
Do
20→C
C◢
Do
Locate 1,1,"    "
LOocate 1,1,C◢
Dsz C
LpWhile 1
Cls
LpWhile 1


これを実行すると、動作異常の状況がはっきりします。

=====

While ループの例と同様に、Dsz C を C-1→C:C=0⇒Goto 0 と Lbl 0 に変えて以下を実行すると、正常動作します。

プログラム6
Do
20→C
C◢
Do
Locate 1,1,"    "
Locate 1,1,C◢
C-1→C:C=0⇒Goto 0
LoWhile 1
Lbl 0:Cls
LpWhile 1


=====


以上から、WhileループやDoループを2重構造にして、内側のループを抜けるために Dsz 命令を使うと正常動作しないことが分かりました。

改めて、問題のプログラム2つを書いてみます。

これらは、特に問題を感じないプログラムです。

問題プログラム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


これは、エラーとして検出されませんが、外側のDoループが異常動作します。
その結果、Cをマイナスの値でどんどん減らしながら、内側のDoループが回り続けることになります。


これら2つの問題プログラムは、皆さんのfx-5800Pでも同じように異常になりますでしょうか?
是非お聞かせください。




現時点では、
「While および Do ループからの脱出に Dsz命令を使う場合は、さらにその外側に While およびDo ループを使ってはならない」
と言う予防策を講じる必要があります。



もし私のfx-5800Pだけでの問題でないことが分かれば、カシオに相談したいと思いますので、ご協力をお願い致します。





応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PCasioBasicループのエラープログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

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

コメントの投稿

非公開コメント

問題発生

やす様、こんにちは。

問題プログラムを実行したところ、両方とも同じエラーが出ました。
casio製のプログラム電卓のバグについて調べて見ましたが、多重ループバグに関する資料は見付かりませんでした。

fx-CG20での実行結果

fx-5800Pのコマンド体系を持っている、fx-CG20で実行しました。

プログラム 1
Syntax ERROR
プログラム 2
無限ループ状態

 プログラム2は、ループが交差するので、無限の状態になるのでしょうか。1についてはどうしてなんでしょうか。カウンタのDszと同居不可なのでしょうか。

Re: 問題発生

Kuさん

> 問題プログラムを実行したところ、両方とも同じエラーが出ました。

情報をありがとうございます。再現性はあると言うことが分かりました。

助かります。


> casio製のプログラム電卓のバグについて調べて見ましたが、多重ループバグに関する資料は見付かりませんでした。

そうなんです。私も見つかっていません。

Re: fx-CG20での実行結果

藤堂様


> fx-5800Pのコマンド体系を持っている、fx-CG20で実行しました。

大変役立つ情報をありがとうございます。


> プログラム 1
> Syntax ERROR
> プログラム 2
> 無限ループ状態
>
>  プログラム2は、ループが交差するので、無限の状態になるのでしょうか。1についてはどうしてなんでしょうか。カウンタのDszと同居不可なのでしょうか。


頂いた結果から、CasioBasicに共通した問題と言うことが分かりました。


仕様(バグも仕様と言ってのけるケースもありますが...)である可能性が限りなく100%に近いことが分かりました。



カシオへの問い合わせ

本件、皆様のご協力を得られたので、事象の再現性が確認され、CasioBasicに共通するものであることが分かりました。

そこで、カシオに問い合わせを送りました。

回答が来た際には、報告致します。

ループと Dsz との共存

藤堂様

DoやWhileループ内で、Dsz や Isz 命令を使うこと自体、特に問題は無いようです。

但し、LpWhileの直前にDszを書き、Dsz によってDoループを抜けるように書いた時、そしてなおかつこのループの外側にDoやWhileループを持ってくるときのみ、期待しない動作をするようです。

最近は、意図的に多重ループにして、色々と動作を見ているのですが...

多重ループ構造で、かつ内側のループをDszで抜けるようなコードで問題が発生し、それ以外は今のところ問題になった事例には出会っていません。

なんとも、不可解な現象です。

カシオからの回答によって、より具体的に異常発生条件が分かるといいのですが...


カシオへの問い合わせ(2)

昨日カシオへ質問を送ったところ、質問は受け取って確認中だから、少し待って欲しいとの一報がきました。

カシオに問い合わせの類をするのは初めてですが、素早い第一報です。
さすがにキチンと対応されています。

どんな結果が来るか楽しみですね。

 カシオのお客様サービス窓口の対応は早いですね。どのような結果が来るか楽しみです。バグだと分かれば、製品の改良がありますね。意外とfx-5800P改なんて製品が出てくるかもしれません。
 

No title

やす様、こんばんは。

ループをiszで抜けた時も、ループの外でcの初期化をしてもエラーが出るようなので、やはり多重ループの中にカウンタジャンプを入れるのが問題のようですね。
調べてみたら、casioのプログラム関数電卓"fx-3600Pv"にループバグがあるという情報がありました。この電卓は持っていないのでわかりませんが、、、

casio社からの返信が楽しみです。

多重ループとカウンタジャンプ

Kuさん

追加情報をありがとうございます。

fxー3600でも発生している報告あり、とのこと。CasioBasic共通の現象の可能性が高いと言えそうですね。

ちなみに多重ループとカウンタジャンプで問題が発生するのは、内側ループの最後にカウンタジャンプを配置するケースのみの可能性濃厚です。

それ以外では、少なくとも私が試した範囲では、多重ループでカウンタジャンプを使っても問題が出ていません。

ここからは私の想像ですが、コマンドの内部動作(マシン語レベル)で、ジャンプ先スタック管理に失敗しているのではないかと疑われます。

異常回避方法

今回の問題がCasioBasicに共通したものだとすると、根本解決には時間がかかるので、むしろ確実な対処方法が明らかになると良いでしょう。

今のところ、While及びDoを使った多重ループループ構造で、内側ループの最後にカウンタジャンプを配置すると異常動作が発生します。つまり、内側ループのLpWhileやWhileEndの直前にDszおよびIszを記述すると問題が発生します。これ以外の配置では、まだ問題が見つかっていません。

今のところ分かっている対策は、外側ループの最後、つまり外側ループのWhileEndおよびLpWhileの直前に

Goto X:Lbl X
(Xは0~9、A~Zのいずれか)

を記述することです。あるいは、Lbl/Gotoのセットが記述されていることです。

この対策の問題は、使えるラベルが1つ減り、対策に使うラベルを別のところでうっかり使うことです。

Gotoを使う限りラベルの管理をキチンと行わないとダメなので、影響は少ないとは思いますが、要注意です。

PCリンク

今回のケースの解決方法を考えていて、ふと思ったことがあります。

この際、fx-5800Pで使えるPCリンクツールをカシオが発売し、ファームウェアを書き換える機能も付けると言う対策が出来ないだろうか?

fx-5800Pの作りが外部からのファーム書き換えに対応していることが前提になり、具体的なファームの書き換え方法についても色々あるでしょうが、基本的には問題解決とfx-5800Pの商品性向上を一石二鳥で狙えるのではないかと....


これが可能なら、fx-5800Pの製品寿命も大幅に伸びて、メーカーとユーザー双方にメリットがあるのではないでしょうか?

リンクツール

 それは欲しいですね。
 パソコンを、fx-5800Pに見立ててれば、大丈夫でしょうけどね。
 以前のグラフ関数電卓は、ネームランドにつないでグラフを出力できたりおもしろい使い方もありました。いまでも、熱転写式のメモプリが売られています、計算結果などを出力出来れば使い道も上がります。(計算式を印字させるなど)

pcリンク機能

やす様、こんにちは。

pcリンク機能、欲しいですね。これから未知のバグが見つかった時にいちいち対処法を考える必要がなくなり、casioホームページで大々的に宣伝すれば売上も伸びるし、、、 7年前の古い機種なので実現は難しいですが。

fx-3600Pvは、fx-3600Pの後継機種(太陽電池・ボタン電池併用モデル)みたいです。fx-3600Pにも同じバグはあるのでしょうか。

No title

藤堂様

カシオへの質問の際、当ブログのことも書き添えています。これでここを読んで頂く可能性が少し上がったかも知れません。

是非とも前向きに検討して頂きたいと思うのです。

この際、PCリンクツールを出してくれませんか?>カシオ殿

別モノかも?

Kuさん

fx-3600Pv のループのバグの件、

ここ↓ のことでしょうか?
http://kyoro205.blog.fc2.com/blog-entry-270.html

そうだとしたら、今回の多重ループとDszの件とは、全く異なる現象に見えます。
少なくとも、ここで作っている単純なループと同等なコードをfx-5800Pで作っても問題ありません。

内部的に共通の原因がある可能性は否定できないのですが、取りあえずは今回の件とは無関係としておこうと思います。


ご指摘有難う御座います

やす様、こんばんは。

そうです。そこのサイトです。違うバグでしたか。ちゃんと読んでいませんでした。「思いこみとは恐ろしいものです。」まさにその通りでした。今度からはしっかり読んでからお伝えしたいです。間違った情報、申し訳御座いません。

Re: ご指摘有難う御座います

Kuさん

こんばんは、


> 「思いこみとは恐ろしいものです。」まさにその通りでした。

おお、CasioBasic入門を読んで頂いているのですね。嬉しいです( ^o^)ノ


この連載を始めた時は、プログラムを気楽に簡単にかけるCasioBasicの良さを紹介したいと思っていました。

題材のプログラムを作ってゆくにつれ、ある程度良いプログラムにしたいと思うので、ついつい細かいことを書いてしまっています。構造化プログラミングなんてのは、ちょっと余計だったかも知れないと、心配しています。


こんな話は、ある程度プログラムを作れるようになってからでも良いのですが、でも最初から意識するとしないのでは、プログラムを改造するときに大きな差になってしまうので....

余計だったかなぁ、と悩みながら書いてます。

Kuさんのご感想は、如何ですか?

No title

やす様、こんにちは。
>おお、CasioBasic入門を読んで頂いているのですね。嬉しいです( ^o^)ノ

いつも愉しませてもらっています。

>こんな話は、ある程度プログラムを作れるようになってからでも良いの
>ですが、でも最初から意識するとしないのでは、プログラムを改造する
>ときに大きな差になってしまうので....

その通りだと思います。私はfx-5800Pのcasiobasicで構造化プログラムを初めて体験したのですが、最初はgoto使いすぎ、同じ処理書きすぎ、の構造化のコの字も無い、めちゃくちゃなプログラムでした。今もですが、、、

一旦白紙にして冷静に考える...

Kuさん

こんばんは、

> その通りだと思います。私はfx-5800Pのcasiobasicで構造化プログラムを初めて体験したのですが、最初はgoto使いすぎ、同じ処理書きすぎ、の構造化のコの字も無い、めちゃくちゃなプログラムでした。今もですが、、、

電卓の画面だけを見て、何も考えずにプログラムを書き始めると、機能追加をする際にメチャクチャになること、私もあります。

そうなったら、一旦白紙に戻して、冷静に考えることをしています。

カシオ様からの一報

本日、カシオ様から、関係部署での調査にもう少し時間が欲しい旨の一報を頂きました。

真剣に取り組んで頂いているようです。

また、これだけ時間がかかることから、既知の問題でなかった可能性を感じます。

ゆったりと待とうと思います。

No title

 回答があったようですね。ゆっくり待ちましょう。これで改善されればよいですね。

ゆったりと待たせてもらいます

藤堂様


>  回答があったようですね。ゆっくり待ちましょう。これで改善されればよいですね。


そうですね、急ぐよりも確実な対応をお願いしたいと思っています。

今のところは、Lbl/Goto ループを使えば多重ループの問題を回避できるケースばかりなので、何とかなると思っています。

自分の作ったプログラムが異常動作した時、真っ先に自分のプログラムを疑うのが普通でしょう。そして悩んで、プログラムから問題の無い部分を排除して、やっと多重ループに問題があると分かる.....


fx-5800Pでは、プログラムのコピーができないので、作りかけのプログラムを問題発見のためにスリム化すると、Lbl/Goto ループに置き換えるにしても、また1から入力しないといけない....これ、結構面倒ではあります。


やはりPCリンクツールを、是非とも追加で発売して頂きたいところです。プログラムファイルのコピーが楽にできれば、問題回避の対応も、非常に楽になります。






PCリンクツール

 例えば、一度作ったプログラムを、サブルーチン以外に、別のプログラムに一部を利用した時など、コピー&ペーストが出来れば、効率が上がりますね。また、目的別のプログラムソースを、細分化(例:音楽カセットテープのように)してウェブサイト用意しておき、それを貼り付けて、試行錯誤できるように出来れば。fx-5800Pの利用の場所は広まるですけどね。

Re: PCリンクツール

藤堂様

この際なので、カシオ様にはPCリンクツールを是非ご検討頂きたいですね。

先ずはPCへのバックアップ、そしてPCとfx-5800P間でのプログラムファイルコピー機能が必要でしょう。


PC上やWebページでのプログラム編集機能はさらに有用でしょうが優先度は低くても良いかと思います。
低コストかつ短時間での供給を優先させて頂ければ、とても有り難いです。


PCリンクツールが1万円もしたら、fx-9860GII を買った方が良いって話にもなりますので....

カシオ様からの回答

本件につき、カシオ様から回答がありました。

今回の現象は、カシオ様でも確認されたとのことです。さらに、今回の現象は仕様とし理解して欲しいとのことでもありました。


対策プログラム例も挙げてもらったのですが、それが却って私の理解を混乱させるものでした。

そこで、今回の症状の本質的な原因と正しい対処方法について、私の理解を伝え、確認をお願いしました。


私の理解とは...

◆条件1:DoやWhileを使った2重ループ構造であること

かつ

◆条件2:内側ループを Dsz/Isz/⇒ で抜ける記法を用いること


が成り立つ時に、今回の症状が発生すること。


問題の本質としては、古くからある Isz/Dsz/⇒ と 新しい DoやWhileが混在すると制御スタックの管理に予期せぬ問題が発生することなのか?

いずれにせよ、適切な対処方法を明らかにできるまで、カシオ様にはお付き合い頂くようお願い致しました。



今回の問題についての私のスタンス

カシオ様から回答を頂いており、それに対して既にお知らせしたような質問をしております。

現在実装されている CasioBasicについて、今回の現象は仕様とのご回答を頂いています。

私としては、今回の現象が引き起こされる条件をキチンと理解し、何をやってはいけないのか? を正しく知っておきたいと考えています。

それが分かればプログラミングの際に問題を回避できるので、私にはそれ以上のものは不要です。


今回の現象は、致命的なものではないと考えており、正しい対処をすれば CasioBasicは十分使えるものと思っています。


カシオ様の揚げ足とりや大騒ぎをしても何の意味もなく、正しくCasioBasicを利用するために、気長にカシオ様にご対応頂けることを望んでいます。

仕様できましたか。

 仕様上の問題の回答できましたか。カシオとのやりとりで、プログラム関数電卓が、よりよい方向に改良されることを期待しています。
 思うに、説明書にプログラム集が消えたのは、知っている人が使うだろうから、使用頻度が低いだろうからのメーカー側の思惑でしょうか。それゆえに、仕様上の問題で、勘弁してくれの回答と勘ぐってしまいます。
 利用事例集(プログラムライブラリ)を、個人レベルから積み重ねていけば、カシオも動くしかないと考えます。
 新たに、fx-72F(71Fの外装を変えただけと思われます)を発売しているのですから。

仕様上の問題と理解

藤堂様

そうなんです。今回の現象が確認されたとのことなのです。


カシオ様からの回答を読む限り

1) その現象がコマンドの仕様通りに動いている

あるいは

2) その現象はコマンドの仕様通りではないが、内部仕様によるもの

のどちらなのかハッキリしない回答なのです。

ただ、1)ではないと思われるので、おそらく2)なのだろうと...


いずれにせよ、今回の再現性のある現象を確実に回避する方法を知った上で、現在作成中のCasioBasicコマンドリファレンスとCasioBasic入門に反映させたいと思っています。

fx-CG20 でも発生している現象なので、CasioBasicの特性として正しく理解するために、カシオ様にはもう一歩突っ込んだ対応をして頂きたいと思っているところです。



>  仕様上の問題の回答できましたか。カシオとのやりとりで、プログラム関数電卓が、よりよい方向に改良されることを期待しています。

そうですね、将来のモデル(敢えて次のモデルとは申しません)では対策できると良いですね。



>  思うに、説明書にプログラム集が消えたのは、知っている人が使うだろうから、使用頻度が低いだろうからのメーカー側の思惑でしょうか。それゆえに、仕様上の問題で、勘弁してくれの回答と勘ぐってしまいます。

少なくとも日本国内では、そのようなことは有ってもおかしくないと思われます。営利活動なので費用対効果を考えるのは当然のことです。ここは穏便に...と言うことは仕方ないと思います。



一方で、プログラム電卓の主戦場である欧米マーケットでは対応が異なるかも知れません。

しばらくはカシオ様の対応を待つようにしますが、場合によっては、海外のカシオ電卓コミュニティーで今回の件がファンの間では認知されていることなのか、調査を兼ねた書き込みをしてみようと思っています。

ひょっとしたら、欧米経由だと事態の推移が変わるかも知れません。



>  利用事例集(プログラムライブラリ)を、個人レベルから積み重ねていけば、カシオも動くしかないと考えます。

当ブログも草の根活動の1つですが、私は日本国内では、さほどの影響を与えるのは難しいのではないかと思っています。



日本でもまた火がつけばいいんですけどね。

 スマホ、タブレットに夢中になるように、プログラム関数電卓で、何か出来るがDIYのような、同k付けが出来れば、機種もふえ、さまざまな使い方が提案されるんでしょうけどね。

 英語が苦手な私に取って、欧米の電卓サイトと情報交換できるのはうらやましいです。

受動と能動

藤堂様


>  スマホ、タブレットに夢中になるように、プログラム関数電卓で、何か出来るがDIYのような、同k付けが出来れば、機種もふえ、さまざまな使い方が提案されるんでしょうけどね。

この手の話に接するたびに、受動的あるいは能動的な脳の使い方という話題を思い起こします。

私個人的には、ゲームは遊ぶものではなくて作るものと言うタチで、子供の頃から新しい遊びを思いついて友達の間で広がると、「またお前か...」と、学校の先生に怒られていました。今思えば、怒られた理由は殆どが大人の理由で、子供には理解の出来ないものでした。

豊になったせいなのか、完成されたものが与えられ、それで遊ぶので一杯一杯で作られるのがゲーム脳なのだと思います。

新しいものを作る楽しみが、今の日本では得られにくくなっていて、その理由は学校や社会が保守的で閉鎖的になっていることによるのではないかと、そんな風に思うのです。

理系に限ったことではなく、子供達が何か新しい小遣い稼ぎ(=新ビジネス)を思いついてそれを実行すると、先ず間違いなく大人に重られたり説教されます。アドバイスを与えつつ、行き過ぎないようにそれを見守ると言う寛容性が失われているのです。

なので、そんな日本では電卓やPCでのソフトウェア作りのブームの再到来は、とても考えにくいのです。

それでも、私は一人で抵抗しているのですけど...


Goto動作の謎

管理人様、はじめまして。

この話題、少し気になりましたので手持ちの5800Pと9860Gを少しいじってみたところ、GotoにおけるLblサーチがちょっと特別な動作をしている気配なので少しコメントさせていただきます。

通常のインタプリタ動作として、ループの種類ごとにスタックが独立していない場合、ループ完了前にDSZで抜けてしまうプログラム1のようなループスタックに不整合が生じるプログラムがエラーとなるのはそれはそれで正しい動作でないかと思います。

ただ、それが仕様とするならば、
プログラム3のようなGotoで途中で抜けた場合に正常動作するのがおかしなところですが、CasioBasicではそれがエラーにならないように、インタプリタがLbl命令をプログラム先頭からサーチする時、Ifやループ等の制御構造系コマンドのネスティングをチェックしてて、もし、飛び先がネスティングから抜ける場合は、整合が失われないようにそのネスティングのスタックを破棄する、もしくは再構築することで正常動作が続けられていると思われます。
逆にこのネスティングが不整合だとGoto直後でSyntaxエラーとなるようです。

これは元々はIf~ifEndの中からGotoでジャンプするために実装された仕組みだと思われますが、それが同列に分類される制御構造系の命令としてDo文、While文でも同様にエラー無く動作してしまうということでしょう。


次のプログラムは通常のインタプリタ動作であればエラーになるはずがないですが、CasioBasicではGoto直後でエラーになることから上記の結論に至りました。
-------------
Goto 0
Do
LpWhile 1
WhileEnd
Lbl 0
-------------
Doの所でSyntaxエラーになります。



またこのように文法上はおかしくても制御構造系命令のネスティングとして閉じていればエラーにはならないようです。
-------------
Goto 0
Do
While
IfEnd
next
Lbl 0
-------------


ということで、
Gotoでは脱出ジャンプでもエラーの出ないようにちゃんと対策されているっぽいのでこっちを基本に考えると、DSZや⇒という従来の命令を構造系命令対応し忘れたバグという感じですが、ループ脱出用にBreakという命令が用意されていることからして、CASIOからすればDSZや⇒は従来機種プログラム互換用で制御構造系命令と組み合わせるのは想定外だったのかもしれないですね。

インタプリタ動作時に各種細かい判定を入れると動作速度がどんどん遅くなりますし、DSZや⇒の動作速度が比較的高速なのはこのあたりも理由にありそうです。

CASIOからの仕様との回答は気になりますが、私的にはとりあえず納得というところです。
ですが、次期機種が出るなら上手く改善して欲しいところですね。

プログラム仕様の細かい動作は実際に試すまではなかなか気がつかないものですけど、CasioBasicの奥深さを感じるいい機会を与えていただいて感謝してます。

Gotoに目を付けると分かりますね

sentaro様

コメントを頂き、ありがとうございます。

While 1
20→C
Do
Dsz C
LpWhile 1
WhileEnd

のエラー対して、Goto 0:Lbl 0 を下記のように追加することで問題を回避できることは見つけておりました。

While 1
20→C
Do
Dsz C
LpWhile 1
Goto 0:Lbl0
WhileEnd

このことから、古い Dsz/Isz/⇒ と新しい制御構造のスタック管理に不整合が起きていることは想像しておりました。

しかし、Goto を掘り下げることに気付きませんでした。santaro様の慧眼に感謝致します。

おっしゃるように、

仕様1)制御構造の区別を付けないスタック管理が行われている
仕様2)Gotoは脱出ジャンプ対応がなされている
仕様3)Do / While の制御構造を Isz / Dsz / ⇒ で脱出ジャンプする対応が不完全

と仮定すると、私が見つけた現象とsantaro様が挙げられている現象を一元的に理解できそうです。

そして、Do/While混在の多重ループからの Isz / Dsz / ⇒ による脱出ジャンプのバグ対策として、
これらの脱出ジャンプの後に Goto 0:Lbl 0 を挿入することが、合理的な対策として有効と考えて良さそうです。


お陰様で、かなりスッキリ致しました。


私自身は、Do / While 制御構造にのみ着目していましたが、今回の件は For にも適用できそうなので、以下を試してみました。


プログラムA

While 1
20→C
For 0→I To 50
Dsz C
Next
WhileEnd


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

そこで、以下のように Goto 0:Lbl 0 を挿入してみますと...

プログラムB

While 1
20→C
For 1→I To 50
Dsz C
Next
Goto 0:Lbl 0
WhileEnd


これは正常動作します。


これで、Santaro様の仮説が、さらに裏付けられたと思います。



> Gotoでは脱出ジャンプでもエラーの出ないようにちゃんと対策されているっぽいのでこっちを基本に考えると、DSZや⇒という従来の命令を構造系命令対応し忘れたバグという感じですが、ループ脱出用にBreakという命令が用意されていることからして、CASIOからすればDSZや⇒は従来機種プログラム互換用で制御構造系命令と組み合わせるのは想定外だったのかもしれないですね。

実際にこのようなことですと、カシオ様が「仕様です」と言うのも分かります。


> インタプリタ動作時に各種細かい判定を入れると動作速度がどんどん遅くなりますし、DSZや⇒の動作速度が比較的高速なのはこのあたりも理由にありそうです。

Isz / Dsz / ⇒ の実行速度が速いので、どうしても多用したくなります。

恐らく、fx-9860系やfxCG20 などはそもそもプロセッサが速いので、古い命令を混在しようとする人が少なかったことから、カシオ様でも十分な把握がなされていなかったのだろうと推察されます。



> CASIOからの仕様との回答は気になりますが、私的にはとりあえず納得というところです。
> ですが、次期機種が出るなら上手く改善して欲しいところですね。

私も納得です。

カシオ様の回答が、今回の仮説に沿ったモノでない可能性があるかどうか、私も気になります。

一旦頂いている回答では、DoループからのDsz による脱出ジャンプの代わりに、If文とGoto文を使った脱出を使うようなプログラム例を挙げて特に説明が無いと言う状況です。

これでは問題の本質が見えず、却って混乱を深めていたところです。

Gotoを使え、と言うことならこれも納得ですが、何故曖昧な説明をされたのか?



> プログラム仕様の細かい動作は実際に試すまではなかなか気がつかないものですけど、CasioBasicの奥深さを感じるいい機会を与えていただいて感謝してます。

私も今回のケースにより、CasioBasicへの興味がさらに大きなものになっています。


いずれにせよ、目を覚ましてくれるようなコメントをありがとうございます。


恐縮です。

管理人様、こんにちは。

Gotoの件はたまたま偶然の発見というかあれでしたので恐縮することばかりですが管理人様のお役に立てたようでよかったです。


>Goto 0:Lbl 0

これはGotoのからくりが分かってきた時に拝見させていただいたので、今なら上手く動作する理由が納得できるところですけど、この一見何も意味のなさそうなジャンプひとつ、このおまじない的な対策方法に気が付かれたというのは、まさに目から鱗というか、かなりすごい奇跡的な発見だったのではないかなと思います。
私では単純な対処方法しか思いつけないところなのですけども、内部動作的なからくりがわからないうちは、なぜこれで上手く動作するのかというのも悩みどころになってしまうところですよね。


今回のGotoの動作において最初にこれはちょっと変だなと思ったきっかけなんですが、
まず、プログラム1をエラー無く動作し続けるにはどうするかということで、従来BASIC的な考え方でとりあえずスタックの不整合を回避するにはLpWhile 1の直後にLpWhile 0でいいのではというわけで、
-------------
While 1
20→C
Do
Dsz C
LpWhile 1
LpWhile 0
WhileEnd
-------------
こうすると一応エラー無くループが動作するのは確認できました。
ですが、
このプログラムにGotoを使うとなぜかエラーになる、はて?ということでLblサーチのときに何かあるのでは?ということでいろいろ試してみて気が付いた次第です。



>Isz / Dsz / ⇒ の実行速度が速いので、どうしても多用したくなります。

昔、BASICの遅さで苦労したことありますし、少しでもレスポンスを良くしたいとか特にリアルタイムなゲームを作ろうとすると速度はどれだけあっても困ることは無いので、すごくよくわかりますね。



>一旦頂いている回答では、DoループからのDsz による脱出ジャンプの代わりに、If文とGoto文を使った脱出を使うようなプログラム例を挙げて特に説明が無いと言う状況です。

代わりの回避策だけではなく、なぜにどうしてこうなるのかという動作的の説明が一切無ければ余計に謎が深まるというか、もう少しちゃんとした説明が欲しいところではありますよね。



>Gotoを使え、と言うことならこれも納得ですが、何故曖昧な説明をされたのか?

そもそも制御構造系からの脱出の話なのにIf~Gotoにすり替えてBreakでの脱出例を提示しないのはなぜ?という疑問も沸いてきますけど、この5800Pの世代は10年以上前の開発になるでしょうからすぐに原因説明ができる担当者がいないというのもありそうですし、困ったらとにかくGotoで、というのがこのCasioBasicの一番の対応策だったのかもしれません。

最近はプログラム電卓とはいえ付属してくるプログラム例が極端に少なかったり全く無かったりとかそういう傾向にあるので、メーカーからプログラムはこういう風に組むというお手本的なものも示されない状況ですし、そもそもプログラムを組むということさえかなり少ないということなのでしょう。

つまるところ、組める人は仕様を理解して上手く使ってねというか…。



>私も今回のケースにより、CasioBasicへの興味がさらに大きなものになっています。

CasioBasicにはまだまだ隠された秘密の裏技とか何かありそうな、というか出てきて欲しいです(笑)

管理人様の記事を読ませていただくと5800Pへの愛着をすごく感じますし、FX-602Pの時代からCASIOの電卓やSHARPのポケコンに触れてきた人間としてこのブログは強く支持したいです。

今後も管理人様の目から鱗の奥深い記事にご期待しています。

ありがとうございます>santaro様

santaros様


同好の士を得た気分で、とてもうれしいです。

一人で悩んでいてもダメで、今回はまさに文殊の知恵の典型ですから、有り難いことこの上ないです。

あとはカシオ様のご対応を気長に待とうと思っておりますが、今回の一連の動作について一応の納得が得られたので、この方向で色々検証しつつやっていこうと思っております。


> -------------
> While 1
> 20→C
> Do
> Dsz C
> LpWhile 1
> LpWhile 0
> WhileEnd
> -------------
> こうすると一応エラー無くループが動作するのは確認できました。

> このプログラムにGotoを使うとなぜかエラーになる、はて?ということでLblサーチのときに何かあるのでは?ということでいろいろ試してみて気が付いた次第です。

LpWhile 0 を挿入すると言うのも、全く思いつきませんでした。言われてみれば「なるほど( ^o^)ノ」です。

Gotoにしっかり仕事をさせ(押しつけて?)成り立っている現在の仕様は合理的ではないかと、ある意味感心しています。下手に動作が遅くなるくらいなら、この程度の癖は許容範囲です(個人的には...)。

ただ、その検証はしっかりやらないとダメだとは思いますが...



そういえば、FX-502P/602P は、Goto の位置から上へラベル検索をするので、二重ラベルなんて裏技がありました。一方 fx-5800Pでは、プログラムの先頭から検索していることは確認しています。

だからなんだ、と言うものでもありませんが、Gotoの実装仕様の大幅な変更があったことは間違いないでしょう。



> 管理人様の記事を読ませていただくと5800Pへの愛着をすごく感じますし、FX-602Pの時代からCASIOの電卓やSHARPのポケコンに触れてきた人間としてこのブログは強く支持したいです。

ご支持頂き、ありがとうございます。

fx-602Pと書かずに FX-602P と書かれるのを拝見して嬉しくなります。私も当ブログでは "FX" に必ず大文字を使うこだわりがあり、なんだかうれしい気分です。



> そもそも制御構造系からの脱出の話なのにIf~Gotoにすり替えてBreakでの脱出例を提示しないのはなぜ?という疑問も沸いてきますけど、この5800Pの世代は10年以上前の開発になるでしょうからすぐに原因説明ができる担当者がいないというのもありそうですし、困ったらとにかくGotoで、というのがこのCasioBasicの一番の対応策だったのかもしれません。


当ブログの今回の件のエントリーにカシオ様からなんどもアクセスされているので、本気で取り組んで頂いていると感じています。しかし回答に苦慮されているところから、開発に携わった方の支援が得られにくい可能性は私も感じています。



> 最近はプログラム電卓とはいえ付属してくるプログラム例が極端に少なかったり全く無かったりとかそういう傾向にあるので、メーカーからプログラムはこういう風に組むというお手本的なものも示されない状況ですし、そもそもプログラムを組むということさえかなり少ないということなのでしょう。
>
> つまるところ、組める人は仕様を理解して上手く使ってねというか…。


まさにおっしゃる通りで、一定のプログラミング経験の無いユーザーには、取扱説明書のコマンドリファレンスは理解が難しいと感じています。


そこで、CasioBasicの良さを知ってもらいたい、と言う気持ちから、当ブログを昨年の10月末に立ち上げ、私の目で見たCasioBsicコマンドリファレンスやCasioBasic入門を始めた次第です。

本格的にCasioBasicを触った経験がまだ1年未満ですが、CasioBasicプログラミング技法も紹介もできたらイイナ、とチョット大それた目標もあったりします。



> CasioBasicにはまだまだ隠された秘密の裏技とか何かありそうな、というか出てきて欲しいです(笑)

まさにトレジャーハンティングの気分です( ^o^)ノ


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

やす (Krtyski)

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


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

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

おもしろい・役に立つならクリックしてください。励みになります。

人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR