calling "c" from TCL



Hello,

To sum vectors i wrote a code like this; it is receiving 3 vectors
data1, data2, data3. The diference between data1 and data2 is returned
with Tcl_SetObjResult, but i would like modify data3, how can i modify
data3??

Thanks

#include <tcl.h>
#include <iostream>
using namespace std;


int obj_vecsub(ClientData clientData, Tcl_Interp *interp, int argc,
Tcl_Obj *const objv[]);
int obj_vecsub(ClientData clientData, Tcl_Interp *interp, int argc,
Tcl_Obj *const objv[])

{
if (argc != 3) {
Tcl_WrongNumArgs(interp, 1, objv, (char *)"?x? ?y?");
return TCL_ERROR;
}
int num1=0, num2=0, num3=0;
Tcl_Obj **data1, **data2, **data3;
if (Tcl_ListObjGetElements(interp, objv[1], &num1, &data1) !=
TCL_OK)
return TCL_ERROR;
if (Tcl_ListObjGetElements(interp, objv[2], &num2, &data2) !=
TCL_OK)
return TCL_ERROR;
if (Tcl_ListObjGetElements(interp, objv[3], &num2, &data3) !=
TCL_OK)
return TCL_ERROR;

if (num1 != num2) {
Tcl_SetResult(interp, (char *)"vecsub: two vectors don't have the
same size", TCL_STATIC);
return TCL_ERROR;
}

Tcl_Obj *tcl_result = Tcl_NewListObj(0, NULL);
Tcl_Obj *tcl_dummy = Tcl_NewListObj(0, NULL);
for (int i=0; i<num1; i++) {
double d1=0, d2=0, d3=77;
if (Tcl_GetDoubleFromObj(interp, data1[i], &d1) != TCL_OK) {
Tcl_SetResult(interp, (char *)"vecsub: non-numeric in first
argument", TCL_STATIC);
return TCL_ERROR;
}
if (Tcl_GetDoubleFromObj(interp, data2[i], &d2) != TCL_OK) {
Tcl_SetResult(interp, (char *)"vecsub: non-numeric in second
argument", TCL_STATIC);
return TCL_ERROR;
}
Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewDoubleObj(d1-
d2));
Tcl_ListObjAppendElement(interp, tcl_dummy,
Tcl_NewDoubleObj(d3));
}
Tcl_SetObjResult(interp, tcl_result);
return TCL_OK;
}

//int AddObjCmd(ClientData clientData, Tcl_Interp *interp,int objc,
Tcl_Obj *CONST objv[]);

extern "C" {
int Add_Init(Tcl_Interp *interp) ;
} // end extern "C" *

int Add_Init(Tcl_Interp *interp) {
/* Register the Add command */
Tcl_CreateObjCommand(interp, "vecsub", obj_vecsub,(ClientData) NULL,
(Tcl_CmdDeleteProc *) NULL);

/* Declare the package */
Tcl_PkgProvide(interp, "vecsub", "1.1");
return TCL_OK;
}
.



Relevant Pages

  • Re: Segmentation fault in internal Tcl function
    ... events that happen in the Tcl/Tk window. ... display(Tcl_Interp* interp, ClientData clientData, int argc, char* ... argv[]) { ... Tcl_Eval(interp, cmd); ...
    (comp.lang.tcl)
  • Re: C++/TCL Need Solution to Compile Error c2784
    ... Last weekend I wrote an interface library for a PC-controlled USB oscilloscope. ... __declspecint ... SetSensitivityCmd (ClientData clientData, Tcl_Interp *interp, ... const char *msg, *eName; ...
    (comp.lang.tcl)
  • can I close file in a different thread?
    ... Tcl_Interp* interp; ... int myclose(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj ...
    (comp.lang.tcl)
  • Re: Need help with loading .SO file
    ... int GetText(ClientData clientData, ... int Proc_Init(Tcl_Interp *interp) ... int GetText(ClientData clientData, Tcl_Interp *interp, int argc, char ... But my main problem is compiling this the static TCL library. ...
    (comp.lang.tcl)
  • Re: Need help with loading .SO file
    ... int GetText(ClientData clientData, ... int Proc_Init(Tcl_Interp *interp) ... int GetText(ClientData clientData, Tcl_Interp *interp, int argc, char ... But my main problem is compiling this the static TCL library. ...
    (comp.lang.tcl)