SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

VB 入門編7 - NULL 概念、chr(0)、&H0、\0、IsNull

■NULL 概念

  ・様々な開発言語で NULL(ヌル) と言う言葉が出てくるが、言語によって微妙
    に意味合いが違う。
    基本的には NULL は、ないことを意味している。

■VB NULL 概念

  ・文字列の長さが 0 のヌル文字は、"" となる。

  dim s as string

  s = ""                            '長さ 0 のヌル文字

  ・Windows API など、C 言語インターフェースでの NULL 文字は、chr(0) で
    現される。(コード 0x00 の文字)
    これは、C 言語が文字列の終わりを 0x00 で識別しているためである。
    つまり、"abc" は、C 言語では、「a」「b」「c」「\0」と記憶領域にセ
    ットされている。C 構文では、NULL == 0 である。
    VB の文字列型には、最後の NULL 文字は存在しないので注意する。

  dim s as string

  s = "abc" & chr(0)                'C 言語風文字列作成
  s = "abc" & chr(&H0)              'C 言語風文字列作成 (&H は 16 進数)

  s = left(s, instr(s, chr(0)) - 1) 'C 言語文字列を VB 文字列へ変換

  ・初期化されていない、または、存在していない Null と言う意味も
    最近の VB では良く使われる。
    string 型や long 型の初期値は "" や 0 である。
    C 言語では、初期化されていない変数の初期値は不定である。
    特にデータベースのレコード項目などで Null 項目が発生しやすい。
    この場合の Null 項目を参照しようなどとすると VB では例外エラーが発生
    する。また Null 値を含む if 評価なども構文そのもののがエラーになる。
    (数値の Null も、文字列の Null も同じである。)

  if IsNull(rs("数量")) then
    msgbox "NULL"
  else
    msgbox rs("数量")
  end if

■C 言語 API 等の NULL 文字削除

  ・VB から、Windows API や C 言語 DLL 関数を呼び出すと、文字列の扱いが
    違うので特殊な処理が必要となる。

  ・C 言語は文字列のポインタを操作するので、前もって、十分な領域の文字列
    領域を確保して受け渡さなければならない。

  dim para1 as string

  para1 = space(256)
  ... Windows API 等コール(para1) ...
                           |_ 255 文字 + NULL 文字の領域となる

  ・C 言語引数では、文字列ポインタとして NULL を渡す場合が良くある。
    この場合は、次のようにする。

  ... Windows API 等コール(vbNullString) ...
                           |_ C の NULL を渡す

  ・C 言語関数から返ってくる文字列には、最後に NULL 文字 chr(0) が付いて
    いる。VB で通常の string として扱うには、最後の NULL を削除する。
    尚、最後と言うのは、文字列の最後であって、変数有効長の最後ではない。
    NULL 文字の位置は返ってくる文字数の最後である。

  dim para1 as string

  para1 = space(256)
  ... Windows API 等コール(para1) ...
                           |_ 255 文字 + NULL 文字の領域となる

  para1 = left(para1, instr(para1, chr(0)) - 1)
                      |_ C の NULL 文字位置検索

  ・実際には、API エラーで文字列が返って来ていない場合もあるので、
    正常リターン時のみ NULL 文字削除を行う。

  dim para1 as string

  para1 = space(256)
  ... Windows API 等コール(para1) ...
                           |_ 255 文字 + NULL 文字の領域となる

  if エラー then
    para1 = ""
  else
    para1 = left(para1, instr(para1, chr(0)) - 1)
  end if

■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
■VB テクニック編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2024 Y.SAK