The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Reference variable из Tcl в C++"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Reference variable из Tcl в C++" 
Сообщение от Inkognito emailИскать по авторуВ закладки on 04-Ноя-05, 11:42  (MSK)
Здравстуйте. Такой вот вопрос, нужно передать из Tcl out параметр в функцию. Т.е. что то вроде reference -а.
в Tcl -е это делаеться так

proc setByUpvar { name value } {
    upvar $name localVar
    set localVar $value
}

set originalVar 1
puts $originalVar
setByUpvar originalVar 2
puts $originalVar

А вот в Си не знаю. Делаю что то вроде этого, программа вылетает к чертовой матери...Есть кто нибудь кто работал с Tcl?

int connection::init(Tcl_Interp* interp, int objc, Tcl_Obj *CONST objv[])
{
  Tcl_Obj *objPtr = Tcl_ObjGetVar2(interp, objv[0], (Tcl_Obj*) NULL, TCL_LEAVE_ERR_MSG);
  if ( Tcl_IsShared(objPtr) )
  {
    objPtr = Tcl_DuplicateObj(objPtr);
  }

  Tcl_SetStringObj(objPtr, "Hello!", 6);
  Tcl_InvalidateStringRep(objPtr);
  Tcl_ObjSetVar2(interp, objv[0], objPtr, objPtr, TCL_LEAVE_ERR_MSG);
}

Что здесь неправильно???

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

1. "Reference variable из Tcl в C++" 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 04-Ноя-05, 13:22  (MSK)
1) не забываем extern "C" - Tcl _не_понимает_ объектников и библиотек C++
(то есть надо делать функцию оболочку)
2) не забываем return TCL_OK - в вашем примере отсутсвие возвращаемого   результата - просто грубай ошибка

в дополнении - в дистр. tcl есть примеры-интрерфейса с С
и http://wiki.tcl.tk/2?Q=c%2B%2B

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Reference variable из Tcl в C++" 
Сообщение от Inkognito emailИскать по авторуВ закладки on 04-Ноя-05, 13:28  (MSK)
>1) не забываем extern "C" - Tcl _не_понимает_ объектников и библиотек C++
>
> (то есть надо делать функцию оболочку)
>2) не забываем return TCL_OK - в вашем примере отсутсвие возвращаемого  
> результата - просто грубай ошибка
>
>в дополнении - в дистр. tcl есть примеры-интрерфейса с С
http://wiki.tcl.tk/2?Q=c%2B%2B

TCL_OK не отуствует, это просто скопированный кусок кода. Дальнейший код функции я не привел. А вот про extern "C" не знал. А остальное написано верно???

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Reference variable из Tcl в C++" 
Сообщение от Inkognito emailИскать по авторуВ закладки on 04-Ноя-05, 13:40  (MSK)
extern "C" int connection::init(Tcl_Interp* interp, int objc, Tcl_Obj *CONST objv[])
{
  Tcl_Obj *objPtr = Tcl_ObjGetVar2(interp, objv[0], (Tcl_Obj*) NULL, TCL_LEAVE_ERR_MSG);
  if ( Tcl_IsShared(objPtr) )
  {
    objPtr = Tcl_DuplicateObj(objPtr);
  }

  Tcl_SetStringObj(objPtr, "Hello!", 6);
  Tcl_InvalidateStringRep(objPtr);
  Tcl_ObjSetVar2(interp, objv[0], objPtr, objPtr, TCL_LEAVE_ERR_MSG);
  return TCL_OK;
}
Кстати все равно выдает Segmentation Fault на Tcl_ObjGetVar2
В http://wiki.tcl.tk/ я был, ничего не нашел подxодящего. Если не сложно приведите пример простейшей работающей функции например для int&

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Reference variable из Tcl в C++" 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 04-Ноя-05, 14:50  (MSK)
mylib.cc :
---------
#include <tcl.h>

