fx-9860GII への移植 - 厄介な 旧来の命令
2015/01/12 追記
2017/06/29 更新
2017/06/29 更新
fx-5800P から fx-9860GII への移植

fx-9860GII と fx-5800P
これまで、fx-5800P のCasio Basicで作ったプログラムを fx-9860GII へ移植してきて、留意点がだいたい分かってきました。以下の項目以外は、ほぼコンパチと思ってよさそうです。
1) Getkey
キーコードはハードウェア依存するのでキーコードさえ変更すれば、Getkey コマンド自体の動作は同じなので移植に問題なし。
⇒ Casio Basic コマンドリファレンス - Getkey
2) Locate
Locate コマンドの動作は同じで fx-5800P からそのまま移植可能。fx-9860GII が持つ広い画面に合わせて最適化する場合は、引数を変更すれば良い。
⇒ Casio Basic コマンドリファレンス - Locate
3) Cls
fx-5800P 搭載 Casio Basic の Cls は、fx-9860GII では ClrText に相当する。機能は全く同じ。内部カーソル行のリセット機能まで同じ。
⇒ Casio Basic コマンドリファレンス - Cls
4) 配列変数
fx-5800P 搭載 Casio Basic の配列変数は、fx-9860GII の Caso Basicには含まれていないため、代わりに行列を使えば良い。
5) ◢ (出力)命令
出力動作後、一時停止状態の際、- DISP - と表示される。その表示行は完全に占拠されるためプログラムで使えなくなる。今のところ - DISP - の表示を止める方法が見つかっていない。fx-5800P で ◢ 命令を使った画面構成は、fx-9860GIIでは崩れてしまう。画面構成を壊したくないなら、 ◢ 命令を使わずに Locate を使い、さらに以下のような [EXE] キー待ちのコード(2行)加えると、◢ 命令と同様に一時停止し [EXE] キーでプログラムを先に進めるようにできる。
Locate X,Y,"HogeHoge"
Do
LpWhile Getkey≠31
6) " " (出力)命令
fx-9860GII 搭載 Casio Basic の " " (出力)命令は、fx-5800P とは別物といって良く、私はプログラムでは使えないと思う。
以下の2行のコードを、fx-5800P と fx-9860GII の両方で走らすと、その違いが分かるだろう。
Locate 10,1,"RIGHT"
"LEFT"
fx-5800P での出力は、
LEFT RIGHT
fx-9860GIIでの出力は
LEFT
上の2行のコードの1行目と2行目を入れ替えれば、fx-5800P と fx-9860GII は同じ表示結果になる。
fx-9860II 搭載の Casio Basic の " " (出力)命令は、チョット我が強く、1行丸々自分のために占拠する。◢ (出力)命令も1行丸々占拠するので、このあたりは同じ。fx-9860GII の Casio Basic はマイナーバージョンアップしており、その際に旧来の命令の仕様が変わったと思われる。
[追記]: CFX-9850GC (PLUS は付かない)、PRIZM fx-CG10 (fx-CG20と同じのUS版) でも fx-9860GII と同じ動作とのこと。従って、fx-5800P だけが独自のチューニングを行っていると思われる。
7) ?→ (入力)命令
我の強い " "(出力)命令の性格を引きづり、fx-9860GII では使いにくいものになっている。
上記の" "(入力)命令の違いを示すコードと同様にして、以下を fx-5800P と fx-9860GII で動作させると、違いが分かる。
Locate 10,1,"RIGHT"
"INPUT"?→A
fx-5800Pでの出力は、
INPUT? RIGHT
[入力桁]
fx-9860GIIでの出力は、
INPUT?
「入力桁]
RIGHT が出力される前提で書いた fx-5800P のコードは、そのまま fx-9860GII では使えない。
RIGHT 表示を右側に残して INPUT? と表示させ、1行下が入力行となるのがfx-5800P の動作だが、fx-9860GII では頑固な " " 出力に占拠された1行目に RIGHT を表示させた状態で入力させることは不可能(と思います)。
8) ?(入力)命令
fx-5800P では、?記号単独で入力命令として使えるが、fx-9860GII ではこれが使えない。
fx-5800P では、以下のコードが書ける。
"INPUT"?A
すると、予め A に代入されている値が表示される。これの良いところは、プログラムを使っていて A の値を変更する必要が無い場合は、数値入力せずに [EXE] キーを押すだけで入力が確定するので、入力の手間が省ける。
fx-9860GII では?に続いて → (代入命令) が必要であり、必ず数値入力をしないと [EXE] で確定できない。
'INPUT"?→A
なお fx-5800P でも上記 8) で示したように、この記法は可能であり、?(入力)命令に柔軟性がある。fx-FD10 Pro でもこの記法が可能なようである。
9) 関数
関数の ( ) の扱いが変更されている。fx-5800P では関数の後に ( が必要なので入力時に ( が自動的に付加される。fx-9860GII では入力時に ( が付かず代わりにスペースが入るように変更されている。但し ( ) を付けても問題なく動作するので fx-5800P からの移植性には影響しない。
しかし、fx-9860GII では関数入力時に ( が自動的に付かないので、計算の優先度については、より注意が必要。例えば、
fx-5800P での
Int(log(X)+1)→G ・・・(1)
は、fx-9860GII でそのまま使える。
fx-5800P で Int を入力すると Int( と表示されますが、fx-9860GII では Int + [スペース] と表示され、以下のように ( ) なしでの記述が可能で、エラー無しに動作する。
log X
sin X
Int log X +1→G ・・・(2)
式 (1) と 式 (2) は異なる結果を与えることに注意が必要だ。
式 (2) は、Int(log X)+1→G と同じだ。
式(1)と(2) が異なる結果を与える原因は、Int 関数が及ぶ範囲が異なっているためだ。つまり fx-9860GII で関数を使う際には、計算の優先度と順序をよく考えてなくてはいけない。入力時に ( ) を付けなくて良い仕様は、数式通り入力の機能を Casio Basic にそのまま適用したことによると推察されるが、プログラミングの立場から見れば改悪だと思う。fx-5800P の括弧付きの仕様に戻すべきだ。[2017/06/29 更新]
(1)と同じ計算結果を得るためには、(2)を
Int (log X +1)→G
と変更する必要がある。
fx-5800P から fx-9860GII に Casio Basic プログラムを移植する際、同一の動作をしない命令/コマンドをリストアップしたが、その中でも fx-9860GII 搭載 Caso Basic の " " (出力)命令は、完全互換の動作にするには、旧来の命令を使わずに Basic コマンドのみで互換動作を実現すればなんとかなりますが、fx-5800P からの移植の際に大幅にコードを書き直さなければならないケースがあります (経験済みです)。
これで苦労するくらいなら、" " (出力)命令を使わず、当ブログオリジナルの汎用サブルーチンである 入力ボックス 2.1G (fx-9860GII 専用) を使って入力部分を書き直す方が楽になることもあり(経験済み)、お勧めです。[2017/06/29 更新]
fx-5800P 搭載 Casio Basic は旧来の入出力命令とBasic準拠命令の折り合いがまだ良いのですが、fx-9860GII 搭載のマイナーバージョンアップした Casio Basic は旧来の入出力命令が使いにくくなっています。
旧来の入出力命令は fx-5800P でも柔軟だとは言えないのですが、fx-9860GII でさらに柔軟性が損なわれています。Casio Basic プログラムを書く時は、旧来の入出力命令を使わない方が良いのではないかと、私は思います。
Caso Basic進化に伴って旧来の命令を軽視する方向性が心配されますが、一方で 最新機種 fx-FD10 Pro では、単独の?(入力)命令が復活しています(マニュアルを読む限り)。旧来から慣れ親しんだ命令を多用するユーザーが多いのかも知れず、そのユーザーの利便性に配慮した復活かも知れません。
Basic準拠のコマンドについては、If 文、Do / While / For 文、その他制御命令や、電卓の表示方法を指定する ENG / Norm / FIX コマンドなど互換性はあるようです。
応援クリックをお願いします。励みになるので...