函数 C++>Tcl 与 Critcl

Function C++>Tcl with Critcl

本文关键字:Tcl Critcl gt C++ 函数      更新时间:2023-10-16

我想用数学函数扩展Tcl,我有一个简单的C++函数,如下所示:

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;
}

我在Wiki上搜索了一下,发现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]*vect2[2];
}

但我有一个错误:

失败的critcl.tcl:在函数'int tcl_dotproduct16(ClientData,Tcl_Interp*,int,Tcl_Obj*const*(':未通过标准Tcl:4831:44:错误:无法将参数"1"的"double"转换为"double*"'双c_dotproduct16(双*,双*('

有人能帮我吗?

当涉及到类型映射时,critcl代码不是很复杂;它只是将数组降低为指向数组的指针,这对您来说不是很好,尤其是因为它没有强制参数中的元素数量。在这种情况下,你最好自己做。

请注意,我们还需要传入interpspecial并返回okspecial"type"(这样我们就可以进行错误报告(,并且我们使用Tcl_Obj*类型作为参数,这将禁用(实际上(所有类型映射。

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;
}

我们还需要在外部做更多的工作,因为为了能够生成错误,我们不得不禁用那里的自动映射。