文字は文字として表示できますが計算しようとするとエラーが出たり、
「1 + "2"」は「3」で問題ないですが「"1" + 2」は「12」となってしまいます。
文字列型の数値を数値型の数値にするにはint命令を使用します。
元々数値型の数値にint命令を使用しても何も起こりません(エラーがでません)。
数値と文字の両方入った変数を数値化した場合文字の手前までが数値化され文字部分は無視され、
初めから文字の入った変数は「0」となります。
ファイルからロードしたテキストはたとえ数値であったとしても文字として読み込まれます。
moji1 = "789abc"
moji2 = "xyz123"
int moji1
int moji2
mes moji1
mes moji2
stop
num = 123
num = "" + num
stop
とすることで数値を文字化できますが命令としてきちんと用意されています。
数値型でも文字型にするstr命令と呼ばれるものです。
0なら"0"という文字に置き換える、とこんな感じで書式は「str 変換する変数,オプション」です。
p1のオプションに10進数または16進数の何桁にするかのオプションを決めることができます。
0または省略すると桁はそのままで数値を文字とするだけです。
1〜15を指定すると10進数の1〜15桁にすることができます。
数値の桁以上の桁指定をした場合は0が数値の前に付きます。例として12で3桁にすると012となる。
16〜31は16進数の1〜15桁にします。例として10ならaとなります。
16進数って何なの、知りたいって人はトリビアへどうぞ。
指定した桁が変数の値以下の場合は0を指定したことと同じ結果になります。
value = 123
str value, 5
mes "10進数5桁表示 " + value
int value ; 一旦数値に戻す(戻さないと次の16進数にできない)
str value, 21
mes "16進数5桁表示 " + value
stop
valがヘルプに載っていますがvalといったステートメントはありません。
変数に代入する「a = 100」といった今まで普通に使ってきた代入のやり方のことです。
また現在はまだお話しませんがモジュールというもので変数を引数指定するという時にvalと書きます。
int命令は文字型の数値を数値化して計算できるようにしたものです。
「A」などの文字も計算できると便利ですよね?
peek命令を使うとその文字のアスキーコードを調べることが出来ます。
書式は「peek アスキーコードの入れる変数,取り出し元の変数,何バイト目を取り出すか」です。
例えば「A」なら65「B」は66「C」は67…とつながった数値となっています。
ためしに「a」でやってみましょう。
moto = "a"
peek suu, moto, 0 ; 変数motoの0バイト目を数値化し変数suuに入れる
mes suu
stop
97ってでてきましたね?
bなら98、cなら99…と言った具合です。
ドライブとかの「A:\」とかに使えますねぇ…。
peek命令とは逆の機能poke命令でアスキーコードを文字化することもできます。
書式は「poke 文字化して入れる変数,何バイト目に入れるか,アスキーコードとなる数値・変数」です。
p1にはアスキーコードをを指定します。
peekと違いp2にはp1の変数の何文字(バイト)目に入れるかを指定します。
例としてA〜Zまでを表示するサンプルを下記に書きます。
moto"A"
repeat 26
peek suu, moto, 0 ; 数値化
code = moto
suu++
poke moto, 0, suu ; 文字化
mes "文字 = " + code
loop
stop
poke命令用のアスキーコード指定の代わりにシングルクォートで囲んだ文字を指定してもOK。
buf = 'A' ; Aのアスキーコードを入れる
mes "buf = " + buf
moji = ""
poke moji, , buf
mes "moji = " + moji
stop
上に示したシングルクォートで2バイト文字を入れようとしてみてください。
buf = 'あ' ; 「あ」のアスキーコード?
mes "buf = " + buf
moji = ""
poke moji, , buf
mes "moji = " + moji
stop
コードが130で変な記号のようなものが表示されたと思います。
アレはバグっているわけでも何でもありません。
2バイト(全角)文字と言うくらいで1文字で2バイトあるんですね。
peek,poke命令では1バイトの出し入れしか出来ないのです。
全角英数字やひらがな・漢字を数値化したい場合はwpeekを使います。
なぜ1バイト文字でないのかと言うと、1バイトで扱える数よりはるかに多いからです。
0〜255の256種類しか扱えない1バイトに対して2バイトはその256倍
0〜65535の65536種類もの文字を扱えるのです。
wpeek命令の書式はpeek命令と同じで「wpeek 結果を入れる変数,アスキーコード,何バイト目か」です。
buf = "あ"
wpeek num, buf
mes "" + buf + " = " + num
stop
アスキーコードは41090(160 << 8 + 130)と出て来たと思います。
では次に「い」を取り出してみてください。41602(162 << 8 + 130)と出て来ませんでしたか?
なんか一気に飛んでいますね。
ひらがなはアルファベットのように続いてはいないのでしょうか?
…そうではないようです。
そもそも「あ」の次は「い」ではありません。
ひらがな部分を少し抜き出すと「ぁあぃいぅうぇえぉおかがきぎ…」となっています。
「あ」の次だと言う「ぃ」を抜き出してください。
41346(161 << 8 + 130)と出ます。
コレでもまだ連番ではないですね。
でも「あ」→「ぃ」→「い」は256ずつ増えていっていますね。
コレは偶然ではなく次の「ぅ」も「い」の256足したものです。
2バイト文字は256飛びなんですが、コレは2バイト目が1ずつ増えた結果です。
wpeekに対する2バイト書き込み命令名はもう想像に難くないでしょう。
そう。wpoke命令で書式も同じく「wpoke 代入する変数,何バイト目か,アスキーコード」です。
別にpeek,poke命令で1バイトずつ読み書きしていってもできないことはありません。
buf = "あいう"
buf2 = ""
repeat 2
peek tmp, buf, cnt
poke buf2, cnt, tmp
loop
mes buf2
stop
1バイトである0〜255のアスキーコードをwpoke命令で書き込んでもきちんと認識されます。
poke命令で書き忘れていたのですが、p1に指定する変数が文字列型でないと数値がそのまま入ります。
文字列として書き込みたい場合は必ず文字列型で宣言等してください。
buf=41090
wpoke buf2, , buf
mes buf2
stop