Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/20: Рейтинг темы: голосов - 20, средняя оценка - 4.75
 Аватар для BoDRbIi
60 / 10 / 0
Регистрация: 21.07.2009
Сообщений: 248

С++ to Python

02.11.2011, 22:22. Показов 3964. Ответов 11

Студворк — интернет-сервис помощи студентам
Здравствуйте. Не можете подсказать как перевести код с С++
C++
1
matr[j]=Arr[j+1];
на python
если написать
Python
1
matr[j]=Arr[j+1]
То получаю ошибку IndexError: list assignment index out of range

Добавлено через 46 минут
Переделываю вот такой код по расчету определителя матрицы.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
double determ(int** Arr, int size);
 
int main()
{
        srand(time(NULL));
        int size=3;
        int**Arr;
        Arr=new int*[size];
        for(int i=0;i<size;++i)
                Arr[i]=new int[size];
        for(int i=0;i<size;++i)
                for(int j=0;j<size;++j)
                        Arr[i][j]=0+rand()%5-1+1;
        for(int i=0;i<size;++i)
        {
                for(int j=0;j<size;++j)
                        std::cout<<Arr[i][j]<<' ';
                std::cout<<std::endl;
        }
        std::cout<< determ(Arr, size) <<'\n';
        for(int i=0;i<size;++i)
                delete[] Arr[i];
        delete[] Arr;
        return 0;
}
 
