python — обёртывание простого примера c ++ с ctypes; ошибка сегментации

Я расширил пример, приведенный в этом ответ добавив закрытую переменную-член и напечатав ее в bar() функция:

#include <iostream>
class Foo{
private:
double m;
public:
Foo() { m = 2.344; };
void bar(){
std::cout << "Hello, number is " << m << std::endl;
}
};

extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo){ foo->bar(); }
}

ctypes Обертка была без изменений и является:

from ctypes import *
lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()

def bar(self):
lib.Foo_bar(self.obj)f = Foo()
f.bar()

Когда я запускаю код Python (после того, как уже скомпилировал код C ++ ранее), я получаю ошибку сегментации, которую я сузил до печати m в bar(),

Сег ошибки не происходит

  1. в оригинальном коде
  2. если я удалю печать m но держите его как переменную
  3. если я заменю m с любым фиксированным номером в bar(),

Я действительно озадачен, почему это должно происходить. Поскольку это эксперимент по изучению ctypes, любая помощь будет принята с благодарностью.

1

Решение

Если вы используете 64-битный Python, вам нужно определить restype а также argtypes, В противном случае ctypes по умолчанию переводит значения в 32-битный C int,

from ctypes import *

lib = CDLL('./libfoo.so')

lib.Foo_new.argtypes = []
lib.Foo_new.restype = c_void_p

lib.Foo_bar.argtypes = [c_void_p]
lib.Foo_bar.restype = None

Вот ссылки на источники для 2.7.5, Модули / _ctypes / callproc.c:

Для 64-битной Windows C long 32-битный, но 64-битный на большинстве других 64-битных платформ. Заставляя int результат по крайней мере последовательный.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector