Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

File : freq.i */ %module freq. typemap(out) int * { int i;. result = PyTuple_New(256); for(i=0; i<256; i++). PyTuple_SetItem($result, i, PyLong_FromLong($1[i])); free($1);. extern int * frequency(char s[]);. swig -python freq.i. I/usr/local/lib/python2

Поиск

/* File : freq.i */ %module freq

 

%typemap(out) int * { int i;

 

$result = PyTuple_New(256); for(i=0; i<256; i++)

 

PyTuple_SetItem($result, i, PyLong_FromLong($1[i])); free($1);

 

}

 

extern int * frequency(char s[]);

 

Интерфейсные файлы содержат инструкции самогоSWIGи фрагментыC/C++-кода,возможно,с макровключениями(в примере выше:$result,$1).Следует заметить,что для преобразования массива целых чисел в кортеж элементов типа long,необходимо освободить память из-под исходного массива,в котором подсчитывались частоты.

 

Теперь(подразумевая,что используется компиляторgcc),создание модуля расширения может быть выполнено примерно так:

 

swig -python freq.i

 

gcc -c -fpic freq_wrap.c freq.c -DHAVE_CONFIG_H -I/usr/local/include/python2.3 -

I/usr/local/lib/python2.3/config

gcc -shared freq.o freq_wrap.o -o _freq.so

 

После этого в рабочем каталоге появляется файлы _freq.so и freq.py,которые вместе и дают доступ к требуемой функции:

 

>>> import freq

>>> freq.frequency("ABCDEF")[60:75]

 

(0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L)


 


Помимо этого,можно посмотреть на содержимое файлаfreq_wrap.c,который был порожденSWIG: в нем, среди прочих вспомогательных определений, нужных самому SWIG, можно увидеть что-то подобное проиллюстрированному выше примеру модуля md5.Вот фрагмент этого файла с определением обертки для функции frequency():

 

extern int *frequency(char []);

 

static PyObject *_wrap_frequency(PyObject *self, PyObject

*args) {

 

PyObject *resultobj; char *arg1 ;

int *result;

 

if(!PyArg_ParseTuple(args,(char *)"s:frequency",&arg1))

 

goto fail;

 

result = (int *)frequency(arg1);

 

{

 

int i;

 

resultobj = PyTuple_New(256); for(i=0; i<256; i++) PyTuple_SetItem(resultobj, i,

 



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 14; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.82.22 (0.007 с.)