double determ(int** Arr, int size)
{
        int i,j;
        double det=0;
        int** matr;
        if(size==1)
        {
                det=Arr[0][0];
        }
        else if(size==2)
        {
                det=Arr[0][0]*Arr[1][1]-Arr[0][1]*Arr[1][0];
        }
        else
        {
                matr=new int*[size-1];
                for(i=0;i<size;++i)
                {
                        for(j=0;j<size-1;++j)
                        {
                                if(j<i) 
                                        matr[j]=Arr[j];
                                else
                                        matr[j]=Arr[j+1]; //проблемное место при переводе на Python
                        }
                        det+=pow((double)-1, (i+j))*determ(matr, size-1)*Arr[i][size-1];
                }
                delete[] matr;
        }
        return det;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.11.2011, 22:22
Ответы с готовыми решениями:

Python - момент истины. Python - как оружие возмездие против системы
Какие модули в python мне нужны для взлома баз данных? Перехвата информации? Внедрения в систему? Добавлено через 10 минут Хочу...

Software Developer Python/Data or ready to improve Python (Санкт-Петербург)
We are looking for experienced server-side developers who are interested in improving their skills and knowledge in Python and ETL/Data. We...

Запуск скрипта написанного на python на windows, где не установлен python
Не запускается скрипт на Windows, где не установлен python. Команда в коде на выполнение написана так: def Adminnewpriglash(): ...

11
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.11.2011, 01:54
Цитата Сообщение от BoDRbIi
То получаю ошибку IndexError: list assignment index out of range
нужно сначала создать список, в котором есть все индексы

Python
1
2
3
4
5
>>> lst = [None for i in range(5)]
>>> lst[4] = 1
>>> lst
[None, None, None, None, 1]
>>>
Цитата Сообщение от BoDRbIi
C++
1
2
3
4
        int**Arr;
        Arr=new int*[size];
        for(int i=0;i<size;++i)
                Arr[i]=new int[size];
вот это ты не воспроизвёл
0
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 5
07.11.2011, 14:16
уважаемые форумчане, такое вопрос. пишу питон-оболочку для с++ кода.
моя с++ функция возвращает два массива: один -вещественных чисел, второй - комплексных. Соответственно, появляется проблема "конвертации" массива в объект numpy.ndarray.
поскольку данная процедура является для меня совершенно новой, предварительно пробую запустить готовые примеры. вот участок кода Module.cpp
#include <C:\Python27\include\Python.h>
#include <c:\Python27\Lib\site-packages\numpy\core\include\numpy\arrayo bject.h>

static PyObject *testArray(PyObject *self, PyObject *args)
{
PyArrayObject *xcoor, *ycoor;
PyObject *func1;
int nx, ny;
if (!PyArg_ParseTuple(args, "O!O!",
&PyArray_Type, &xcoor,
&PyArray_Type, &ycoor)
)
{
return NULL;
}


PyArrayObject *a;
npy_intp dims[2];
dims[0] = 1;
dims[1] = 3;

a = (PyArrayObject*) PyArray_SimpleNew(2, dims, NPY_DOUBLE);

return Py_BuildValue("d", 3.0);

}
static PyMethodDef ModuleMethods[] = {
{"testArray", testArray, METH_VARARGS, "testArray"},
{NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initmodule(void)
{
(void) Py_InitModule("module", ModuleMethods);
}

таким образом функция должна лишь принять два массива из Питона и создать массив.
компиляцию провожу из командной строки


cl /LD Module.cpp /Ic:\Python27\include c:\Python27\libs\python27.lib /link/out:H:\myWork\python\module.pyd
тут проблем не возникает.

код Питона:

import modulecpp
from numpy import *
xcoor=zeros(2);
xcoor[0]=1;
xcoor[1]=2;

ycoor=zeros(2);
ycoor[0]=3;
ycoor[1]=4;

A= modulecpp.testArray(xcoor,ycoor)

при запуске питоновского кода происходит завершение работы pythonw.exe
как я поняла, такой сценарий у меня наблюдается при обработке команд
if (!PyArg_ParseTuple(args, "O!O!",
&PyArray_Type, &xcoor,
&PyArray_Type, &ycoor)
...
и

a = (PyArrayObject*) PyArray_SimpleNew(2, dims, NPY_DOUBLE);

не могу понять, почему. Кто может, помогите
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.11.2011, 16:14
Цитата Сообщение от Hellen88
не могу понять, почему
надо запустить консоль питона win+r python и в ней выполнить скрипт
когда он не запустится, тогда станет видно, из-за чего

оборачивай код в теги кода, чтобы не терялось форматирование
0
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 5
07.11.2011, 22:24
accept,
сделала как Вы сказали
подробности проблемы:

Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: Python.exe
Версия приложения: 0.0.0.0
Отметка времени приложения: 4df4ba7c
Имя модуля с ошибкой: modulecpp.pyd
Версия модуля с ошибкой: 0.0.0.0
Отметка времени модуля с ошибкой: 4eb7acd4
Код исключения: c0000005
Смещение исключения: 0000262c
Версия ОС: 6.1.7600.2.0.0.256.1
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

к сожалению, мне это ни о чем не говорит
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.11.2011, 22:56
запусти консоль и там набери
Python
1
import modulecpp
0
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 5
07.11.2011, 23:45
accept,

сделала
никаких ошибок.
проблемы с импортом нету. проблема в сишном коде при вызове любой функции, включающей элементы numpy. а.и.

C++
1
2
3
if (!PyArg_ParseTuple(args, "O!O!",
&[B]PyArray_Type[/B], &xcoor, 
&[B]PyArray_Type[/B], &ycoor)
и

C++
1
a = (PyArrayObject*) PyArray_SimpleNew(2, dims, NPY_DOUBLE);
если закоментировать эти участки, все работает нормально.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
08.11.2011, 01:50
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "C:\Python27\include\Python.h"
#include "C:\Python27\Lib\site-packages\numpy\core\include\numpy\arrayobject.h"
 
static PyObject *testArray(PyObject *self, PyObject *args)
{
    PyArrayObject *xcoor, *ycoor, *a;
    PyObject *func1;
    int nx, ny;
 
    if (!PyArg_ParseTuple(args, "O!O!", &PyArray_Type, &xcoor,
                                        &PyArray_Type, &ycoor))
        return NULL;
 
    npy_intp dims[2] = { 1, 3 };
    a = (PyArrayObject *) PyArray_SimpleNew(2, dims, NPY_DOUBLE);
    return Py_BuildValue("d", 3.0);
}
 
static PyMethodDef ModuleMethods[] = {
    { "testArray", testArray, METH_VARARGS, "testArray" },
    { NULL, NULL, 0, NULL }
};
 
PyMODINIT_FUNC initmodule(void)
{
    (void) Py_InitModule("module", ModuleMethods);
}
выровнял только (очень трудно разбираться в коде без отступов)

python.org. PyArg_ParseTuple. example

1) вот у тебя указатель func1 - это что ?
2) PyArray_Type это где взято ?
3) PyArray_SimpleNew это где взято ?
0
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 5
08.11.2011, 11:35
вы не на то смотрите
http://python.org.PyArg_ParseTuple.example - простые примеры обработки кортежей, содержащий объекты типа числа, строки, списка и др.
моя проблема заключается с обработкой массивов, описания которых содержатся в дополнительном модуле numpy.

здесь вообще есть люди, работающие с numpy?
примеры взяты с этой книги, соотнесены с кучей примеров из различных интернет-ресурсов.
http://www.springerlink.com/co... 828083887/

т.о.
1) func1 - извиняюсь, лишнее, не зачистила, осталось с предыдущих экспериментов.
2) PyArray_Type - проверка на соответствие принимаемого объекта требуемым условиям. взято из numpy\arrayobject.h
3) аналогично PyArray_SimpleNew - функция создания массива. взято из numpy\arrayobject.h
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
09.11.2011, 06:54
Цитата Сообщение от Hellen88
вы не на то смотрите
там находится описание функции PyArg_ParseTuple() (переход к нему)

