[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:08734] Re: address 参照の解決について



こんにちわ、やまもとです。

ABE Hiroshiさんの<20030326230550.kamail.aGlyby1hYmU=@xxxxxxxxxxxxxxxxxx>から
> こんばんは。あべです。
>
>>>  多分 unpack-string を使えば良いのではないかと思います。
>>> |   (format t "~S~%" (si::unpack-string lpelfe OFFSET))
>>> てな感じでいけると思います。
>>>  OFFSET は構造体(ENUMLOGFONTEX)での efFaceName の相対アドレスです。
>> それももしかしたらと思って試していたのですが、lpelfe が単なるアドレスで
>> chunk でないため、si::unpack-string に「型が違う」と怒られてしまいます。
>
> 嘘ばっかりですみません。僕が書いたプログラムでは自前で make-chunk して
>いたので気付きませんでした。

ちょうどリファレンスでmake-chunkのところに来たので調べてみました。
憶測以外の何者でもないですが、si:address-ofではなく、
si:chunk-dataを使ってみたらどうでしょうか?

  ;;; foo を作る
  (setq foo (si:make-string-chunk "foo"))
  => #<chunk 98046956>
  (si:chunk-data foo)
  => 56457736

  ;;; アドレスと思われる数値から bar を作る
  (setq bar (si:make-chunk 'string 10 nil 56457736))
  => #<chunk 98046940>
  (si:unpack-string foo 0)  => "foo"
  (si:unpack-string bar 0)  => "foo"
  (si:chunk-data foo)       => 56457736
  (si:chunk-data bar)       => 56457736

経験的得られた情報からでは、こんな感じに動いているように見えるの
ですが、どうでしょうか?

                ┏━━━━┳━━━┓
                ┃アドレス┃内容  ┃
                ┣━━━━╋━━━┫
  fooの先?     ┃56457736┃"foo" ┠←─┐←─┐
                ┠────╂───┨    │    │
                ┃...     ┃      ┃    │    │
                ┠────╂───┨    │    │
  foo のチャンク┃98046940┃...   ┠──┘    │
                ┠────╂───┨          │
  bar のチャンク┃98046956┃...   ┠─────┘
                ┗━━━━┻━━━┛


-- 
    YAMAMOTO Taizo / 山本 泰三
        mailto:ymtz@xxxxxxxxxxxxxxx
        mailto:yamamoto@xxxxxxxxx
        http://www1.odn.ne.jp/ymtz/
        http://66mhz.com/

Index Home