函数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与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可以做到,我试着:

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类型映射。对于一次性功能来说不值得,但这会使完成一整套这些事情变得更容易。