LINUX.ORG.RU

Python + C++


0

0

Возникла такая ситуация: есть указатель на объект представленный в виде инта, т.е.:

std::vector<int>::iterator it;
unsigned int k = (int) &it;
получается число, состоящее из 10 цифр. Его нужно передать в питон, который в последствии вернет это число обратно в ту же c++ программу, что его и выдало, в которой произойдет обратное преобразование.
unsigned int l = ......;
std::vector<int>::iterator it1 = *((std::vector<int>::iterator*) l);
другими словами через питон передается указатель в виде числа. но есть одна проблема: ограничение на максимально возможное значение инта в питоне и при конвертации в PyObject* происходит выход за пределы этой границы и получается совершенно не то, что надо.

теперь собственно сам вопрос: как можно это обойти? конечно, можно двумя числами передавать, но это не приемлимо.

Есть идейка: узнать откуда начинается адресное пространство процесса чтобы вычитать адреса и получать вполне себе маленькое число, которое без проблем передастся и поместится в ограничение питона LONG_MAX.

ЗЫ: для чего это мне надо — не спрашивайте =)

UPD: строкой передавать не вариант — время конвертации строки в число большое.


> при конвертации в PyObject* происходит выход за пределы этой границы и получается совершенно не то, что надо.

Используй другой форматный символ.

ограничение питона MAX_LONG.

У Питона нет такого ограничения.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Используй другой форматный символ.

например? всё происходит вот так:

 PyObject* res = PyLong_FromUnsignedLong(midUInt); 

У Питона нет такого ограничения.

пардон, LONG_MAX

Odin ()
Ответ на: комментарий от Odin

>> Используй другой форматный символ.

например?

Python/C API Reference Manual | Parsing arguments and building values¶

всё происходит вот так:

PyLong_FromUnsignedLong(midUInt);

Почему не PyLong_FromUnsignedLongLong?

У Питона нет такого ограничения.

пардон, LONG_MAX

Такого тоже нет. В Питоне целые числа молча преобразуются к нужной разрядности (libmng или как-то так).

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Почему не PyLong_FromUnsignedLongLong

тоже пробовал. не получается.

Такого тоже нет.

хорошо. тогда попробуйте сделать так:

#include <Python.h>
.....
std::cout << LONG_MAX;
.....

у меня такой код работает.

В Питоне целые числа молча преобразуются к нужной разрядности (libmng или как-то так)

тогда хотелось бы увидеть пример передачи из с++ в питон 10-ти разрядного числа.

anonymous ()
Ответ на: комментарий от anonymous

> попробуйте сделать так:

#include <Python.h>

std::cout << LONG_MAX;

у меня такой код работает.

И что?

В Питоне целые числа молча преобразуются к нужной разрядности (libmng или как-то так)

тогда хотелось бы увидеть пример передачи из с++ в питон 10-ти разрядного числа.

Одно не имеет отношения к другому. Насчет передачи в/из Питона беззнаковыз 32-бит чисел на 32-бит платформе, я дал тебе ссылку. Используй PyArg_ParseTuple с символом преобразования %k.

И нет, я не буду писать программу за тебя.

tailgunner ★★★★★ ()

удалось решить без использования кортежей:

PyObject* res = PyLong_FromUnsignedLongLong( (unsigned long long) midUInt);
.....
void execMethod(PyObject* midUInt)
{
    unsigned long j = PyLong_AsUnsignedLongLong(midUInt);
    ....
}

вся фишка в том, что раньше пытался принимать в функцию не объект, а конкретный тип. сейчас-же всё замечательно работает, хотя в питоне получается полный бред, но при обратной конвертации — всё нормально.

спасибо!

Odin ()
Ответ на: комментарий от Odin

> удалось решить без использования кортежей:

«кортеж» там только в названии функции - на самом деле, она просто разбирает список аргументов.

tailgunner ★★★★★ ()

>указатель на объект представленный в виде инта

Кастую Нъярлатхотепа в тред. И роту шогготов.

legolegs ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.