「型」の版間の差分

提供: AB開発Wiki
移動先:案内検索
(差し戻し)
 
(4人の利用者による、間の12版が非表示)
1行目: 1行目:
 +
ActiveBasicは、全てのオブジェクトが型を持ち、変数なども型を持ちますが、静的型付けを採用しています。なお、型を暗黙の内に侵犯可能なため安全でない型付けに留まっています。
 +
 
== 型の種類 ==
 
== 型の種類 ==
* 基本型
+
;基本型
:: コンパイラが直接的に理解できる型のことを言います。詳細は基本型一覧をご覧ください。
+
:コンパイラが直接的に理解できる型のことを言います。詳細は基本型一覧をご覧ください。
* クラス
+
;[[クラス]]
:: Classステートメントで定義される型です。
+
:Classステートメントで定義される型です。
* 構造体
+
;[[構造体]]
:: Typeステートメントで定義される型です。
+
:Typeステートメントで定義される型です。
* 列挙体
+
;[[列挙体]]
:: Enumステートメントで定義される型です。
+
:Enumステートメントで定義される型です。
* デリゲート
+
;[[インタフェース]]
:: Delegateステートメントで定義される型です。
+
:Interfaceステートメントで定義される型です。
 +
;[[デリゲート]]
 +
:Delegateステートメントで定義される型です。
  
 +
===値型と参照型===
 +
ABでは、基本型及び構造体は値型として扱います。値型はローカル領域またはグローバル領域に配置され、インスタンスの生存期間はスコープレベルで決まります。
  
== 基本型一覧 ==
+
クラス型・インタフェース型・列挙型・デリゲート型は参照型です。これらの実体はヒープ領域に確保されます。インスタンスの生存期間は[[ガベージコレクション|ガベージコレクタ]]が管理します。
基本型とはコンパイラが直接的に認識できるデータの種類です。基本型は値を保持するためだけにある型ですので、オブジェクトとしての振る舞いはありません。
 
  
 +
==型の利用==
 +
===変数===
 +
変数の型は、[[Dimステートメント]]で指定します。
 +
Dim m As Long
 +
初期化子がある場合、初期化子の式の型から変数の型が決定可能です(型推論)。
 +
Dim x = 2.5 '2.5はDouble型なので、xはDouble型になる。
 +
なお、次のような場合は、初期化子がAs型変換演算子を含んだ式であると解釈されます。
 +
Dim y = x As Single
  
=== 整数型 ===
+
===関数===
 +
関数に[[AddressOf関数]]を使用すると、その関数に適合する関数へのポインタ型の値が得られます。
 +
Sub f1() : End Sub
 +
Dim pfn = AddressOf (f1) 'f1は*Sub()
  
==== Char ====
+
====引数・戻り値====
* 概要
+
基本的に変数と同じです。
:: 符号あり8ビット整数型
+
Function sq(x As Long) As Long
* サイズ
+
    sq = x * x
:: 1 byte
+
End Sub
* 値の範囲
+
上の例では、引数xとsqの戻り値がそれぞれLong型と宣言されています。
:: -128 ~ 127
 
  
 +
===クラス・構造体・共用体===
 +
===列挙体===
  
==== Byte ====
+
== 基本型一覧 ==
* 概要
+
基本型とはコンパイラが直接的に認識できるデータの種類です。基本型は値を保持するためだけにある型ですので、オブジェクトとしての振る舞いはありません。
:: 符号なし8ビット整数型
 
* サイズ
 
:: 1 byte
 
* 値の範囲
 
:: 0 ~ 255
 
  
 +
=== 整数型 ===
 +
{| border="1"
 +
|-
 +
|符号有型
 +
|範囲
 +
|大きさ
 +
|符号無型
 +
|範囲
 +
|-
 +
|SByte
 +
| -128 〜 127
 +
|1バイト
 +
|Byte
 +
|0 〜 256
 +
|-
 +
|Integer
 +
| -32,768 〜 32,767
 +
|2バイト
 +
|Word
 +
|0 〜 65,536
 +
|-
 +
|Long
 +
| -2,147,483,648 〜 2,147,483,647
 +
|2バイト
 +
|DWord
 +
|0 〜 4,294,967,295
 +
|-
 +
|Int64
 +
| -9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807
 +
|2バイト
 +
|QWord
 +
|0 〜 18446744073709551615
 +
|}
  
