SWIG, Python-C++ и GMP — передача аргумента типа int функции в созданной SWIG общей библиотеке, которая принимает аргумеC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 SWIG, Python-C++ и GMP — передача аргумента типа int функции в созданной SWIG общей библиотеке, которая принимает аргуме

Сообщение Anonymous »

Я пытаюсь реализовать оболочку для запуска теста факторизации Фермата на открытом ключе. Я успешно создал общую библиотеку с помощью SWIG:
fermat.h:
#ifndef FERMAT_H
#define FERMAT_H

#include
#include
#include

class Fermat
{
private:
mpz_class key;
mpz_class ceil_sqrt(const mpz_class&);
public:
Fermat(mpz_class);
std::string test();
};

#endif

fermat.cpp:
#include "fermat.h"
#include
#include
#include

Fermat::Fermat(mpz_class n)
{
key = n;
}

std::string Fermat::test()
{
// Test logic. Not important
}

mpz_class Fermat::ceil_sqrt(const mpz_class& n)
{
// A helper function
}

Я скомпилировал это с помощью приведенного ниже файла Makefile и файла .i, необходимого для SWIG.
Makefile:
all:
swig -c++ -python -v -I/usr/include/ fermat.i
python setup.py build_ext --inplace
g++ -O3 -fPIC -c -lgmp -lgmpxx fermat.cpp
g++ -O3 -fPIC -c -lgmp -lgmpxx -I/usr/include/python3.10 fermat_wrap.cxx
g++ -shared fermat.o fermat_wrap.o -lgmp -lgmpxx -o _fermat.so

fermat.i:
%module fermat
%{
#define SWIG_FERMAT_WITH_INIT
#include "fermat.h"
%}
%include "std_string.i"
%include "fermat.h"

Теперь я могу включить этот модуль SWIG в свой код main.py, который вызывает этот тестовый метод. Я передаю значение e открытого ключа в виде десятичного числа в конструктор.
import fermat as f

key_decimal = 98372489374731875343284493738234 # arbitrarily long decimal number
test_fermat = f.Fermat(key_decimal)
print(test_fermat.test())

Вкратце: я пытаюсь передать целое число в Python конструктору, который принимает аргумент типа mpz_class. Насколько мне известно, не существует встроенного способа преобразования int в mpz_class, поэтому мой модуль SWIG становится бесполезным, пока я не найду способ заставить конструктор принимать это большое целое число в Python.
Выполнение приведенного выше кода Python приведет к ошибке TypeError: в методе «new_Fermat» аргумент 1 типа «mpz_class»
Я читал о картах типов в SWIG, которые могут пригодиться, но я не уверен, что они решат мою проблему. Я думал, что сначала попрошу здесь заверения.
EDIT: В качестве временного исправления я переписал конструктор, чтобы вместо этого принимать std::string-s и передавать ключ в виде строки.
Fermat::Fermat(std::string n)
{
mpz_set_str(key.get_mpz_t(), n.c_str(), 10);
}

test_fermat = f.Fermat(str(key_decimal))
factors_string = test_fermat.test()


Подробнее здесь: https://stackoverflow.com/questions/786 ... in-the-swi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»