私はスクリプト ガイドの憲章 14 の内容を読み、C 関数についていくつかのテストを行いました。
添付ファイルの testdll.jsl は、AnsiString (in および out) のような単純なデータで正常に機能します。 ログでは次のことがわかります。
---
dll_obj = DLL("C:\Users\charlie.chu\Documents\JMP\JSL\jmptest2.dll");
[CDECL] AnsiString testFunc(AnsiString);
結果 = "ABC";
---
私の質問は、 {"1.2, 2.3, 3.4", "5.6, 6.7, 7.8"} のようなデータを送信し、最終的に { {1.2, 2.3, 3.4} , {5.6, 6.7, 7.8} }。どうすればいいですか? 適切なデータ型が見つかりません。
C コードでは、関数 strSplit は次のように定義されています。
ダブル** strSplit (チャー** strArray ) {
AnsiStringは使えませんが、ObjPtrも失敗します。
PS: C 言語コードは添付ファイルにできないことがわかりました。
ありがとう。 結論としては、今のところ解決策はありません。
DLL関数を呼び出す代わりに、TCPIPソケットを使用してJMPからデータを送信してみます。明らかに遅くなります...
C コードに送信する前に、引数を再パッケージ化してみてください。
1) 長い文字列。すべての文字列を連結したものです。
2) 数値配列。要素は個々の文字列の長さ、または個々の文字列のオフセットを記録します。
そして、C コードはそれらを解凍する必要があります。
文字列をリストのリストに変換することが目的の場合は、JSL でそれを行うことができます。ここでは 2 つのアプローチを示します。
// Given this string:
a = {"1.2, 2.3, 3.4", "5.6, 6.7, 7.8"};
// Return data like { {1.2, 2.3, 3.4} , {5.6, 6.7, 7.8} }
// Parse things apart
new_list = {};
m = 0;
for (i = 1, i <= nitems(a), i++,
one_list = words(a[i], ", ");
for (k = 1, k <= nitems(one_list), k++,
one_list[k] = num(one_list[k]);
);
m++;
new_list[m] = one_list;
);
print(new_list);
// Use matrix operators
exec_string = "new_mat = matrix({";
for (i = 1, i <= nitems(a), i++,
if (i == 1,
exec_string = exec_string || "{" || a[i] || "}";
,
exec_string = exec_string || ", {" || a[i] || "}";
);
);
exec_string = exec_string || "})";
eval(parse(exec_string));
print(new_mat);
最初のものは以下を返します:
{{1.2, 2.3, 3.4}, {5.6, 6.7, 7.8}}
2 番目の関数は行列を返します。
[1.2 2.3 3.4, 5.6 6.7 7.8]