==== Integer ====
+
なお、Long/DWordは、Win32及びWin64においてC/C++などのint/unsgiend intに相当する最も自然な大きさの整数型です。特段事情が無ければ普段はLongとDWordを主に使います。
* 概要
 
:: 符号あり16ビット整数型
 
* サイズ
 
:: 2 byte
 
* 値の範囲
 
:: -32768 ~ 32767
 
 
 
 
 
==== Word ====
 
* 概要
 
:: 符号なし16ビット整数型
 
* サイズ
 
:: 2 byte
 
* 値の範囲
 
:: 0 ~ 65535
 
 
 
 
 
==== Long ====
 
* 概要
 
:: 符号あり32ビット整数型
 
* サイズ
 
:: 4 byte
 
* 値の範囲
 
:: -2147483648 ~ 2147483647
 
 
 
 
 
==== DWord ====
 
* 概要
 
:: 符号なし32ビット整数型
 
* サイズ
 
:: 4 byte
 
* 値の範囲
 
:: 0 ~ 4294967295
 
 
 
 
 
==== Int64 ====
 
* 概要
 
:: 符号あり64ビット整数型
 
* サイズ
 
:: 8 byte
 
* 値の範囲
 
:: -9223372036854775808 ~ 9223372036854775807
 
 
 
 
 
==== QWord ====
 
* 概要
 
:: 符号なし64ビット整数型
 
* サイズ
 
:: 8 byte
 
* 値の範囲
 
:: 0 ~ 18446744073709551616
 
 
 
  
 
=== 浮動小数点型 ===
 
=== 浮動小数点型 ===
 +
x86/x64の仕様により、IEEE 754の単精度・倍精度の形式に対応しています。
  
 
==== Single ====
 
==== Single ====
* 概要
+
;概要
:: 単精度浮動小数点型
+
:単精度浮動小数点型
* サイズ
+
;サイズ
:: 4 byte
+
:4 byte
* 値の範囲
+
;値の範囲
:: 3.4E +/- 38 (7 桁)
+
:3.4E +/- 38 (7 桁)
 
 
  
 
==== Double ====
 
==== Double ====
* 概要
+
;概要
:: 倍精度浮動小数点型
+
:倍精度浮動小数点型
* サイズ
+
;サイズ
:: 8 byte
+
;8 byte
* 値の範囲
+
;値の範囲
:: 1.7E +/- 308 (15 桁)
+
:1.7E +/- 308 (15 桁)
 
 
  
 
=== ブーリアン ===
 
=== ブーリアン ===
  
 
==== Boolean ====
 
==== Boolean ====
* 概要
+
;概要
:: 真偽値を見分けるための型
+
:真偽値を見分けるための型
* サイズ
+
;サイズ
:: 1 byte
+
:1 byte
* 値の種類
+
;値の種類
:: True or False
+
:True or False
:: ※内部表現は True = 1、False = 0 となります。比較演算の戻り値はBoolean型です。
+
:※内部表現は True = 1、False = 0 となります。比較演算の戻り値はBoolean型です。
  
 +
=== ポインタ型 ===
 +
ABでは、他のBasic言語ではあまり見ることのないポインタ型の扱いに対応しています。メモリ内部を詳細に指定できるポインタ機能、ハードに近いレベルでの利用が可能ですが、使い方によってはバグを引き起こす原因にもなります。必要なときは細心の注意を払って利用していくのが望ましいでしょう。Win32 APIを直接的に利用する場合などに利用を留めておきましょう。
  
=== プラットフォームによって異なるサイズを持つ型 ===
+
;概要
 +
:オブジェクトを指し示す型、実態はアドレス値を保持する整数型となっている
 +
;サイズ
 +
