変換関数 (Apache OpenOffice 実行時ライブラリ)

From Apache OpenOffice Wiki
< EN/Documentation/BASIC Guide
Revision as of 06:19, 27 November 2008 by G11nAutomation (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Template:EN/Documentation/BASICGuideTOC/v2

プログラムを\'8d\'5c築する場合、ある変数の変数型を他の種類に変換する必要がよくあります。

変数型の暗黙的変換と明示的変換

変数型を変換する一番簡単な方法は、代入処理を利用することです。

Dim A As String
Dim B As Integer
 
B = 101 
A = B

このサンプルコードでは、変数 A は文字列型、変数 B は整数型として宣言しています。そしてこのような状況で変数 A に変数 B を代入すると、自動的に Apache OpenOffice Basic が変数 B の変数型を文字列型に変換します。このような変換では、見た目よりも複雑な処理が行われており、まず変数 B の整数値が、2 バイト長のデータとして作業用メモリに格納されます。A一方の変数は文字列型であるので、各文字 (文字や数字) ごとに 1 または 2 バイト長のデータとしてメモリ内に格納されています。このため変数 B に変数 A を代入する際には、変数 B 側の内部フォーマットに一致するよう、変数 A のデータを変換しておく必要があります。

他の多くのプログラミング言語とは異なり、Basic の場合、変数型の変換は自動的に実行されます。ただし、\'97\'5c想外の結果が生じることがあります。ここで、どのような問題が生じるかについて、以下のサンプルコードを使って検討をしてみます。

Dim A As String
Dim B As Integer
Dim C As Integer
 
B = 1 
C = 1
A = B + C

一見するとこのコードに特に問題はなさそうですが、目に見えない形で落とし穴が潜んでいます。Basic インタプリタは、最初に加算演算を行なってから、その結果を文字列変数に代入するので、ここで得られる結果は 2 という文字列になります。

逆に、Basic インタプリタが、最初に変数 B と変数 C の値を文字列に変換し、その結果に対してプラス記号による演算を適用するのであれば、得られる結果は 11 という文字列になります。

同様の問題は、バリアント型変数を使用する際にも生じます。

Dim A 
Dim B 
Dim C 
 
B = 1 
C = "1"
A = B + C

バリアント型変数には数値と文字列の両方のデータを格納できるため、この変数 A に代入されるのが数値 2 なのか文字列 11 なのかは不明です。

▼このような変数型の暗黙的変換に起因するエラーを回避するには、プログラム内にバリアント型変数を使用しないなど、このような点に注意してプログラミングを行う必要があります。

変数型の暗黙的変換に起因するエラーを防止する観点から、Apache OpenOffice Basic には各種の変換関数が用意されており、様々なデータ型に対する変換操作を行えるようになっています。

CStr(Var)
任意の型のデータを文字列に変換します。
CInt(Var)
任意の型のデータを整数値に変換します。
CLng(Var)
任意の型のデータをロング整数値に変換します。
CSng(Var)
任意の型のデータを単精度値に変換します。
CDbl(Var)
任意の型のデータを倍精度値に変換します。
CBool(Var)
任意の型のデータをブール値に変換します。
CDate(Var)
任意の型のデータを日付データに変換します。

これらの変換関数を使用することで、Apache OpenOffice Basic による型変換を明示的に実施することができます。

Dim A As String
Dim B As Integer
Dim C As Integer
 
B = 1 
C = 1
A = CStr(B + C)         ' B and C are added together first, then
                        ' converted to the string "2"
A = CStr(B) + CStr(C)   ' B and C are converted into a string,then
                        ' combined to produce the string "11"

このサンプルコードの最初の変換操作では、Apache OpenOffice Basic に整数値の加算を行わせてから、その結果を文字列に変換しています。変数 A に代入される値は、文字列の 2 となります。2 番目の変換操作では、整数変数の値を文字列に変換してから、代入時に結合処理を行なっています。変数 A に代入される値は、文字列の 11 となります。

数値変換用の CSng および CDbl 関数は、小数を扱うこともできます。ただしこの場合の小数点には、各地域ごとの各ロケール設定で指定されている小数点記号を使用する必要があります。また逆に、CStr メ\'83\'5cッドで数値、日付、時刻のデータを変換する際には、各ロケール設定による書式が適用されます。

Val 関数は、Csng, Cdbl メソッドおよび Cstr メソッドとは使用法が少し異なります。この関数は文字列を数値に変換しますが、小数点として使える記号はピリオドに固定されています。

Dim A As String
Dim B As Double
 
A = "2.22"
B = Val(A)      ' Is converted correctly regardless of the
                ' country-specific settings

変数の内容の確認

場合によってはデータの変換ができないことがあります。

Dim A As String
Dim B As Date
 
A = "test"
B = A            ' Creates error message

このサンプルコードからも分かるように、日付変数に test という文字列は代入できないので、このような場合 Basic インタプリタはエラーメッセージを表示します。同様のことは、ブール型変数に文字列を代入するような場合にも当てはまります。

Dim A As String
Dim B As Boolean
 
A = "test"
B = A            ' Creates error message

上記のサンプルコードでも、Basic インタプリタはエラーメッセージを\'95\'5c示します。

このようなエラーは、代入を行う前のプログラム行で、代入させるデータ型が変数型と一致するかをチェックさせることで回避できます。Apache OpenOffice Basic にはこのような処理を行うために、以下のテスト関数が用意されています。

IsNumeric(Value)
Value の値が数値であるかチェックします。
IsDate(Value)
Value の値が日付であるかチェックします。
IsArray(Value)
Value の値が配列であるかチェックします。

これらの関数は、ユーザーの入力値を受け取る際に有用です。たとえば数値や日付などの、想定される形式のデータをユーザーが入力したかをチェックできます。

If IsNumeric(UserInput) Then
  ValidInput = UserInput
Else
  ValidInput = 0
  MsgBox "Error message."
End If

上記のサンプルコードでは、変数 UserInput の値が数値であれば、その値を変数 ValidInput に代入しています。変数 UserInput の値が数値でなければ、変数 ValidInput には 0 を代入して、エラーメッセージを\'95\'5c示します。

Apache OpenOffice Basic の組み込み関数には、このような数値、日付、配列に対するテスト関数は用意されていますが、ブール値に対するテスト関数は用意されていません。このようなチェック機\'94\'5cが必要であれば、以下の関数 IsBoolean のような関数を記述することで実装できます。

Function IsBoolean(Value As Variant) As Boolean
  On Error Goto ErrorIsBoolean:
  Dim Dummy As Boolean
  Dummy = Value
  IsBoolean = True
  On Error Goto 0
  Exit Sub
 
  ErrorIsBoolean:
  IsBoolean = False
  On Error Goto 0
End Function

上記の関数 IsBoolean では、ブール型の局所変数 Dummy を用意して、与えられたデータをその中に代入させています。この代入が問題なく実行できれば、関数の戻り値として True を返します。そして代入に失敗した場合は、実行時エラーが発生するので、このテスト関数の実行は中断され、エラー処理を行います。

Template:Documentation/Note

Content on this page is licensed under the Public Documentation License (PDL).
Personal tools