1

この回答で提供されている例を、プライベートメンバー変数を追加して拡張し、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()

mPython コードを実行すると (以前に C++ コードをコンパイルした後で)、セグメンテーション違反が発生し、 inの印刷に絞り込まれましたbar()

セグフォルトが発生しない

  1. 元のコードで
  2. 印刷を削除mして変数として保持する場合
  3. mの任意の固定数に置き換える場合bar()

なぜこれが起こるべきなのか、私は本当に困惑しています。これは ctypes を学習するための実験であるため、ご協力いただければ幸いです。

4

1 に答える 1

3

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、Modules/_ctypes/callproc.c のソース リンクは次のとおりです。

64 ビット Windows の場合、Clongは 32 ビットですが、他のほとんどの 64 ビット プラットフォームでは 64 ビットです。強制intすることにより、結果は少なくとも一貫しています。

于 2013-06-21T18:53:03.417 に答える