:4 byte (in Win32) or 8 byte (in Win64)
  
==== LONG_PTR ====
+
==== VoidPtr ====
Win32 (x86)の環境ではLong型として認識されます。Win64 (x64)の環境ではInt64型として認識されます。
+
どのようなオブジェクトを指し示すこともできるポインタ型です。
 +
 
 +
==== その他オブジェクトへのポインタ型 ====
 +
型名に*を前置すると、その型を指し示すポインタ型を意味します。例: *Byte, *String
  
 +
==== 関数へのポインタ型 ====
 +
関数宣言に*を前置すると、その関数を指し示すポインタ型を意味します。例: *Sub(x As Double), *Function(ptr As VoidPtr)
  
==== ULONG_PTR ====
+
As DWord。詳しくは[[関数#関数ポインタ]]を参照してください。
Win32 (x86)の環境ではDWord型として認識されます。Win64 (x64)の環境ではQWord型として認識されます。
 
  
 +
===Object===
 +
Objectは、全てのクラスの基底クラスです。そのため、全てのクラスのインスタンスはObjectへの型変換が可能です。
 +
Class Aima
 +
End Class
 +
 +
Dim a = New Aima
 +
Dim o = a As Object
  
=== ポインタ型 ===
+
なお、Objectの実態はSystem.Objectとしてライブラリ内に存在します。メンバなどは[[Objectクラス]]を参照してください。
ABでは、他のBasic言語ではあまり見ることのないポインタ型の扱いに対応しています。メモリ内部を詳細に指定できるポインタ機能、ハードに近いレベルでの利用が可能ですが、使い方によってはバグを引き起こす原因にもなります。必要なときは最新の注意を払って利用していくのが望ましいでしょう。
 
Win32APIを直接的に利用する場合などに利用を留めておきましょう。
 
  
==== VoidPtr ====
+
===String===
どのようなオブジェクトを指し示すこともできるポインタ型です。Win32 (x86)の環境では4 byte、Win64 (x64)の環境では8 byteです。
+
Stringは、文字列型です。実態はSystem.Stringとしてライブラリ内に存在します。メンバなどは[[Stringクラス]]を参照してください。
  
==== その他オブジェクトへのポインタ型 ====
+
== ライブラリで定義される型 ==
型名に*を前置すると、その型を指し示すポインタ型を意味します。例: *Byte, *String
+
これらの型は全てインクルードファイルの中でTypeDefによって定義されています。
/* とりあえずオブジェクトという言葉を用いましたがほかに適切なものはあるでしょうか。*/
 
  
==== 関数へのポインタ型 ====
+
=== 整数型 ===
関数宣言に*を前置すると、その関数を指し示すポインタ型を意味します。例: *Sub(x As Double), *Function(ptr As VoidPtr) As DWord。詳しくは[[関数#関数ポインタ]]を参照してください。
 
  
 +
==== LONG_PTR ====
 +
Win32 (x86)の環境ではLong型として認識されます。Win64 (x86-64)の環境ではInt64型として認識されます。ULONG_PTRと共に、ポインタ値を保持できる整数型として使用されます。
  
== 値型と参照型 ==
+
==== ULONG_PTR ====
ABでは、基本型及びクラス・構造体・列挙体・デリゲートから定義された変数はデフォルトで値型になります。Newやmallocなどで明示的にヒープ領域にデータを生成しない限り、すべての変数データはローカル領域またはグローバル領域に配置されます。値型はポインタを一切利用しないため、最も安全な型として利用できます。
+
Win32 (x86)の環境ではDWord型として認識されます。Win64 (x86-64)の環境ではQWord型として認識されます。
  
値型の生存期間はスコープ単位で決まります。例えば、下記のようなコードはエラーです。Dimステートメントで生成され、スコープを抜け出す際に破棄されます。
+
==== SIZE_T ====
 +
SIZE_Tはメモリの大きさを表す符号無し整数型で、現在ULONG_PTRからTypeDefされています。
  
Do
+
==== SSIZE_T ====
    Dim message As String
+
SIZE_Tの符号有り版で、現在LONG_PTRからTypeDefされています。
Loop
 
message = "test"
 
  
また、変数やオブジェクトを指し示すための手段として、ポインタ以外に参照を活用できます。ByRef修飾子を活用することで値型として定義された変数の参照を作ることができます。
+
=== ポインタ型 ===
 +
次の型が互換性のためそれぞれ定義されています。
 +
==== BytePtr ====
 +
<nowiki>*ByteからのTypeDef</nowiki>
 +
==== WordPtr ====
 +
<nowiki>*WordからのTypeDef</nowiki>
 +
==== DWordPtr ====
 +
<nowiki>*DWordからのTypeDef</nowiki>
 +
==== SinglePtr ====
 +
<nowiki>*SingleからのTypeDef</nowiki>
 +
==== DoublePtr ====
 +
<nowiki>*DoubleからのTypeDef</nowiki>
  
' 変数の参照をパラメータとして引き渡すケース
+
=== 文字型 ===
Sub proc( ByRef a As Long )
+
==== Char ====
    ' 実引数に影響がある
+
;概要
    a = 200
+
:1文字を表現するための型です。
End Sub
+
;サイズ
+
:1 byte(マルチバイト環境)
Dim i = 100 As Long
+
:2 byte(Unicode環境)
proc( i )
+
現在CharはTypeDefで定義されています。
  
' 変数の参照を作るケース
+
==== WCHAR ====
Dim message As String
+
WCHARは常にUnicode (UCS-2/UTF-16LE)文字を保持する2バイトの型です。
message = "This is a white pen."
 
 
Dim ByRef refMessage = message
 
refMessage = "This is a black pen."      ' messageにも影響がある。
 
  
' 戻り値を参照で返すケース
+
[[Category:言語仕様|かた]]
Dim message = "This is a white pen." As String
 
Function proc() ByRef As String
 
    Return message
 
End Function
 
 
Dim refMessage = proc()
 
refMessage = "This is a black pen."      ' messageにも影響がある。
 

2011年1月15日 (土) 17:41時点における最新版

ActiveBasicは、全てのオブジェクトが型を持ち、変数なども型を持ちますが、静的型付けを採用しています。なお、型を暗黙の内に侵犯可能なため安全でない型付けに留まっています。

型の種類

基本型
コンパイラが直接的に理解できる型のことを言います。詳細は基本型一覧をご覧ください。
クラス
Classステートメントで定義される型です。
構造体
Typeステートメントで定義される型です。
列挙体
Enumステートメントで定義される型です。
インタフェース
Interfaceステートメントで定義される型です。
デリゲート
Delegateステートメントで定義される型です。

値型と参照型

ABでは、基本型及び構造体は値型として扱います。値型はローカル領域またはグローバル領域に配置され、インスタンスの生存期間はスコープレベルで決まります。

クラス型・インタフェース型・列挙型・デリゲート型は参照型です。これらの実体はヒープ領域に確保されます。インスタンスの生存期間はガベージコレクタが管理します。

型の利用

変数

変数の型は、Dimステートメントで指定します。

Dim m As Long

初期化子がある場合、初期化子の式の型から変数の型が決定可能です(型推論)。

Dim x = 2.5 '2.5はDouble型なので、xはDouble型になる。

なお、次のような場合は、初期化子がAs型変換演算子を含んだ式であると解釈されます。

Dim y = x As Single

関数

関数にAddressOf関数を使用すると、その関数に適合する関数へのポインタ型の値が得られます。

Sub f1() : End Sub
Dim pfn = AddressOf (f1) 'f1は*Sub()

引数・戻り値

基本的に変数と同じです。

Function sq(x As Long) As Long
    sq = x * x
End Sub

上の例では、引数xとsqの戻り値がそれぞれLong型と宣言されています。

クラス・構造体・共用体

列挙体

基本型一覧

基本型とはコンパイラが直接的に認識できるデータの種類です。基本型は値を保持するためだけにある型ですので、オブジェクトとしての振る舞いはありません。

整数型

符号有型 範囲 大きさ 符号無型 範囲
SByte -128 〜 127 1バイト Byte 0 〜 256
Integer -32,768 〜 32,767 2バイト Word 0 〜 65,536
Long -2,147,483,648 〜 2,147,483,647 2バイト DWord 0 〜 4,294,967,295
Int64 -9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807 2バイト QWord 0 〜 18446744073709551615

なお、Long/DWordは、Win32及びWin64においてC/C++などのint/unsgiend intに相当する最も自然な大きさの整数型です。特段事情が無ければ普段はLongとDWordを主に使います。

浮動小数点型

x86/x64の仕様により、IEEE 754の単精度・倍精度の形式に対応しています。

Single

概要
単精度浮動小数点型
サイズ
4 byte
値の範囲
3.4E +/- 38 (7 桁)

Double

概要
倍精度浮動小数点型
サイズ
8 byte
値の範囲
1.7E +/- 308 (15 桁)

ブーリアン

Boolean

概要
真偽値を見分けるための型
サイズ
1 byte
値の種類
True or False
※内部表現は True = 1、False = 0 となります。比較演算の戻り値はBoolean型です。

ポインタ型

ABでは、他のBasic言語ではあまり見ることのないポインタ型の扱いに対応しています。メモリ内部を詳細に指定できるポインタ機能、ハードに近いレベルでの利用が可能ですが、使い方によってはバグを引き起こす原因にもなります。必要なときは細心の注意を払って利用していくのが望ましいでしょう。Win32 APIを直接的に利用する場合などに利用を留めておきましょう。

概要
オブジェクトを指し示す型、実態はアドレス値を保持する整数型となっている
サイズ
4 byte (in Win32) or 8 byte (in Win64)

VoidPtr

どのようなオブジェクトを指し示すこともできるポインタ型です。

その他オブジェクトへのポインタ型

型名に*を前置すると、その型を指し示すポインタ型を意味します。例: *Byte, *String

関数へのポインタ型

関数宣言に*を前置すると、その関数を指し示すポインタ型を意味します。例: *Sub(x As Double), *Function(ptr As VoidPtr)

As DWord。詳しくは関数#関数ポインタを参照してください。

Object

Objectは、全てのクラスの基底クラスです。そのため、全てのクラスのインスタンスはObjectへの型変換が可能です。

Class Aima
End Class

Dim a = New Aima
Dim o = a As Object

なお、Objectの実態はSystem.Objectとしてライブラリ内に存在します。メンバなどはObjectクラスを参照してください。

String

Stringは、文字列型です。実態はSystem.Stringとしてライブラリ内に存在します。メンバなどはStringクラスを参照してください。

ライブラリで定義される型

これらの型は全てインクルードファイルの中でTypeDefによって定義されています。

整数型

LONG_PTR

Win32 (x86)の環境ではLong型として認識されます。Win64 (x86-64)の環境ではInt64型として認識されます。ULONG_PTRと共に、ポインタ値を保持できる整数型として使用されます。

ULONG_PTR

Win32 (x86)の環境ではDWord型として認識されます。Win64 (x86-64)の環境ではQWord型として認識されます。

SIZE_T

SIZE_Tはメモリの大きさを表す符号無し整数型で、現在ULONG_PTRからTypeDefされています。

SSIZE_T

SIZE_Tの符号有り版で、現在LONG_PTRからTypeDefされています。

ポインタ型

次の型が互換性のためそれぞれ定義されています。

BytePtr

*ByteからのTypeDef

WordPtr

*WordからのTypeDef

DWordPtr

*DWordからのTypeDef

SinglePtr

*SingleからのTypeDef

DoublePtr

*DoubleからのTypeDef

文字型

Char

概要
1文字を表現するための型です。
サイズ
1 byte(マルチバイト環境)
2 byte(Unicode環境)

現在CharはTypeDefで定義されています。

WCHAR

WCHARは常にUnicode (UCS-2/UTF-16LE)文字を保持する2バイトの型です。