hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
HSP3/STRBUF - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

hsp3.png

STRBUF構造体

HSP3がデータ用に確保しているバッファサイズについてお話するところ。

  • 変数がデータを格納するために確保している内部サイズは、データを格納している領域の先頭アドレスから16byte手前にある4byteの領域で管理されています。
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    
        i = 10
        dupptr size, varptr(i)-16, 4
        mes strf("int\t= %3d byte.",size)
     
        d = 1.23
        dupptr size, varptr(d)-16, 4
        mes strf("double\t= %3d byte.",size)
     
        s = ""
        dupptr size, varptr(s)-16, 4
        mes strf("str\t= %3d byte.",size)
     
        sdim a, 100
        dupptr size, varptr(a)-16, 4
        mes strf("alloced\t= %3d byte.",size)
  • memsetなどを使用する場合、このサイズを超えないように注意しなければならない。

コメント

引越し前に雑談で話した内容
  • HSPCTX構造体に,*mem_varというメンバがありますが、ここから取得できませんか? -- QIG 2005-11-27 (日) 13:24:06
  • mref hspctx,68:dupptr pval,hspctx(11),32:mes pval(2)で何か取得できてるみたいですが、これがどの変数のデータか分からない・・・。 -- QIG 2005-11-27 (日) 13:31:54
  • やっとソースを書くことに。orz -- kz3 2005-11-27 (日) 13:38:29
  • あ -- 2005-11-27 (日) 13:38:49
  • QIGさん先に言っちゃだめですよーーーーーーーー [worried2] -- kz3 2005-11-27 (日) 13:39:12
  • pval(2)はデータじゃないんですねぇ〜ふっふっふちなみにdupptrは使わなくてもOKなんですよ〜ふっふっふ -- kz3 2005-11-27 (日) 13:40:36
  • 今からHSP3BBSにソースを(書いてから)貼るので楽しみにしてくだしゃい -- kz3 2005-11-27 (日) 13:41:07
  • まぁ先に書いちゃうと、その変数のためにHSPが用意しているバッファサイズは・・・ -- kz3 2005-11-27 (日) 13:42:29
  • 前言撤回。メモリの参照はdupptr使わないとダメでし!!!!! [tere] -- kz3 2005-11-27 (日) 13:44:22
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    -
    |
    |
    !
     
     
    
        /*** HSP3がデータの為に用意しているバッファサイズを得る ***/
        ; 整数
        i = 0
        dupptr size, varptr(i)-16, 4
        mes size
        ; 実数
        d = 1.989
        dupptr size, varptr(d)-16, 4
        mes size
        ; 63文字以下の文字列
        ss = "Hello,world"
        dupptr size, varptr(ss)-16, 4
        mes size
        ; 63文字を超える文字列((16*3+2)*2+1=101byte)
        ls = {"
        0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
        0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
    "}
        dupptr size,varptr(ls)-16,4
        mes size
  • varptrで返ってくるのがデータ用のバッファ。その前にヘッダ(STRINF)が24byteあります。 -- kz3 2005-11-27 (日) 13:54:24
  • 自動拡張が起こるとまず必要なサイズ+sizeof(STRINF)で必要なサイズのブロックを確保して元のSTRINF構造体を拡張ブロックに合わせて書き直して拡張ブロックのSTRINFにコピー。 -- kz3 2005-11-27 (日) 14:00:13
  • これ全く雑談で扱う内容じゃないですね [worried2] どこかにページを作ってそこで話しましょう [rajya] >QIGさん -- kz3 2005-11-27 (日) 14:01:43

  • えーと、varptr()はPVal.masterメンバのアドレスを返すんですか? -- QIG 2005-11-27 (日) 15:28:12
  • # ポインタ関係をあまり理解してません・・・。 -- QIG 2005-11-27 (日) 15:29:21
  • (PVal *)pval->masterがどこを指してるのか分からないんですよねぇ・・・。もっと読めば見えてくるはず。 -- kz3 2005-11-27 (日) 15:35:24
  • varptrは(STRBUF *)sb->ptrメンバのポインタを返すようです。 -- kz3 2005-11-27 (日) 15:36:07
  • まてまて。(PVal *)pval->ptが(HspVarProc? *)p->GetPtr?()で呼ばれるんですよねぇ恐らく。まだメモリ管理までしか読み解いていなくて、メソッド(Hspvar_str.cpp)を読み解いていないのです!とにかくvarptrはBUFSTR構造体のdataメンバを返す・・・・・・が配列になるとこれまた状況が違ってくる。とりあえず出来たものをHSP3BBSに・・・orz -- kz3 2005-11-27 (日) 15:41:23
  • hspvar_str.cpp内に、PVal.offsetが0以外ならPVal.masterがポインタとなる、というような記述がありました。 -- QIG 2005-11-27 (日) 15:47:58
  • HSP3BBSに整数型対応版を貼ってきました。まだまだ読み解いていきたいと思いますp`ロ´q -- kz3 2005-11-27 (日) 15:55:35
  • ちなみに昨日独り言いいながら作っていたのはこんなテストスクリプトです。
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    
    ;=====================================================================
    ;   確保中の文字列バッファサイズ
    ;                                                         for HSP 3.0a
    ;   2005/11/24                                          written by kz3
    ;=====================================================================
        font "MS ゴシック",14
     
        s = "kz3","1111111111111111111111111111111111111111111111111111111111111111"
        mes strf("s        = 0x%p",varptr(s.0))
        mref hspctx, 68
        mes strf("PVal     = %#010x",hspctx.11)
        dupptr PVal, hspctx.11, 48
        mes "---------------------"
        mes strf(".flag    = %d",PVal.0&$FFFF)
        mes strf(".mode    = %d",PVal.0>>16&$FFFF)
        mes strf(".len[0]  = %d",PVal.1)
        mes strf(".len[1]  = %d",PVal.2)
        mes strf(".len[2]  = %d",PVal.3)
        mes strf(".len[3]  = %d",PVal.4)
        mes strf(".len[4]  = %d",PVal.5)
        mes strf(".size    = %d",PVal.6)
        mes strf(".pt      = %#010x",PVal.7): dupptr STRBUF, PVal.7-24, 88
        mes strf(".master  = %#010x",PVal.8): dupptr p,PVal.8,4
        mes strf(".support = %d",PVal.9&$FFFF)
        mes strf(".arraycnt= %d",PVal.9>>16&$FFFF)
        mes strf(".offset  = %d",PVal.10)
        mes strf(".arraymul= %d",PVal.11)
     
        pos 153,0
        mes strf("STRBUF  = %#010x",varptr(STRBUF))
        mes strf(".flag   = %d",STRBUF.0&$FFFF)
        mes strf(".exflag = %d",STRBUF.0>>16&$FFFF)
        mes strf(".myblock= %d",STRBUF.1)
        mes strf(".size   = %d",STRBUF.2)
        mes strf(".ptr    = %#010x",STRBUF.3)
        mes strf(".extptr = %#010x",STRBUF.4)
        mes strf(".opt    = %#010x",STRBUF.5)
        mes strf(".data   = %s",STRBUF.3)
     
        pos 300,0
        dupptr STRBUF2,varptr(STRBUF)+88,88
        mes strf("STRBUF2  = %#010x",varptr(STRBUF2))
        mes strf(".flag    = %d",STRBUF2.0&$FFFF)
        mes strf(".exflag  = %d",STRBUF2.0>>16&$FFFF)
        mes strf(".myblock = %d",STRBUF2.1)
        mes strf(".size    = %d",STRBUF2.2)
        mes strf(".ptr     = %#010x",STRBUF2.3)
        mes strf(".extptr  = %#010x",STRBUF2.4)
        mes strf(".opt     = %#010x",STRBUF2.5)
        mes strf(".data    = %s",STRBUF2.3)
  • ため息が出るスクリプトですね。すごい・・・。 -- 2005-11-27 (日) 16:10:58
  • すごいのはおにたまさんです!!!!!! [kita2] -- kz3 2005-11-27 (日) 16:19:32
  • おにたまさんが回答くれたら一番いいんですけどね。 -- QIG 2005-11-27 (日) 16:22:05
  • むしろこれはおにたまさんからの宿題・・・『これ(C++ソース)渡すから俺について来い(▼_▼メ』見たいな・・・ちょっと違うか。
    読んでるだけで勉強になる。僕にとってはこれは格好の研究材料ですね〜。
    まぁプラグイン作成者はこれを理解されているんですよねぇ。 -- kz3 2005-11-27 (日) 16:29:24
  • こんばんは、Pval情報を捜し求めて辿り着きました。上記の最終スクリは変数に半角77文字以上入れると、なぜかシステムエラーが出ますね。 -- ultimate? 2007-08-28 (火) 00:08:46
  • ところで、モジュールにて「引数で渡したグローバル変数のPval」の取得方法は知ってたりしますか? -- ultimate? 2007-08-28 (火) 00:12:31
  • HSPCTX構造体の取得直前にdupでクローン作成作業を行うと、タイプ取得とかは行くようですが? -- ultimate? 2007-08-28 (火) 00:17:45
  • dupの代わりにdupptrでやっても、配列の各要素数を取得できないんですよね。困った。 -- ultimate? 2007-08-28 (火) 00:20:11
  • 小ワザ/ポインタを使ってのあれこれの内容は見ましたか?
    それと var でなく array で受け取れば length で要素数はわかります。(特定の配列要素を扱いたい場合はその添え字を別に渡す必要がありますが・・・) -- naznyark? 2007-08-28 (火) 01:53:27
    • 訂正。var で受け取っても length で要素数を取得できますね。 -- naznyark? 2007-08-30 (木) 01:46:02
  • なるほど [kita] 引数の変数はprmstackメンバを元に取り出すのですね。
    ありがとうございました。確かにうまく行きましたが、
    mod_pval.hspの定義関数bufsizeでわからないことがあるんですが。
    文字列型だった場合に、APTRポインタが有効なら、そこから取ってますよね。
    そこのdupptrでmasterポインタとAPTRを4倍したものを足したアドレスから4バイト分、tmpPDとしてます。
    このアドレスの算出と、その次にある24バイト前から取り出してる部分。
    この部分はSDKかどこかに情報公開されてるんでしょうか?
    どうやってしったのでしょうか? -- 2007-08-30 (木) 15:10:17
  • http://hsp.tv/make/downlist.html -- 2007-08-30 (木) 15:51:08

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-08-30 (木) 15:51:08 (2292d)