連載

プロフェッショナルVB.NETプログラミング

第2回 データ型の処理

(株)ピーデー
川俣 晶
2002/04/11
Page1 Page2 Page3 Page4 Page5 Page6

同じデータ型の変数の宣言

 Dimステートメントで変数を宣言する際に、データ型を明示しない変数と明示する変数を同時に宣言すると、VB 6とVB.NETでは結果が異なる場合がある。以下にその例をご紹介する。まずはVB 6で記述して正常に動作するサンプル・ソースを示す。

1: Private Sub Form_Load()
2:   Dim a, b As Integer
3:   a = 32768
4:   b = 1
5:   Debug.Print a + b
6: End Sub
データ型を明示しない変数と明示する変数を同時に宣言しているVB 6のサンプル・プログラム11

 これを実行すると以下の結果を表示する。

32769
サンプル・プログラム11の実行結果

 このソースでは、aはVariant型、bはInteger型になり、Integer型には入らない大きな数32768をVariant型に代入することは何の問題もない。

 さて、次は同じソースをVB.NETで記述した場合である。

1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2:   Dim a, b As Short
3:   a = 32768
4:   b = 1
5:   Trace.WriteLine(a + b)
6: End Sub
サンプル・プログラム11と同じ内容をVB.NETで記述したサンプル・プログラム12

 このソースでは数値範囲を一致させるためにIntegerをShortに置き換えている。これをビルドすると以下のようなコンパイル・エラーになる。

Q:\aWrite\@it\VB.NET\002\smpl\sample006n\Form1.vb(47) : error BC30439: 定数式は、型 'Short' では表現できません。
サンプル・プログラム12をビルドしたときのコンパイル・エラー

 エラーが起きたのは47行目と表示されているが、上記抜粋では3行目に当たる。3行目に記述された変数aはShort型であるため、32768を入れるには小さすぎるということがコンパイラにより指摘されたのである。2行目の変数宣言は、VB 6ではaの指定が省略されたと見なされVariant型になるが、VB.NETではa、bの両方がShort型と見なされ、aのデータ型指定が省略されたとは見なされない。その結果、2つのソースは同じ意味を持つものとして扱われないことになる。

 このようなトラブルを回避するには、できるだけ変数のデータ型を明示的に付けるように習慣付ければよいだろう。

配列添え字の下限

 コンピュータの世界では、数を数えるときに1ではなく、0からカウントすることが多い。しかし、これは一般常識としてはなじみにくい。VB 6には、配列の添え字を0から使うか1から使うかを指定するOption Baseという機能があった。以下はそれを用いて、1から数えるようにしたサンプル・ソースである。

 1: Option Base 1
 2: Private Sub Form_Load()
 3:   Dim a(10) As Integer
 4:   For i = 1 To 10
 5:     a(i) = i * 2
 6:   Next
 7:   For i = 1 To 10
 8:     Debug.Print a(i)
 9:   Next
10: End Sub
配列の添え字の始まりを1に指定したVB 6のサンプル・プログラム13

 これを実行すると以下のようになる。

2
4
6
8
10
12
14
16
18
20
サンプル・プログラム13の実行結果

 VB.NETには、Option Baseが存在しないため、配列の下限を1に設定することができない。そのため、以下のように下限が0であることを前提とするコードに書き換えねばならない。

1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2:   Dim a(9) As Integer, i As Integer
3:   For i = 0 To 9
4:     a(i) = (i + 1) * 2
5:   Next
6:   For i = 0 To 9
7:     Trace.WriteLine(a(i))
8:   Next
9: End Sub
サンプル・プログラム13をVB.NETで書き換えたサンプル・プログラム14

 これを実行すると以下のようになる。

2
4
6
8
10
12
14
16
18
20
サンプル・プログラム14の実行結果

 これについては、楽な解決方法が何もない。地道にソースの書き方を変えていくしか対処方法がないだろう。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第2回 データ型の処理
    1.まずは小さなプログラムから
    2.整数型の表現力
    3.そのほかのデータ型の互換性
  4.同じデータ型の変数の宣言
    5.配列のサイズ変更
    6.配列の次元数の変更
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間