ndarrayobject.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#define PyArray_TYPE(obj) (((PyArrayObject *)(obj))->descr->type_num)
 
typedef struct PyArrayObject {
        PyObject_HEAD
        char *data;             /* pointer to raw data buffer */
        int nd;                 /* number of dimensions, also called ndim */
        npy_intp *dimensions;       /* size in each dimension */
        npy_intp *strides;          /* bytes to jump to get to the
                                   next element in each dimension */
        PyObject *base;         /* This object should be decref'd
                                   upon deletion of array */
                                /* For views it points to the original array */
                                /* For creation from buffer object it points
                                   to an object that shold be decref'd on
                                   deletion */
                                /* For UPDATEIFCOPY flag this is an array
                                   to-be-updated upon deletion of this one */
        PyArray_Descr *descr;   /* Pointer to type structure */
        int flags;              /* Flags describing array -- see below*/
        PyObject *weakreflist;  /* For weakreferences */
} PyArrayObject;
 
/* Change dtype hasobject to 32-bit in 1.1 and change its name */
typedef struct _PyArray_Descr {
        PyObject_HEAD
        PyTypeObject *typeobj;  /* the type object representing an
                                   instance of this type -- should not
                                   be two type_numbers with the same type
                                   object. */
        char kind;              /* kind for this type */
        char type;              /* unique-character representing this type */
        char byteorder;         /* '>' (big), '<' (little), '|'
                                   (not-applicable), or '=' (native). */
        char hasobject;         /* non-zero if it has object arrays
                                   in fields */
        int type_num;          /* number representing this type */
        int elsize;             /* element size for this type */
        int alignment;          /* alignment needed for this type */
        struct _arr_descr                                       \
        *subarray;              /* Non-NULL if this type is
                                   is an array (C-contiguous)
                                   of some other type
                                */
        PyObject *fields;       /* The fields dictionary for this type */
                                /* For statically defined descr this
                                   is always Py_None */
 
        PyObject *names;        /* An ordered tuple of field names or NULL
                                   if no fields are defined */
 
        PyArray_ArrFuncs *f;     /* a table of functions specific for each
                                    basic data descriptor */
 
        PyObject *metadata;     /* Metadata about this dtype */
} PyArray_Descr;
 
#define PyArray_SimpleNew(nd, dims, typenum)                                  \
        PyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)
__multiarray_api.h
C
1
2
3
4
5
6
7
8
#define PyArray_Type (*(PyTypeObject *)PyArray_API[2])
 
NPY_NO_EXPORT PyObject * PyArray_New \
       (PyTypeObject *, int, npy_intp *, int, npy_intp *, void *, int, int, PyObject *);
 
#define PyArray_New \
        (*(PyObject * (*)(PyTypeObject *, int, npy_intp *, int, npy_intp *, void *, int, int, PyObject *)) \
         PyArray_API[93])
multiarray_api.txt
Code
1
2
3
4
5
6
7
8
::
 
  PyObject *
  PyArray_New(PyTypeObject *subtype, int nd, intp *dims, int
              type_num, intp *strides, void *data, int itemsize, int
              flags, PyObject *obj)
 
Generic new array creation routine.
Цитата Сообщение от Hellen88
1) func1 - извиняюсь, лишнее, не зачистила, осталось с предыдущих экспериментов.
чтобы сразу вычищать, нужно писать с отступами
а так получился лишний оператор

np.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <python2.7/Python.h>
#include "/usr/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h"
 
static PyObject *testArray(PyObject *self, PyObject *args)
{
    PyArrayObject *xcoor, *ycoor, *a;
    npy_intp dims[2];
    
    if (!PyArg_ParseTuple(args, "O!O!", &PyArray_Type, &xcoor,
                                        &PyArray_Type, &ycoor))
        return NULL;
 
    dims[0] = 1;
    dims[1] = 3;
    a = (PyArrayObject *) PyArray_SimpleNew(2, dims, NPY_DOUBLE);
    return Py_BuildValue("d", 3.0);
}
 
static PyMethodDef ModuleMethods[] = {
    { "testArray", testArray, METH_VARARGS, "testArray" },
    { NULL, NULL, 0, NULL }
};
 
PyMODINIT_FUNC initnpmod(void)
{
    (void) Py_InitModule("npmod", ModuleMethods);
}
cmd
Code
1
2
gcc -Wall -fPIC -c np.c -o npmod.o
gcc -Wall -shared npmod.o -o npmod.so
Code
1
2
3
4
5
6
[guest@localhost mod]$ . cmd
/usr/lib/python2.7/site-packages/numpy/core/include/numpy/__multiarray_api.h:1187:1: предупреждение: ‘_import_array’ определена, но нигде не используется
[guest@localhost mod]$ su
Пароль: 
[root@localhost mod]# cp npmod.so /usr/lib/python2.7/lib-dynload
[root@localhost mod]#
np.py
Python
1
2
3
4
5
6
7
8
9
10
11
import npmod
import numpy
 
