Latest posts on Код на С++ в программе на Питоне topichttps://python.su/forum/topic/7/2006-10-30T10:15:43+02:00Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-30T10:15:43+02:00Александр1333<blockquote><em>koder</em><br/>Заголовок функции при вызове которой сбоит.</blockquote>typedef std::vector<char*> Record<br/><br/>class MyClass {<br/>/* */<br/> std::vector<Record>* Table;<br/> public:<br/>/* */<br/> char* Room(int, int); // Заголовок функции<br/>};<br/><br/>А вот код функции:<br/>char* MyClass::Room(int r, int c)<br/>{<br/> return (*Table); // Table, как это должно быть понятно, размещен в свободной памяти (new std::vector<Record>(#))<br/> // где # - размер<br/>}
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-26T15:31:25+03:00koder1299Заголовок функции при вызове которой сбоит.
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-26T13:36:32+03:00Александр1293<blockquote><em>koder</em><br/>Я так понимаю что Ты чистый С/C++-ный модуль swig-om обернул.<br/>А что возвращает функция (char *) или std::string?<br/>Заголовок кинь сюда.</blockquote>Заголовок класса на С++?<br/>Функции класса у меня расписаны в отдельном *.сс
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-20T12:46:14+03:00koder1198Я так понимаю что Ты чистый С/C++-ный модуль swig-om обернул.<br/>А что возвращает функция (char *) или std::string?<br/>Заголовок кинь сюда.
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-20T12:36:21+03:00Александр1197В общем, разобрался я с этим, правда затратным путем - swig<br/><br/>Работает, в принципе корректно.<br/>Но есть один баг: когда возваращается символьный массив в количстве символов, кратным восьми, то выглядит он примерно так: “сссссссс?”. где “с” - символ, реально содержащийся в массиве, “?” - какой-то левый символ. Причем в массивах не кратных восьми все нормально. И главное, - под FreeBSD такого нет, только под виндой
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-09T20:16:18+03:00koder917<blockquote><em>Александр</em><br/>Если функция объявлена не как ststic, библиотека компилится но в процессе выполнения программа рушится<br/>Если функция объявлена как ststic, то она не воспринимает переменные объявленные внутри класса</blockquote>1)Я подозреваю что начать надо с доки по плюсам.<br/>Если функция обявлена как static то она не имеет переменной this а соответственно не может обращатся <br/>к нестатичестким членам класса в т.ч. и переменным. static - аналог питоновского classmethod/staticmethod.<br/>(это я так на всякий случай если не знаеш).<br/>2)Скорее всего ошибка связанна не с биндингами а с самой ф-цией.Но без сырцов это трудно сказать.<br/>Сырцы можно под форточкой забилдить в студии и замечательно посмотреть в чем ошибка<br/>(ну или в линухе под gdb - мне както первое удобней). Я ж надеюсь ты там NDA не подписывал ;).<br/>Если не подписывал то смотри мой пост выше.
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-09T19:42:47+03:00Александр916Че-то фору не работал, говорят, что переезжают куда-то. <br/>В общем поколупался я со своим кодом:<br/>Если функция объявлена не как ststic, библиотека компилится но в процессе выполнения программа рушится<br/>Если функция объявлена как ststic, то она не воспринимает переменные объявленные внутри класса
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-05T12:18:59+03:00koder858<blockquote><em>Александр</em><br/>Куда можно выложить?<br/>Могу, конечно, и в форум, но длинноватые исходники</blockquote>Попробуй на рапиду rapidshare.de и кинь ссылку <br/>или вышли мне на мыло koder_dot_mail_at_gmail_dot_com<br/>(не вышли случайно исполняемый файл а то жмыло порежет)<br/>только я раньше завтра ничего не обещаю :)
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-05T12:18:58+03:00Александр857<blockquote><em>koder</em><br/>1)Ругань при компиляции наверно потому что type,Table ето переменные объявленные внутри класса.<br/>(может кон. они и global но по прив. коду етого не видно)</blockquote>Table объявлена внутри класса и работает успешно. Я это все сначала на С++ проверял, все работает<br/>А вот ретурн в Пайтон мне бы нужно сделать
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-05T12:06:21+03:00Александр856<blockquote><em>koder</em><br/>Или выложи где-нить все исходники целиком<br/>а то так сложно понять(мне по крайней мере)</blockquote>Куда можно выложить? <br/>Могу, конечно, и в форум, но длинноватые исходники
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-05T10:47:46+03:00koder855<blockquote><em>Александр</em><br/>Собирается успешно. (SWIG)<br/>Из под Пайтона работают все функции класса, кроме описаной выше, при вызове которой рушится программа<br/><br/>Я так полагаю, что это из-зи отсутсвия таблицы регистрации (PyMethodDef) и инициализации модуля (PyInintModule())<br/>Но где мне их прописывать (имеется ввиду в классе)?<br/><br/>Или ошибка в чем другом?<br/><br/>P.S.: если объявляю в классе static PyObject* Room(PyObject* self,PyObject* args); то ругань при компиляции огромная</blockquote>1)Ругань при компиляции наверно потому что type,Table ето переменные объявленные внутри класса.<br/>(может кон. они и global но по прив. коду етого не видно)<br/>2)Если-бы не было таблиц регистрации то ты бы даже не смог ее вызвать питон бы тебе сказал AttributeError<br/>Вообще если есть студия то можно ето отладить и все увидеть. Или выложи где-нить все исходники целиком <br/>а то так сложно понять(мне по крайней мере).<br/>3)Таблицы инициализации членов класса описываются не внутри класса(это невозможно) а на уровне модуля там же где и таблица ф-ций модуля. Вообще обязательно прочитай официальную докуметацию питона секцию Extending and Embedding там все замечатьльно написано можно даже куски кода потырить<br/>4)По поводу swig нужно еще кое-что добавить - н генерит СИЛЬНО не оптимальные обертки посмотри ради<br/>интереса что он понаваял. Там сначала питоновская прослойка(монстроидная) потом сишная. В общем <br/>накладные расходы на вызов пустой ф-ции обернутой swig > в 20 раз больше чем обернутой руками.<br/>5)Если с плюсами все впорядке(шаблоны) то идеальный вариант - boost.python. Генерит замечательные обертки причем там есть модуль который не хуже swig - c пом. gccxml на автомате сам все делает.<br/>Но к етому он позволяет добратся до самого низкого уровня, если нужно.
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-10-05T00:30:45+03:00Александр850<blockquote><em>slav0nic</em><br/>посмотри для примера <a href="http://slav0nic.xss.ru/projects/procfs.tar.gz">http://slav0nic.xss.ru/projects/procfs.tar.gz</a><br/>со времён “книги Лутца” python API вродже как поменяль (помню долго парился не понимая чего не компилится=) )<br/><br/>думаю простой срр легко “портировать”, просто сделать каркас и ретурны “сделать в питон” и всё</blockquote>Порылся я в энтих исходниках и наваял примерно такое:<br/>class MyClass {<br/>/* */<br/> public:<br/>/* */<br/> PyObject* Room(PyObject* self,PyObject* args);<br/>};<br/><br/>А вот код функции:<br/>PyObject* MyClass::Room(PyObject* setf,PyObject* args)<br/>{<br/> int r, c;<br/> PyArg_Parse(args, “(ii)”, &r, &c);<br/> switch (type) {<br/> case ‘C’:<br/> return Py_BuildValue(“s”,Table);<br/> break;<br/> case ‘N’:<br/> return Py_BuildValue(“i”,atoi(Table));<br/> case ‘F’:<br/> return Py_BuildValue(“f”,atof(Table));<br/> break;<br/> default:<br/> return Py_BuildValue(“s”,“Unknown type!”);<br/> break;<br/> }<br/>}<br/><br/>Собирается успешно. (SWIG)<br/>Из под Пайтона работают все функции класса, кроме описаной выше, при вызове которой рушится программа<br/><br/>Я так полагаю, что это из-зи отсутсвия таблицы регистрации (PyMethodDef) и инициализации модуля (PyInintModule())<br/>Но где мне их прописывать (имеется ввиду в классе)?<br/><br/>Или ошибка в чем другом?<br/><br/>P.S.: если объявляю в классе static PyObject* Room(PyObject* self,PyObject* args); то ругань при компиляции огромная
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-05-15T16:55:31+03:00Александр35<blockquote><em>slav0nic</em><br/>посмотри для примера <a href="http://slav0nic.xss.ru/projects/procfs.tar.gz">http://slav0nic.xss.ru/projects/procfs.tar.gz</a><br/>со времён “книги Лутца” python API вродже как поменяль (помню долго парился не понимая чего не компилится=) )<br/><br/>думаю простой срр легко “портировать”, просто сделать каркас и ретурны “сделать в питон” и всё</blockquote>Спасибо
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-05-15T00:52:33+03:00slav0nic33посмотри для примера <a href="http://slav0nic.xss.ru/projects/procfs.tar.gz">http://slav0nic.xss.ru/projects/procfs.tar.gz</a><br/>со времён “книги Лутца” python API вродже как поменяль (помню долго парился не понимая чего не компилится=) )<br/><br/>думаю простой срр легко “портировать”, просто сделать каркас и ретурны “сделать в питон” и всё
Общий :: Python для экспертов :: Код на С++ в программе на Питоне
2006-04-19T10:07:53+03:00Александр20В книге М.Лутца “Программирование на Python” тоже неплохо рассказано о SWIG<br/><br/>А у меня вопрос такой:<br/>У меня есть класс на С++, примерно такой:<br/>#include <vector><br/>#include <cstring><br/>#include <new><br/><br/>class Table {<br/> /* */<br/> char* name;<br/> public:<br/> std::vector<std::vector<char*> >* t;<br/><br/> Table(char* n)<br/> {<br/> name=n;<br/> t=new std::vector<std::vector<char*> >(1),(1);<br/> (*t)=new char;<br/> strcpy((*t),“My_string!”);<br/> }<br/><br/> ~Table()<br/> {<br/> delete (*t);<br/> delete t;<br/> }<br/>};<br/><br/>С помощью того же SWIG я скомпиллил либу и модуль для Питона<br/><br/>На С++ классом можно пользоваться так:<br/>#include “tclass.h”<br/>#include <stdio.h><br/><br/>main()<br/>{<br/> Table tbl(“dbf”);<br/> printf(“%s\n”, (*tbl.t));<br/> return 0;<br/>}<br/><br/>А как на Питоне? У него ж указателей нет!<br/>Я пишу так:<br/>from tclass import Table<br/><br/>tbl=Table(“My_string!”)<br/>print tbl.t # Это не то, так как Питон воспринимает этот не разыменованый указатель как строку