型の変換
前章にinput命令、mesbox命令でエディットオブジェクトを配置できるようになりました。
文字が入力できるようになると、できることがグンと広がりますね。
さて、代入された2つの数字を計算させるプログラムを作るとしましょう。
仕様1:1文字分(0〜9)が入力できる2つの入力ボックスを配置する。
仕様2:入力ボックス初期値は空欄とする
仕様3:入力された2つの値はコンボボックスを用いて加減乗除を選択できるようにする
仕様4:自動計算は[計算]ボタンを押したタイミングとして、「答えは○○」とダイアログ表示する
今までの知識だけで完成させることが出来ますね?早速作ってみてください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
sdim value, 2, 2 // 何も表示させないようにするためには文字列型
pos 50, 50 : input value.0, 20, 20, 1
pos 150, 50 : input value.1, 20, 20, 1
pos 80, 50 : combox select, , "+\n−\n×\n÷"
pos 200, 50 : button "計算", *calc
stop
*calc
switch select
case 0: answer = (0 + value.0) + (0 + value.1) : swbreak
case 1: answer = (0 + value.0) - (0 + value.1) : swbreak
case 2: answer = (0 + value.0) * (0 + value.1) : swbreak
case 3: answer = (0 + value.0) / (0 + value.1) : swbreak
swend
dialog "答えは" + answer
|
こんな感じに仕上がりましたか?(0除算制御処理は入れていません)
10〜13行目で「(0 + value.0)」「(0 + value.1)」と言うものがあります。
これは、入力ボックスに入れられた入力内容は数字であっても、
演算可能な数値ではなく、文字の数字であると認識されて減算や除算等を実行できないために
HSPの「左部にある値の型に合わせる」仕様に基づき、無理矢理数値化させているわけです。
もし、初期値0でもOK(仕様2抜き)なら、
1行目を「dim value, 2」と書いておくだけで数値化させる必要はありません。
演算する時は数値型でなければならないのは当たり前の話であり、
通常は数値型の変数に代入させて計算することでしょう。
しかし、場合によっては今回のように文字列型に入っている数字テキストを数値として、
それを演算しなくてはならないときもあるかもしれません。
また、逆の数値を数字テキストとして加算ではなく文字連結させたい場合や、
実数値を一時的に整数値として、整数値を一時的に実数値として演算させたい場合など、
一時的、又はこれから恒久的に本来の型とは異なる型で扱いたい場合があるのなら今回同様、
先頭に0を足せば整数型、0.0で実数型、空文字で文字列型に変更(キャストと呼ぶ)できます。
が、プログラム上この書き方はよろしくありません…。
HSPだからキャストできたものの、別の言語だと出来ないことがほとんどでしょうし、
HSPであっても、後から見たときに何故0を足しているのか忘れて、
いらなくてもコンパイルが通ることからうっかり消してしまい、障害の要因になってしまうかもしれません。
前置きが長くなりましたが、この章では明示的な変数の型変換を行います。
| 整数値 = int(変換元テキスト) |
| | | |
| 整数値 | 変換後の整数値。 |
| 変換元テキスト | 変換対象の文字や値、式など。 |
HSP2以前では命令であったint関数のパラメータは、
単純に変換元の値(整数・実数)や文字列テキスト、数式を指定すれば、
後は受け取り先を指定すれば手続き完了です。
指定パラメータがどのように変換されるかと申しますと、パラメータが文字列テキストの場合、
左から順に数字か否かをチェックし、数字以外の文字が来たところまでを数値とします。
もし、1文字目がいきなり数字以外の文字だと0となります。
当然のことながら、オーバーフロー・アンダーフローするような値となる場合は、
指定したそのままの数値とはなりません。
おまけ的な使い方ですが、int関数は16進数の値を10進数にする機能もあります。
スクリプトとして「0x」か「$」を値の頭に付けると、16進数とみなされますが、
プログラム内の値を16進数として使いたい場合は、strf関数で変換するか、「$」を使います。
pos 50, 50 : mes "$"
pos 65, 50 : input v, 50, 20, 6
pos 120, 50 : button "変換", *convert
stop
*convert
color 255, 255, 255 : boxf 200, 50 : color
pos 200, 50 : mes "→ " + int("$" + v)
|
続いて、文字列型への変換を行います。
| 文字列 = str(変換元テキスト) |
| | | |
| 文字列 | 変換後の文字列。 |
| 変換元テキスト | 変換対象の文字や値、式など。 |
int関数同様にHSP2以前では命令として存在していましたが、関数として生まれ変わり、
また、数値文字列の桁数指定、及び16進数化はこの関数で出来なくなりました。
桁数指定と16進数化は、以前に紹介しているstrf関数で行ってください。
このstr関数では、単純に指定されたパラメータを文字列として返す処理だけを行います。
2行目で文字列化しているにもかかわらず、演算された結果の579が表示されているのは、
既に書いたように「式は左部の型に合わされるHSPの仕様」のためです。
最後に、実数型への変換を行います。
| 実数値 = double(変換元テキスト) |
| | | |
| 実数値 | 変換後の実数値。 |
| 変換元テキスト | 変換対象の文字や値、式など。 |
HSP2以前ではそもそも実数型がなかったので、実数型へキャストする命令などは存在しませんでしたが、
int関数、str関数の命令から関数化に伴い、double関数が新しく仲間入りしました。
処理内容、パラメータ指定の仕方はint関数、str関数と同じです。
int関数は、左にある数字部分だけを数値として変換しましたが、
double関数は実数値であるために、左の数字部分、及び小数点を示す1つ目のドットまで、
言い換えると、2つ目のドットまたは、数字以外の文字が来るまでを実数値として返します。
既に書いたように、HSPでは先頭に指定した型の値を置くことで、キャストすることが出来ます。
できれば、キャストはこの書き方にするのが一番ですが、
しないにしても、この章で書いたような変換を書くのが普通だということだけは覚えておきましょう。