xcoor = numpy.zeros(2)
xcoor[0], xcoor[1] = 1, 2
 
ycoor = numpy.zeros(2)
ycoor[0], ycoor[1] = 3, 4
 
print dir(npmod)
a = npmod.testArray(xcoor, ycoor)
Code
1
2
3
4
[guest@localhost mod]$ python np.py
['__doc__', '__file__', '__name__', '__package__', 'testArray']
Ошибка сегментирования (core dumped)
[guest@localhost mod]$
Добавлено через 16 минут
с дебагом

np.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <python2.7/Python.h>
#include "/usr/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h"
 
static PyObject *testArray(PyObject *self, PyObject *args)
{
    /* PyArrayObject *xcoor, *ycoor, *a; */
    PyArrayObject *xcoor, *ycoor;
    PyArrayObject *a;
    npy_intp dims[2];
    PyObject *retval;
    
    printf("here1\n");
    if (!PyArg_ParseTuple(args, "O!O!", &PyArray_Type, &xcoor,
                                        &PyArray_Type, &ycoor))
        return NULL;
 
    dims[0] = 1;
    dims[1] = 3;
    printf("here2\n");
    a = (PyArrayObject *) PyArray_SimpleNew(2, dims, NPY_DOUBLE);
    
    printf("here3\n");
    retval = Py_BuildValue("d", 3.0);
    
    printf("here4\n");
    return retval;
}
 
static PyMethodDef ModuleMethods[] = {
    { "testArray", testArray, METH_VARARGS, "testArray" },
    { NULL, NULL, 0, NULL }
};
 
PyMODINIT_FUNC initnpmod(void)
{
    (void) Py_InitModule("npmod", ModuleMethods);
}
np.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
import npmod
import numpy
 
xcoor = numpy.zeros(2)
xcoor[0], xcoor[1] = 1, 2
 
ycoor = numpy.zeros(2)
ycoor[0], ycoor[1] = 3, 4
 
print dir(npmod)
print dir(npmod.testArray)
a = npmod.testArray(xcoor, ycoor)
Code
1
2
3
4
5
6
[guest@localhost mod]$ python np.py
['__doc__', '__file__', '__name__', '__package__', 'testArray']
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
here1
Ошибка сегментирования (core dumped)
[guest@localhost mod]$
0
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 5
09.11.2011, 10:00
ошибку нашла
как оказалось, при инициализации моего модуля я пропустила одну простую строчку

C++
1
import_array();
- которая необходима при работе с numpy\arrayobject.h
т.о. инициализация модуля должна быть записана так:
C++
1
2
3
4
5
6
7
8
PyMODINIT_FUNC
initmodulecpp(void)
{
    (void) Py_InitModule("modulecpp", ModuleCppMethods);
    import_array();
 
 
}
В любом случае, спасибо за помощь
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
09.11.2011, 10:25
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[guest@localhost mod]$ . cmd
[guest@localhost mod]$ su
Пароль: 
[root@localhost mod]# cp npmod.so /usr/lib/python2.7/lib-dynload
cp: переписать «/usr/lib/python2.7/lib-dynload/npmod.so»? y
[root@localhost mod]# exit
[guest@localhost mod]$ python np.py
['__doc__', '__file__', '__name__', '__package__', 'testArray']
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
here1
here2
here3
here4
[guest@localhost mod]$
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.11.2011, 10:25
Помогаю со студенческими работами здесь

Cx_freeze python error in main script как исправить- Python
Пытался создать из .py .exe , но при запуске .exe получаю ошибку вот код setup.py from cx_Freeze import setup, Executable import os ...

Maching pursuit. Согласованный поиск на Python. Требуется сам алгоритм, написанный на Python
Требуется сам алгоритм, написанный на Python. Заранее спасибо.

Senior Python developer (Python, Django, JavaScript, Cloud) in Munich, Germany,visa sponsorship
An innovative software vendor are seeking an experienced system developer who wishes to remain hands-on writing code in a mixed Python...

Python cv2 сконвертировать Python многомерный массив в картинку
Python cv2, необходимо сконвертировать многомерный массив в картинку, например: Дано: , , ] Где каждые 3 значения - цвета пикселя...

Как из Python скрипта выполнить другой python скрипт?
Как из Python скрипта выполнить другой python скрипт? Если он находится в той же папке но нужно передать еще передать скрипту аргументы.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru