我已經閱讀了腳本指南中第14章的內容,並對我的C函數做了一些測試。
附件 testdll.jsl 可以很好地處理簡單數據,例如 AnsiString(輸入和輸出)。 在日誌中我可以看到:
---
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 定義為
雙倍的**分割線(字元**字串數組){
我無法使用 AnsiString,但 ObjPtr 也失敗。
PS:我發現c語言代碼不能是附件檔......
謝謝。 所以結論是:目前還沒有解決方法。
我會嘗試使用 TCPIP 套接字從 JMP 發送數據,而不是呼叫 DLL 函數,它顯然會更慢...
也許在發送到 C 代碼之前嘗試重新打包您的參數:
1)一個長字串,它是所有字串的串聯
2) 數值數組,元素記錄單一字串的長度或單一字串的偏移量
你的 C 程式碼需要解壓縮它們。
如果您的目標是將字串轉換為列表列表,則可以在 JSL 中執行此操作。這裡有兩種方法:
// 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}}
第二個回傳一個矩陣:
[1.2 2.3 3.4, 5.6 6.7 7.8]