函数C++&燃气轮机;Tcl与Critcl 我想用数学函数来扩展TCL,我有一个简单的C++函数:< /P> double dotproduct(double vect1[3],double vect2[3]) {double res; res=vect1[0]*vect2[0]+vect1[1]*vect2[1]+vect1[2]*vect2[2]; return res; }
我在维基上搜索,发现Critcl可以做到,我试着:函数C++&燃气轮机;Tcl与Critcl 我想用数学函数来扩展TCL,我有一个简单的C++函数:< /P> double dotproduct(double vect1[3],double vect2[3]) {double res; res=vect1[0]*vect2[0]+vect1[1]*vect2[1]+vect1[2]*vect2[2]; return res; },c++,tcl,C++,Tcl,我在维基上搜索,发现Critcl可以做到,我试着: critcl::config language c++ critcl::clibraries -lstdc++ critcl::ccode { #include <math.h> } critcl::cproc dotproduct {double vect1[3] double vect2[3]} double { return vect1[0]*vect2[0]+vect1[1]*vect2[1]+vect1[2]*
critcl::config language c++
critcl::clibraries -lstdc++
critcl::ccode {
#include <math.h>
}
critcl::cproc dotproduct {double vect1[3] double vect2[3]} double {
return vect1[0]*vect2[0]+vect1[1]*vect2[1]+vect1[2]*vect2[2];
}
<代码> CRITC::配置语言C++
critcl::clibraries-lstdc++
critcl::ccode{
#包括
}
critcl::cproc点积{double vect1[3]double vect2[3]}double{
返回vect1[0]*vect2[0]+vect1[1]*vect2[1]+vect1[2]*vect2[2];
}
但我有一个错误:
失败的critcl.tcl:在函数“int tcl\uu dotproduct16(ClientData,
Tcl_Interp*,int,Tcl_Obj*const*)':失败的标准。Tcl:4831:44:
错误:无法将参数“1”的“double”转换为“double*”
“双c_uuDotProduct16(双*,双*)”
有人能帮我吗?critcl代码在类型映射方面不是很复杂;它只是将数组降低到指向数组的指针,这对您来说不是很好,尤其是因为它没有强制参数中的元素数量。在这种情况下,你最好自己做 注意,我们还需要传入
interp
special并返回ok
special“type”(这样我们就可以进行错误报告),并且我们使用Tcl_Obj*
type作为参数,这实际上禁用了所有类型映射
critcl::cproc dotproduct {Tcl_Interp* interp Tcl_Obj* vect1 Tcl_Obj* vect2} ok {
int listc;
Tcl_Obj **listv;
double v1[3], v2[3];
if (Tcl_ListObjGetElements(interp, vect1, &listc, &listv) != TCL_OK)
return TCL_ERROR;
if (listc != 3)
// You probably should also do an error message here
return TCL_ERROR;
while (listc-->0)
if (Tcl_GetDoubleFromObj(interp, listv[listc], &v1[listc]) != TCL_OK)
return TCL_ERROR;
if (Tcl_ListObjGetElements(interp, vect2, &listc, &listv) != TCL_OK)
return TCL_ERROR;
if (listc != 3)
return TCL_ERROR;
while (listc-->0)
if (Tcl_GetDoubleFromObj(interp, listv[listc], &v2[listc]) != TCL_OK)
return TCL_ERROR;
double res = v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
Tcl_SetObjResult(interp, Tcl_NewDoubleObj(res));
return TCL_OK;
}
我们还需要在外部做更多的工作,因为我们必须禁用那里的自动映射才能生成错误。critcl代码在类型映射方面不是很复杂;它只是将数组降低到指向数组的指针,这对您来说不是很好,尤其是因为它没有强制参数中的元素数量。在这种情况下,你最好自己做 注意,我们还需要传入
interp
special并返回ok
special“type”(这样我们就可以进行错误报告),并且我们使用Tcl_Obj*
type作为参数,这实际上禁用了所有类型映射
critcl::cproc dotproduct {Tcl_Interp* interp Tcl_Obj* vect1 Tcl_Obj* vect2} ok {
int listc;
Tcl_Obj **listv;
double v1[3], v2[3];
if (Tcl_ListObjGetElements(interp, vect1, &listc, &listv) != TCL_OK)
return TCL_ERROR;
if (listc != 3)
// You probably should also do an error message here
return TCL_ERROR;
while (listc-->0)
if (Tcl_GetDoubleFromObj(interp, listv[listc], &v1[listc]) != TCL_OK)
return TCL_ERROR;
if (Tcl_ListObjGetElements(interp, vect2, &listc, &listv) != TCL_OK)
return TCL_ERROR;
if (listc != 3)
return TCL_ERROR;
while (listc-->0)
if (Tcl_GetDoubleFromObj(interp, listv[listc], &v2[listc]) != TCL_OK)
return TCL_ERROR;
double res = v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
Tcl_SetObjResult(interp, Tcl_NewDoubleObj(res));
return TCL_OK;
}
我们还需要做一些事情,因为我们不得不禁用自动映射,以便能够产生错误。
公平地说CRITCL被设计成比C++更适合于C代码的接口;它没有,比如说,大口大口的复杂。另一方面,这也使得非专家使用更容易预测…感谢@DonalFellows的解释,我仍然有错误的错误:如果(Tcl_ListObjElements(interp,vect1,&listc,&listv)!=Tcl_OK),在参数传递中无法将'Tcl_Obj**'转换为'Tcl_Obj***'SWiG@Mkn很抱歉在listv
的定义中缺少一个*
。打字错误…并不是说它变化很大,但是可以使用list
参数类型来表示vect1
和vect2
@mrcalvin如果你经常做这类事情,最好的选择是为具有三个双精度的列表定义一个新的critcl类型映射。一个一次性功能不值得,但会使整个这些事情变得简单很多。公平地说CRITCL被设计成比C++更适合于C代码的接口;它没有,比如说,大口大口的复杂。另一方面,这也使得非专家使用更容易预测…感谢@DonalFellows的解释,我仍然有错误的错误:如果(Tcl_ListObjElements(interp,vect1,&listc,&listv)!=Tcl_OK),在参数传递中无法将'Tcl_Obj**'转换为'Tcl_Obj***'SWiG@Mkn很抱歉在listv
的定义中缺少一个*
。打字错误…并不是说它变化很大,但是可以使用list
参数类型来表示vect1
和vect2
@mrcalvin如果你经常做这类事情,最好的选择是为具有三个双精度的列表定义一个新的critcl类型映射。对于一次性功能来说不值得,但这会使完成一整套这些事情变得更容易。