Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > dlライブラリ > DL::CPtrクラス

class DL::CPtr

クラスの継承リスト: DL::CPtr < Object < Kernel < BasicObject

要約

メモリ領域を表すクラスです。C 言語のポインタに相当します。

特異メソッド

self[val] -> DL::CPtr
to_ptr(val) -> DL::CPtr

与えられた val を指す CPtr オブジェクトを生成して返します。

val が文字列の場合は文字列が格納されているメモリ領域を指す CPtr オブジェクトを返します。 IO オブジェクトの場合は FILE ポインタを表す CPtr オブジェクトを返します。 val に to_ptr メソッドが定義されている場合は、val.to_ptr を呼びます。 上以外の場合は、整数に変換しそれをアドレスとする CPtr オブジェクトを返します。

[PARAM] val:
Ruby オブジェクトを指定します。

例:

require 'dl'
s = "abc"
p DL::CPtr[s].to_i                 #=> 136186388
p [s].pack('p*').unpack('l!*')[0]  #=> 136186388
malloc(size, free = nil) -> DL::CPtr

与えられた長さ size のメモリ領域を確保し、それを表す CPtr オブジェクトを生成して返します。

[PARAM] size:
確保したいメモリ領域のサイズを整数で指定します。
[PARAM] free:
GC 時に呼べれる CPtr オブジェクトの free 関数を DL::CFunc オブジェクトか整数で指定します。
new(addr, size = 0, free = nil) -> DL::CPtr

与えられた addr が指すメモリ領域を表す CPtr オブジェクトを生成して返します。

size を指定した場合、アドレス addr に確保されているメモリ領域のサイズは size であると仮定されます。GC は free 関数を使用してメモリを解放します。

[PARAM] addr:
生成する CPtr オブジェクトが指すアドレスを整数で指定します。
[PARAM] size:
生成する CPtr オブジェクトが指すメモリ領域のサイズを整数で指定します。
[PARAM] free:
GC 時に呼ばれる free 関数を DL::CFunc オブジェクトか整数で指定します。

インスタンスメソッド

self + n -> DL::CPtr

自身のアドレスに n バイトを足した新しい CPtr オブジェクトを返します。

この返り値には、free 関数がセットされていません。

[PARAM] n:
アドレスの増分を整数で指定します。

例:

require 'dl'

s = 'abc'
cptr = DL::CPtr[s]
p cptr[0,1]         #=> "a"
cptr += 1
p cptr[0,1]         #=> "b"
ptr -> DL::CPtr
+ -> DL::CPtr

自身の指す値を CPtr にして返します。 自身の指す値はポインタであると仮定します。 C 言語におけるポインタのポインタに対する間接参照 *p と同じです。

この返り値には、free 関数がセットされていません。

例:

require 'dl/import'

s = 'abc'
cptr = DL::CPtr[s]
cref = cptr.ref
p cref.to_s(4).unpack('l*')[0]  #=> 136121648
p cptr.to_i                     #=> 136121648
p cref.ptr.to_s                 #=> "abc"
self - n -> DL::CPtr

自身のアドレスから n バイトを引いた新しい CPtr オブジェクトを返します。

この返り値には、free 関数がセットされていません。

[PARAM] n:
アドレスの差分を整数で指定します。

例:

require 'dl'

s = 'abc'
cptr = DL::CPtr[s]
cptr += 1
p cptr[0,1]         #=> "b"
cptr -= 1
p cptr[0,1]         #=> "a"
ref -> DL::CPtr
- -> DL::CPtr

自身を指す CPtr オブジェクトを返します。 C 言語におけるポインタへのアドレス演算子の適用 &p と同じです。

この返り値には、free 関数がセットされていません。

例:

require 'dl/import'

s = 'abc'
cptr = DL::CPtr[s]
cref = cptr.ref
p cref.to_s(4).unpack('l*')[0]  #=> 136121648
p cptr.to_i                     #=> 136121648
p cref.ptr.to_s                 #=> "abc"
self <=> other -> Integer

