我已经阅读了脚本指南中第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]