HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0209
RLDLL(C言語)による多次元文字列配列の受け渡し6解決


RL

リンク

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にて取得できるか宜しければ教えて頂けないでしょうか



この記事に返信する


RL

リンク

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



RL

リンク

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

です



MillkeyStars

リンク

2014/2/9(Sun) 13:52:02|NO.59788

HSPのsdim配列を送る事は、DLL通常方式では無理です。
hsp261の $202 方式を用いるか、プラグイン方式で作ってください。

dim 配列は、メモリ連続性がありますが、sdim 配列には連続性がないのです。

$202 方式もプラグイン方式も、HSPからの引数取得方法が違うだけで、あとはみんな一緒なので、簡単だと思います。
詳しくは、hspsdk の hspdll.txt をご覧ください。



check

リンク

2014/2/9(Sun) 21:12:54|NO.59797

DLLの関数を見直して、2次元配列ではなく1次元の配列(ただの文字列)として
渡す、もしくは受け取る方法を考えてみるとか?

無理なようならMillkeyStars氏の言っているようにHSPプラグインとして、
DLLを作らなければいけない。



MillkeyStars

リンク

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 側用



RL

リンク

2014/2/10(Mon) 18:46:59|NO.59832

MillkeyStars様ありがとうございました!
PVal構造体etcについていろいろ調べて夜を徹してDLLを作ってみても
エラーにしかならなかったのでサンプルが非常に助かりました

私の場合は都合上2次元配列から変えられなかったのですがcheck様も助言ありがとうございました



ONION software Copyright 1997-2021(c) All rights reserved.