|
|
2014/2/9(Sun) 12:48:04|NO.59785
再び失礼します http://hsp.tv/play/pforum.php?mode=all&num=59701
にて質問したRLです
無事文字列はDLLに送れるようになったのですが作っている途中に
1次元文字列配列と2次元文字列配列をDLLに送る必要性が出てきました
そこで、文字列配列の先頭ポインタをDLLに渡し関数で参照したい箇所のポインタを
算出しようと考えたのですがHSPがどのように文字列配列を
メモリ展開しているのかいくらGoogle等で調べても分かりません
文字列配列は文字列長、1次方向の長さ、(2次方向の長さ)が
以下のように定数で決まりきっているもので拡張が起こらないとしたとき
1次元文字列配列
sdim s1,100,100
2次元文字列配列
sdim s2,100,100,100
どのように参照したい箇所のポインタをDLLにて取得できるか宜しければ教えて頂けないでしょうか
|
|
2014/2/9(Sun) 13:00:59|NO.59786
追記
どのように展開するか検証するためにvarptrで二次元配列の展開を調べました
コードは以下です
sdim s,4,3,3
s(0,0) = "abc"
s(1,0) = "def"
s(2,0) = "ghi"
s(0,1) = "jkl"
s(1,1) = "mno"
s(2,1) = "pqr"
s(0,2) = "stu"
s(1,2) = "vwx"
s(2,2) = "yz."
mes ""+varptr(s)
mes ""+varptr(s(0,0))+":"+(varptr(s(0,0))-varptr(s))
mes ""+varptr(s(1,0))+":"+(varptr(s(1,0))-varptr(s))
mes ""+varptr(s(2,0))+":"+(varptr(s(2,0))-varptr(s))
mes ""+varptr(s(0,1))+":"+(varptr(s(0,1))-varptr(s))
mes ""+varptr(s(1,1))+":"+(varptr(s(1,1))-varptr(s))
mes ""+varptr(s(2,1))+":"+(varptr(s(2,1))-varptr(s))
mes ""+varptr(s(0,2))+":"+(varptr(s(0,2))-varptr(s))
mes ""+varptr(s(1,2))+":"+(varptr(s(1,2))-varptr(s))
mes ""+varptr(s(2,2))+":"+(varptr(s(2,2))-varptr(s))
結果は以下で規則性はあるようですがsdim s,4,3,3との相関性は分かりませんでした
32136432
32136432:0
32136256:-176
32136168:-264
32136080:-352
32135992:-440
32135904:-528
32135816:-616
32135728:-704
32135640:-792
|
|
2014/2/9(Sun) 13:03:20|NO.59787
結果データを間違えました、失礼しました
正しくは
30366960
30366960:0
30366960:-88
30366960:-176
30366960:-264
30366960:-352
30366960:-440
30366960:-528
30366960:-616
30366960:-704
です
|
|
2014/2/9(Sun) 13:52:02|NO.59788
HSPのsdim配列を送る事は、DLL通常方式では無理です。
hsp261の $202 方式を用いるか、プラグイン方式で作ってください。
dim 配列は、メモリ連続性がありますが、sdim 配列には連続性がないのです。
$202 方式もプラグイン方式も、HSPからの引数取得方法が違うだけで、あとはみんな一緒なので、簡単だと思います。
詳しくは、hspsdk の hspdll.txt をご覧ください。
|
|
2014/2/9(Sun) 21:12:54|NO.59797
DLLの関数を見直して、2次元配列ではなく1次元の配列(ただの文字列)として
渡す、もしくは受け取る方法を考えてみるとか?
無理なようならMillkeyStars氏の言っているようにHSPプラグインとして、
DLLを作らなければいけない。
|
|
2014/2/10(Mon) 02:26:10|NO.59802
$202 方式でのサンプル作ってみたので、参考にしてね。
($202 を利用するなら、必ず hsp3plugin.h をインクルードすること)
//ここから DLL 側用
#include <windows.h>
#include <hsp3plugin.h>
EXPORT BOOL WINAPI GetStringArray ( HSPEXINFO *hei ){
PVal *MemoryArray = hei->HspFunc_prm_getpval();
HspVarProc *vpSTR; //代入のためにHspVarProc構造体を用意
vpSTR = hei->HspFunc_getproc( HSPVAR_FLAG_STR );
//配列のポインタ代入用変数
PDAT *MemoryData;
HspVarCoreReset(MemoryArray); //配列参照次元をリセット(必ず下記で使用する場合は、最初にこれをする事。)
hei->HspFunc_array(MemoryArray,0); //一次元目設定
hei->HspFunc_array(MemoryArray,2); //二次元目設定(多次元でない場合に指定するとエラー)
// hei->HspFunc_array(MemoryArray,0); //三次元目設定(多次元でない場合に指定するとエラー)
// hei->HspFunc_array(MemoryArray,0); //四次元目設定(多次元でない場合に指定するとエラー)
//上記の場合、s(0,2) を取得しろという命令。
//下記、上記配列のデータ実体ポインタを取得。
MemoryData = vpSTR->GetPtr( MemoryArray );
//以下直接文字列を表示 PDAT → char にキャストする事。
MessageBox(NULL,(char *)MemoryData,"オフセットデータ",MB_OK);
return 0;
}
//ここまでが DLL 側用
//ここから HSP 側用
#uselib "DLL.dll"
#func GetStringArray "GetStringArray" $202
sdim s,4,3,3
s(0,0) = "abc"
s(1,0) = "def"
s(2,0) = "ghi"
s(0,1) = "jkl"
s(1,1) = "mno"
s(2,1) = "pqr"
s(0,2) = "stu"
s(1,2) = "vwx"
s(2,2) = "yz."
GetStringArray s
//ここまでが HSP 側用
| |
|
2014/2/10(Mon) 18:46:59|NO.59832
MillkeyStars様ありがとうございました!
PVal構造体etcについていろいろ調べて夜を徹してDLLを作ってみても
エラーにしかならなかったのでサンプルが非常に助かりました
私の場合は都合上2次元配列から変えられなかったのですがcheck様も助言ありがとうございました
|
|