Если ваши строки в основном ASCII или UTF-8, все, что вам нужно сделать, это сообщить SWIG, что ваша функция выделила строку, которую она возвращает. Подробнее см. документы SWIG на C строках.
ваш код. c
char *Itla_Get_Model_Version (int laser, char * mv_string) {
// I assume this is a proxy for something more complicated...
const char *mod_ver ="PPCL600";
size_t len = strlen(mod_ver) + 1;
char *output = malloc(len);
memcpy(output, mod_ver, len);
printf ( "Itla_Get_Model_Version : read %s \n", mod_ver );
return output;
}
yourcode.h
char *Itla_Get_Model_Version(int laser, char * mv_string);
yourcode.swig
/* Tell SWIG that this function returns something to be freed */
%newobject Itla_Get_Model_Version
/* And now we can use the standard C header */
%include "yourcode.h"
Если вышеприведенное простое решение не работает…
Все становится намного сложнее, если вы используете другую кодировку для строк или если вы заключаете их в структуру (как вы делали в своем вопросе). В этот момент вам понадобится карта типов , особенно из Tcl . Правильное написание таблицы типов зависит от понимания семантики значений, которые вы производите и / или потребляющих и семантики языка, который вы используете. Предполагая, что вы хотите обтекание, вот очень простая выходная карта типов, которая может работать:
%typemap(out) stringout2* {
Tcl_SetObjResult(interp, Tcl_NewStringObj($1->modelvers, -1));
free($1);
}
Ваша функция также нуждается в , которую нужно изменить вернуть stringout2*
, выполнив return pointer2;
, а не stringout2
, так как в противном случае у вас будет утечка памяти при каждом вызове. Вы можете вернуть stringout2
, но если вы делаете это, вы должны не выделить его с помощью malloc
, а хранить его как структуру непосредственно в локальной переменной.
В этом случае вы использовали бы типографскую карту:
%typemap(out) stringout2 {
Tcl_SetObjResult(interp, Tcl_NewStringObj($1.modelvers, -1));
}
(обратите внимание на другой тип, другой доступ к полю и отсутствие free
.)
И ваша структура должна быть объявлена как содержащая const char *
, если это действительно так.
Если у вас есть строки в другой кодировке (и это не ISO 8859- 1, для которого вы можете обмануть и использовать двоичную строку, используя Tcl_NewByteArrayObj
(это также то, что вы хотите для обработки фрагмента двоичных данных), тогда вам нужно написать карту типов, используя Tcl_ExternalToUtfDString
, и количество шаблонов код идет вверх. Tcl настаивает , что его внутренние строки находятся в (почти) UTF-8, и ASCII тоже в порядке, поскольку это строгое подмножество; все остальное необходимо преобразовать.
Задайте другой вопрос, если это то, что вам нужно. Вы, вероятно, имеете дело либо с ASCII, либо с двоичными данными, поэтому я оставлю (чуть более сложное!) Преобразование кодировки в покое, пока не будет запрошено.