[TODO]

ポインタの指すアドレスの大小を比較します。

eql?(other) -> bool
self == other -> bool

ポインタの指すアドレスが同一かどうかを判定します。

例:

require 'dl'

s = 'abc'
cptr  = DL::CPtr[s]
cptr0 = DL::CPtr[s]
cptr1 = cptr + 1

p cptr == cptr1     #=> false
p cptr == cptr0     #=> true
self[offset] -> Integer

自身の指すアドレスに offset バイトを足したメモリ領域の先頭を整数として返します。

例:

require 'dl'

s = 'abc'
cptr  = DL::CPtr[s]
p cptr[0]            #=> 97
p cptr[1]            #=> 98
self[offset, len] -> String

自身の指すアドレスに offset バイトを足したメモリ領域の先頭 len バイトを複製し、 文字列として返します。

(self + offset).to_s(len) と同等です。 offset + len が自身のサイズより小さいかを検証しません。

[PARAM] offset:
値を得たい領域の先頭のアドレスまでのオフセットを整数で与えます。
[PARAM] len:
値を得たい領域のサイズを指定します。

例:

require 'dl'

s = 'abc'
cptr  = DL::CPtr[s]
p cptr[0, 1]            #=> "a"
p cptr[1, 2]            #=> "bc"
self[offset] = n

自身の指すアドレスに offset バイトを足したメモリ領域を指定された n に書き換えます。

[PARAM] n:
整数を指定します。

例:

require 'dl'

s = 'abc'
cptr  = DL::CPtr[s]
cptr[0] = 65
p cptr.to_s         #=> "Bbc"
self[offset, len] = v

自身の指すアドレスに offset バイトを足したメモリ領域の先頭 len バイトに 文字列 str をコピーします。

str のサイズが len より小さい場合は、残りの領域を 0 で埋めます。 コピー先の領域が len より大きいか検証しません。

[PARAM] offset:
書き換えたいメモリ領域のオフセットを整数で与えます。
[PARAM] len:
書き換えたいメモリ領域のサイズを整数で指定します。
[PARAM] v:
メモリ領域にセットしたいバイト列を文字列で指定します。

例:

require 'dl'

s = 'abc'
cptr  = DL::CPtr[s]
p cptr[1,2] = "AA"
p cptr.to_s         #=> "aAA"
free -> DL::CFunc

GC がメモリを解放するのに使用する DL::CFunc オブジェクトを返します。

これは普通 DL::CPtr#free=DL::CPtr.new によって設定されます。

free=(cfunc)

GC が自身を解放するのに使う関数を DL::CFunc で指定します。

[PARAM] cfunc:
自身を解放するのに使われる関数を DL::CFunc か整数で指定します。
inspect

[TODO]

null? -> bool

自身が NULL なら true を返します。そうでないなら false を返します。

size -> Integer
size=(s)

自身の指す領域のサイズを表すアクセサです。

s を指定しても自身が指すメモリ領域のサイズが s になるように再割り当てはしません。

[PARAM] s:
自身が指すメモリのサイズを整数で指定します。
to_i -> Integer

自身が指すアドレスを整数で返します。

to_s -> String
to_s(len) -> String

自身が指す領域から長さ len の文字列を複製して返します。

len を省略した場合は、文字列の終りは '\0' であると仮定して、 strlen(3) を使って長さを算出します。

[PARAM] len:
文字列の長さを整数で指定します。
to_str -> String
to_str(len) -> String

自身が指す領域から長さ len の文字列を複製して返します。

len を省略した場合は、self.size をその代わりに使います。

[PARAM] len:
文字列の長さを整数で指定します。
to_value -> object

自身はヒープに確保された Ruby のオブジェクトを指すポインタであると仮定して、 自身が指すオブジェクトを返します。

例:

require 'dl'

s = 'abc'
i = DL.dlwrap(s)
cptr = DL::CPtr.new(i)
p cptr.to_value   #=> "abc"
class DL::CPtr