我需要关于将字符串列表从C函数发送到TCL调用函数的指导。在swig和函数返回值的帮助下,我能够将C函数中的整型浮点值列表发送回TCL程序。但我无法将swig中的“test1”、“test2”等字符串列表连同返回值一起发送回TCL进程。任何关于这方面的指导/指针都会很好。
工作的代码是这样的
int addsub (int a, int b, int *result1, int *result2) {
*result1 = a + b;
*result2 = a - b;
printf("\n The value is: %i, %i \n",*result1, *result2);
return 8;
}
Swig界面看起来像
%apply int *OUTPUT {int *result1, int *result2};
TCL呼叫就像
tclsh
% Addsub 10 5
8 15 5.
它以列表的形式给出结果输出
但当我尝试在字符串中执行类似操作时,TCL中的返回列表只返回字符串中的第一个字符
代码不起作用
int test_str (char *out1, char *out2) {
char *str1, *str2;
str1 = "Test1";
str2 = "Test2";
strcpy (out1,str1);
strcpy (out2,str2);
printf ("Out 1 is %s\n", out1);
printf ("Out 2 is %s\n", out2);
return 100;
}
Swig接口文件看起来像
%apply int *OUTPUT {char *out1, char *out2};
TCL通话就像
Tclsh
% Teststr
Out 1 is est2
Out 2 is Test2
100 101 84
它没有给出整个字符串。给出字符串中第一个字母的ASCII值。
或者如果我的C函数是这样的
int test_str (char *out1, char *out2) {
char *str1,*str2;
str1 ="Test1";
str2 = "Test2";
out1=str1;
out2=str2;
//strcpy (out1,str1);
//strcpy (out2,str2);
printf ("String 1 is %s\n", str1);
printf ("String 2 is %s\n", str2);
printf ("Out 1 is %s\n", out1);
printf ("Out 2 is %s\n", out2);
return 100;
}
Swig接口文件看起来像
%apply int *OUTPUT {char *out1, char *out2};
tclsh
% test_str
String 1 is Test1
String 2 is Test2
Out 1 is Test1
Out 2 is Test2
100 0 -127
有人能指出这里缺少什么吗。
这是一个非常棘手的案件。SWIG在处理用于输出的char*
变量时有特殊问题;缺少的信息太多,它无法自动找出需要做的所有事情。(我认为默认情况下,它会将它们视为长度为1的字符数组,这并没有多大帮助。)
您需要指定一个argout
typemap(以及typemap中的助手)来解决此问题:
// Allocate a (short) working buffer for the string; this is the part that
// SWIG *cannot* guess for you.
%typemap(in, numinputs=0) char *OUTPUT (char temp[50]) {
$1 = &temp;
}
// Actually how to do the mapping of strings from a local buffer into Tcl values
%typemap(tcl,argout) char * {
$result = Tcl_NewStringObj($1, -1);
}
然后必须应用
%apply
,才能真正获得正确值的缓冲区分配。(请注意,使用这种方法正确地进行缓冲区管理是相当棘手的,而您正在使用的函数签名并不能很好地完成缓冲区管理。)
您的最后一个示例根本不起作用;您没有通过任何机制返回值(由于C字符串的工作方式;您只是在函数内部设置东西,而不是告诉调用者)。除非您执行
strcpy
,否则该字符串实际上不会被复制...
如何使用Kotlin声明并调用以函数列表为参数的函数。我在单个函数的函数中使用了参数,但是如何在函数列表中使用参数呢? 这个问题展示了如何将一个函数发送给一个函数:Kotlin:如何将一个函数作为参数传递给另一个函数?对于一系列函数,最好的方法是什么?
问题内容: 我正在构建Android应用程序的项目的C 方面。我需要一些信息(通过字符串和字符串数组)传递给Java应用程序(通过JNI)。我以前从未做过,相反方向的人没有C 的经验,并承认他们不能真正提供帮助。 我确实找到了以下代码(从这里开始) 但这对我来说毫无意义。通常,我不确定如何将其合并到程序的C ++端,而且我无法确切了解其工作原理。代码是否在执行该行时发出消息?还是在for循环中执行
问题内容: 我有一个字符串数组一样,我想这个数组发送到 ç 使用 JNI 。我找不到任何明确的解决方案。我试图将此字符串视为成功,但没有成功。 有没有办法做到这一点? 问题答案: 您可以编写一个简单的函数,该函数接受一个对象,将每个对象强制转换为jstring,然后对其进行调用。 像这样:
我目前正在学习网络,需要一些帮助来找出通过UDP从Java程序向C程序发送字节数组的最简单方法。以前,我用java创建了一个非常简单的客户机和服务器程序,并且能够使用Java类DatagramSocket和DatagramPacket在两个Java客户机/服务器程序之间发送和接收数据包。 但是现在,我有一个网络仿真器,我需要通过它,它是用C编写的,所以我担心它无法识别DatagramSocket和
问题内容: 我在C 中有一个方法,该方法将双精度数组作为参数。我从Java调用此方法,需要传递一个双精度数组。C 例程读取和修改数组的值,而我需要Java中的那些更新后的值。我该怎么做呢? 例如,使用C ++例程: 和Java代码: 我猜不能像上面的调用那样对myMethod进行调用…还是可以吗?而在Swig中进行这项工作所需的是什么。如果我无法进行上述调用,如何将我的值获取到C ++代码? 问题
嗨,我尝试将以下Source类映射到以下Destation类。我使用了以下映射以将字符串值映射到列表字符串。它没有正确映射。我需要知道如何使用Dozer将2个字符串值映射到一个目标字符串列表中。