none
chr関数のコードの範囲 RRS feed

  • 質問

  • 現在、VB2010でコーディングを行っていますが、Chr関数に128~255の範囲の値をセットすると、「定数が必要です」のエラーが発生してしまいます。

    原因がすぐ解る方がおられましたらご教授頂けませんでしょうか

    よろしくお願いいたします

    2012年3月21日 9:30

回答

  • # TH01さんの指摘も踏まえつつ…。

    Chr(128)としてどのような値を期待しているのでしょうか? Chr関数のドキュメントによると

    Chr は、System.Text 名前空間の Encoding クラスを使って、現在のスレッドが 1 バイト文字セット (SBCS) と 2 バイト文字セット (DBCS) のどちらを使用するのかを判断します。 それに基づいて、CharCode を適切なセットのコード ポイントとして受け取ります。 SBCS 文字の範囲は 0 ~ 255 で、DBCS 文字の範囲は -32768 ~ 65535 です。

    とまぁ、ややこしいことが書かれていますが要約すると実行時のスレッド、ひいては実行に使用しているOS言語などによって返される値が異なります。日本語なら日本語としての128(128~256の中には半角カタカナも含まれますね)、フランス語ならフランス語の128といったように、それぞれ異なります。

    それに対してTH01さんの提示されているChrW関数はUnicodeを扱うため、言語に依存しません。つまりコンパイル時に確定でき定数として扱えます。

    そこで元の質問に戻りますが、MMU_takaさんとしてはChr(128)としてどのような値を期待してそのコードを記述したのでしょうか? それによって解決策が変わってきます。

    • 回答の候補に設定 山本春海 2012年3月30日 9:20
    • 回答としてマーク 山本春海 2012年4月19日 6:36
    2012年3月22日 6:01
  • コンパイルの際、Chr(127) は結果値に変換されますが、Chr(128) の方はメソッド呼び出しのまま残るようです。なので次のように定数が必要な個所ではコンパイルエラーになります。
    (当方は Visual Studio 2008 の環境で確認)

    Private Const 定数1 As Char = Chr(127) '→ 結果値に変換される
    Private Const 定数2 As Char = Chr(128) '→ Microsoft.VisualBasic.Strings.Chr(&H80) のまま

    定数で利用する場合は ChrW(128) と書けば良いみたいです。

    Private Const 定数1 As Char = ChrW(127)
    Private Const 定数2 As Char = ChrW(128)


    • 編集済み TH01 2012年3月22日 5:37 間違いを修正
    • 回答の候補に設定 山本春海 2012年3月30日 9:20
    • 回答としてマーク 山本春海 2012年4月19日 6:36
    2012年3月22日 3:50

すべての返信

  • コンパイルエラーになるのでしょうか?
    Visual Studio 2010 で軽く以下のコードを書く限りではエラーにならなかったので…。

    Sub Main()
        Dim a As Char = Chr(128)
    End Sub


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    2012年3月21日 14:17
    モデレータ
  • コンパイルの際、Chr(127) は結果値に変換されますが、Chr(128) の方はメソッド呼び出しのまま残るようです。なので次のように定数が必要な個所ではコンパイルエラーになります。
    (当方は Visual Studio 2008 の環境で確認)

    Private Const 定数1 As Char = Chr(127) '→ 結果値に変換される
    Private Const 定数2 As Char = Chr(128) '→ Microsoft.VisualBasic.Strings.Chr(&H80) のまま

    定数で利用する場合は ChrW(128) と書けば良いみたいです。

    Private Const 定数1 As Char = ChrW(127)
    Private Const 定数2 As Char = ChrW(128)


    • 編集済み TH01 2012年3月22日 5:37 間違いを修正
    • 回答の候補に設定 山本春海 2012年3月30日 9:20
    • 回答としてマーク 山本春海 2012年4月19日 6:36
    2012年3月22日 3:50
  • # TH01さんの指摘も踏まえつつ…。

    Chr(128)としてどのような値を期待しているのでしょうか? Chr関数のドキュメントによると

    Chr は、System.Text 名前空間の Encoding クラスを使って、現在のスレッドが 1 バイト文字セット (SBCS) と 2 バイト文字セット (DBCS) のどちらを使用するのかを判断します。 それに基づいて、CharCode を適切なセットのコード ポイントとして受け取ります。 SBCS 文字の範囲は 0 ~ 255 で、DBCS 文字の範囲は -32768 ~ 65535 です。

    とまぁ、ややこしいことが書かれていますが要約すると実行時のスレッド、ひいては実行に使用しているOS言語などによって返される値が異なります。日本語なら日本語としての128(128~256の中には半角カタカナも含まれますね)、フランス語ならフランス語の128といったように、それぞれ異なります。

    それに対してTH01さんの提示されているChrW関数はUnicodeを扱うため、言語に依存しません。つまりコンパイル時に確定でき定数として扱えます。

    そこで元の質問に戻りますが、MMU_takaさんとしてはChr(128)としてどのような値を期待してそのコードを記述したのでしょうか? それによって解決策が変わってきます。

    • 回答の候補に設定 山本春海 2012年3月30日 9:20
    • 回答としてマーク 山本春海 2012年4月19日 6:36
    2012年3月22日 6:01