Как передать массив целых чисел из Tcl в C ++?

Как отправить массив Tcl на C ++? Я написал следующий код:

Tcl:

set ns [new Simulator]set n [$ns node]
$n set X_ 100
$n set Y_ 30
$n set Z_ 0
set x [$n set X_]
set y [$n set Y_]
set z [$n set Z_]
#after 2000
set b {12 2 3 4 5}

set aa [new "Application/Trust/ITLeach"]
$aa set bufer_ 1
$aa set allnode_ $n
$aa set X_ $x
$aa set Y_ $y
$aa set Z_ $z
$aa set ClausterHeadID_   [array get b] **#send array to c++**
$ns at 0.0 "$aa start"puts $b
$ns run

ITLEACH.h:

#ifndef ns_ITLeach_h
#define ns_ITLeach_h
#include "app.h"#include "node.h"#include "tcl.h"#include "mobilenode.h"#include <iostream>
#include <fstream>
class ITLeach;
#define TCL_OK 0
class ITLeach : public  Application {
public:
ITLeach();virtual int command(int argc, const char*const* argv);

protected:
// need to define recv and timeout
void start();
int Buffer;
MobileNode * node ;
ofstream nodeSetting;
double XPos ;
double YPos ;
double ZPos ;
int ClausterHeadID [] ; //int array that passed from tcl file
int  ClausterID [] ;
int id_node;
};#endif

ITLEACH.cc:

/*
* ITLeach.cc
*
*  Created on: Oct 29, 2013
*      Author: root
*/

#include "ITLeach.h"static class ITLeachClass : public TclClass {
public:
ITLeachClass() : TclClass("Application/Trust/ITLeach") {}
TclObject* create(int, const char*const*) {
return (new ITLeach());
}
} class_app_ITLeach;

ITLeach::ITLeach() : Application() {
Tcl_Obj *baObj = Tcl_NewObj();
bind("bufer_",&Buffer);
bind("allnode_",&node);
bind("X_",&XPos);
bind("Y_",&YPos);
bind("Z_",&ZPos);
bind("ClausterHeadID_",(int *) &ClausterHeadID); // call array from tcl
bind("ClausterID_",ClausterID);
bind("id_",&id_node);

}

int ITLeach::command(int argc, const char*const* argv) {

if (strcmp(argv[1], "start") == 0) {
ITLeach::start();
return(TCL_OK);
}return(ITLeach::command(argc, argv));
}
void ITLeach::start()
{
//double x=0, y =0 , z =0;
nodeSetting.open("./leachnode.txt",fstream::app);

//node = (MobileNode*)Node::get_node_by_address(i);
//node->location()->getLocation(x,y,z);
//node->getLoc(&x,&y,&z);
nodeSetting << "id " << id_node << " x "<< XPos << " y " << YPos << " z " << ZPos <<"\n";nodeSetting.close();

printf(" claster head number : %d \n" ,ClausterHeadID[1]);
printf("node number is : %d \n",Buffer);
}

Я посылаю массив из Tcl с этим кодом:

$aa set ClausterHeadID_   [array get b] **#send array to c++**

и получить массив из C ++ с этим кодом:

bind("ClausterHeadID_",(int *) &ClausterHeadID); // call array from tcl

Но это не работает, пожалуйста, помогите мне.

0

Решение

Если эта команда привязана к строковому интерфейсу (то есть аргументы поступают через int argc, char **argv) тогда вы используете Tcl_SplitList() разобрать соответствующий аргумент (который может быть argv[argc-1]последний аргумент), а затем Tcl_GetInt() чтобы получить целое число от каждого из этих значений. Эти целые числа являются членами этого списка Tcl.

int listc;
char **listv;
if (Tcl_SplitList(interp, argv[argc-1], &listc, &listv) != TCL_OK) {
// wasn't a valid list!
return TCL_ERROR;
}
std::vector<int> theArray(listc, 0);
for (int i=0 ; i<listc ; i++) {
if (Tcl_GetInt(interp, listv[i], &theArray[i]) != TCL_OK) {
// wasn't an int in the list!
return TCL_ERROR;
}
}

Это не очень быстро! Для более быстрого пути вам нужно использовать Tcl_Objна основе API ( Tcl_Obj является фундаментальным типом значения Tcl первого класса), начиная с правильной регистрации функции реализации. После этого довольно легко преобразовать приведенный выше код:

int listc;
Tcl_Obj **listv;
if (Tcl_ListObjGetElements(interp, argv[argc-1], &listc, &listv) != TCL_OK) {
// wasn't a valid list!
return TCL_ERROR;
}
std::vector<int> theArray(listc, 0);
for (int i=0 ; i<listc ; i++) {
if (Tcl_GetIntFromObj(interp, listv[i], &theArray[i]) != TCL_OK) {
// wasn't an int in the list!
return TCL_ERROR;
}
}

Большая разница? Tcl_Obj знает, содержит ли он строку или целое число (или число с плавающей запятой, или любое другое число), и поэтому среда выполнения Tcl обычно не нуждается в повторном разборе или преобразовании значений, тогда как, если все является строкой, вы делаете много конверсий. (Обычно говорят «Все строкаВ Tcl, но это неточно; правильная версия «Все имеет идеальную сериализацию строк или является именованным объектомНо это довольно многословно.)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]