extern "C" {
/**
    присвоить перемееной значение другой переменной,
    обе представленны своими именами, вернуть полученное значение
    в коде можно использовать все навороты C++
*/
static int MyprocCmd(
ClientData clientData,
Tcl_Interp *interp,
int objc,
Tcl_Obj * const *objv) {
char *name1,*name2;
char *value;
if (objc!=3) {
Tcl_WrongNumArgs(interp,1,objv,"varName1 varName2");
return TCL_ERROR;
}
        /* чтобы не парсить имена переменных
           используются простые команды
        */
name1=Tcl_GetString(objv[1]);
name2=Tcl_GetString(objv[2]);
value=(char *)Tcl_GetVar(interp,name2,0);
if ( Tcl_SetVar(interp,name1,value,0) == NULL ) {
return TCL_ERROR;
}
Tcl_SetResult(interp,value,NULL);
return TCL_OK;
}

/** unsafe library initialization
predefined function name : library_Init
(for safe init : library_SafeInit)
*/
int Mylib_Init(Tcl_Interp *interp) {
int code;
if (Tcl_InitStubs(interp,TCL_VERSION,1) == NULL) {
return TCL_ERROR;
}
code = Tcl_PkgProvide(interp,"Mylib","0.1");
if (code != TCL_OK)
return code;
Tcl_CreateObjCommand(interp,"myproc",MyprocCmd,
(ClientData) 0,(Tcl_CmdDeleteProc *) NULL);
return TCL_OK;
}

}
----
сборка :
  g++ mylib.cc /usr/lib/tclstub$(TCL_VERSION).a -o mylib.so && chmod +x mylib.so

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Reference variable из Tcl в C++" 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 04-Ноя-05, 14:51  (MSK)
g++ ественно с опцией -shared

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Reference variable из Tcl в C++" 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 04-Ноя-05, 14:59  (MSK)
;-)
сначала написал пример, потом повнимательнее посмотрел Ваш код ;-)

objv[0] - ЭТО НЕ ПАРАМЕТР - это имя команды, так же как в main(int,char**)


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Reference variable из Tcl в C++" 
Сообщение от Inkognito emailИскать по авторуВ закладки on 04-Ноя-05, 15:09  (MSK)
>;-)
>сначала написал пример, потом повнимательнее посмотрел Ваш код ;-)
>
>objv[0] - ЭТО НЕ ПАРАМЕТР - это имя команды, так же как
>в main(int,char**)

Извините, забыл об этом упомянуть :) У меня собственоручно написанный wrapper. Он передает функции уже готовые параметры :) т.е. objv[0] это параметр. Из Tcl а вызываеться другая функция, которая вызывает мою connection::init так что с этим все в порядке

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Reference variable из Tcl в C++" 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 04-Ноя-05, 15:40  (MSK)
так бы сразу и сказали, что врапер у Вас уже есть ;-)
а что там в objv[0] лежит ? и с какими криками всё падает ??
cerr<<(void *)objv[0];
cerr<<Tcl_GetString(objv[0]);
??

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Reference variable из Tcl в C++" 
Сообщение от Inkognito emailИскать по авторуВ закладки on 04-Ноя-05, 16:47  (MSK)
>так бы сразу и сказали, что врапер у Вас уже есть ;-)
>
>а что там в objv[0] лежит ? и с какими криками всё
>падает ??
>cerr<<(void *)objv[0];
>cerr<<Tcl_GetString(objv[0]);
>??

set c "AAAAAA"
connection init $c
> 0x9e651d0AAAAAA166039056
Вот что лежит там...
0x9e651d0 - это ясно, адрес objv[0]
AAAAAA - это мой текст
166039056 - А это что такое???

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "Reference variable из Tcl в C++" 
Сообщение от Inkognito emailИскать по авторуВ закладки on 04-Ноя-05, 16:50  (MSK)
> 166039056 - А это что такое???

Это не в счет..забыл, это адрес который вернул init. Результать Tcl return -а...
Вобщем там мой string лежит.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "Reference variable из Tcl в C++" 
Сообщение от Inkognito emailИскать по авторуВ закладки on 04-Ноя-05, 16:56  (MSK)
Если не трудно давай в ICQ поговорим...мой номер
173549200
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "Reference variable из Tcl в C++" 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 04-Ноя-05, 16:55  (MSK)
>>так бы сразу и сказали, что врапер у Вас уже есть ;-)
>>
>>а что там в objv[0] лежит ? и с какими криками всё
>>падает ??
>>cerr<<(void *)objv[0];
>>cerr<<Tcl_GetString(objv[0]);
>>??
>
>set c "AAAAAA"
>connection init $c
>> 0x9e651d0AAAAAA166039056
>Вот что лежит там...
>0x9e651d0 - это ясно, адрес objv[0]
>AAAAAA - это мой текст
>166039056 - А это что такое???

Нормальная отладка C/C++ ;-) смотрим что с параметрами и откуда они такие взялись..
это может быть результат вашего враппера ;-)
попробуте Tcl_GetStringFromObj - он по ходу скажет еще и значащую длинну строки

icq 6901408

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру