cythonで構造体をNULLに初期化する方法は?

面白くない猫

ラップしたいライブラリのヘッダーファイルに次のマクロがあります。

#define RB_ROOT (struct rb_root) { NULL, }

RB_ROOTマクロは、CコードでNULLを使用してルートノードを初期化するために使用されているようです。これはどのようにrb_root見えるです:

struct rb_root {
    struct rb_node *rb_node;
};

Cythonでrb_rootを初期化したい。これは、それを作成してNULLに設定する必要があることを意味します。

私が試してみました

self.root = ckerneltree.rb_root(node=NULL)

しかし、これは私にエラーを与えます

    cdef ckerneltree.rb_root root
    cdef ckerneltree.rb_node node

    def __cinit__(self):

        self.root = ckerneltree.rb_root(node=NULL)
                                            ^
------------------------------------------------------------

kerneltree.pyx:10:45: Cannot assign type 'void *' to 'rb_node'

そして私がそのようにkwargを取り除くならば

self.root = ckerneltree.rb_root()

厄介なCコンパイラの警告が表示されます。

kerneltree.c: In function '__pyx_tp_new_10kerneltree_IntervalTree':
kerneltree.c:1100:22: warning: '__pyx_t_1.rb_node' may be used uninitialized in this function [-Wmaybe-uninitialized]
   __pyx_v_self->root = __pyx_t_1;
                      ^
kerneltree.c:1090:18: note: '__pyx_t_1.rb_node' was declared here
   struct rb_root __pyx_t_1;
                  ^

それを行う正しい方法は何ですか?


追伸 これは私の.pxdがどのように見えるかです:

cdef extern from "src/rbtree.h":

    cdef struct rb_node:
        pass

    cdef struct rb_root:
        rb_node node

私の.pyx:

cimport ckerneltree

cdef class IntervalTree:

    cdef ckerneltree.rb_root root

    def __cinit__(self):

        self.root = ckerneltree.rb_root()
ead

意外かもしれませんが、あなたの場合self.rb_root.nodeはすでにに設定されていNULLます。ただし、NULL明示的に設定する場合は、次のようにすることができます。

 cdef class IntervalTree:
    cdef ckerneltree.rb_root root

    def __cinit__(self):
        self.root.rb_root = NULL # setting pointer to NULL explicitly

これは、すべてが参照であるが、オブジェクトrootへのrb_rootポインターではなく、オブジェクト自体であるPythonコーダーにとっては直感に反する可能性があります。これはIntervalTree、Cコードでのcdefクラスの定義がどのように見えるです。

struct __pyx_obj_4test_IntervalTree {
  PyObject_HEAD
  struct rb_root root;  
};

ご覧のとおり、はとして定義されてrb_rootおり、ではありませんrb_root *IntervalTree-objectのメモリレイアウトは非常に単純です。

      +-------------------+ +--------------------+
      |      PyObject     | |      rb_root       |
      +-------------------+ +--------------------+
      | Py-Obect members  | |      rb_node       |
      +-------------------+ +--------------------+
      |      ?? bytes     | |      8 bytes       |
      +-------------------+ +--------------------+

Pythonオブジェクトのデフォルトの初期化__cinit()__は、実行される前に開始され、オブジェクトのメモリ全体が0sに設定されるため、(-objectへrb_nodeポインタであるrb_nodeの8バイトの0はと同じになりNULLます。ただし、明示的に初期化しても害はありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

構造体をnullに初期化する方法は?

分類Dev

NULLで構造体ポインタ変数を初期化する方法は?

分類Dev

別の構造体で構造体の配列を初期化する方法は?

分類Dev

CでConst構造体を初期化する方法-QAC警告を回避するには

分類Dev

構造体をユニオンで初期化する方法は?

分類Dev

PLC-ST: 宣言で構造体を初期化する方法は?

分類Dev

Swift-構造体で配列を初期化する方法は?

分類Dev

入れ子になった構造体をgoで初期化する方法は?

分類Dev

golangで次の構造の構造体を初期化する方法

分類Dev

mallocで構造体を初期化する

分類Dev

C ++で構造体内の共用体の構造体メンバーを初期化する方法は?

分類Dev

内部構造体を外部構造体の初期化に反映する

分類Dev

構造体で構造体を初期化する

分類Dev

C ++で構造体をCの方法で初期化する

分類Dev

複数の構造体変数を一度に初期化する方法は?

分類Dev

golangでネストされた構造体を初期化する方法は?

分類Dev

ネストされた構造体を初期化する方法は?

分類Dev

この構造体を集約して初期化する方法は?

分類Dev

空の構造体を初期化する方法は?

分類Dev

collectionViewセルの構造体を初期化する方法は?

分類Dev

Cでの宣言後に構造体の配列を初期化する方法

分類Dev

shared_ptrを構造体に初期化する方法

分類Dev

Go構造体でメンバーを初期化する方法

分類Dev

c ++で構造体のベクトルを初期化する方法

分類Dev

Juliaで構造体の配列を初期化する方法

分類Dev

構造体の初期化で#defineを使用する方法

分類Dev

systemverilogで構造体の初期化を処理する方法

分類Dev

c ++で構造体を正しく初期化する方法

分類Dev

構造体内にあり、構造体が他の構造体の配列内にあるNULLへのポインターの配列を初期化する方法

Related 関連記事

  1. 1

    構造体をnullに初期化する方法は?

  2. 2

    NULLで構造体ポインタ変数を初期化する方法は?

  3. 3

    別の構造体で構造体の配列を初期化する方法は?

  4. 4

    CでConst構造体を初期化する方法-QAC警告を回避するには

  5. 5

    構造体をユニオンで初期化する方法は?

  6. 6

    PLC-ST: 宣言で構造体を初期化する方法は?

  7. 7

    Swift-構造体で配列を初期化する方法は?

  8. 8

    入れ子になった構造体をgoで初期化する方法は?

  9. 9

    golangで次の構造の構造体を初期化する方法

  10. 10

    mallocで構造体を初期化する

  11. 11

    C ++で構造体内の共用体の構造体メンバーを初期化する方法は?

  12. 12

    内部構造体を外部構造体の初期化に反映する

  13. 13

    構造体で構造体を初期化する

  14. 14

    C ++で構造体をCの方法で初期化する

  15. 15

    複数の構造体変数を一度に初期化する方法は?

  16. 16

    golangでネストされた構造体を初期化する方法は?

  17. 17

    ネストされた構造体を初期化する方法は?

  18. 18

    この構造体を集約して初期化する方法は?

  19. 19

    空の構造体を初期化する方法は?

  20. 20

    collectionViewセルの構造体を初期化する方法は?

  21. 21

    Cでの宣言後に構造体の配列を初期化する方法

  22. 22

    shared_ptrを構造体に初期化する方法

  23. 23

    Go構造体でメンバーを初期化する方法

  24. 24

    c ++で構造体のベクトルを初期化する方法

  25. 25

    Juliaで構造体の配列を初期化する方法

  26. 26

    構造体の初期化で#defineを使用する方法

  27. 27

    systemverilogで構造体の初期化を処理する方法

  28. 28

    c ++で構造体を正しく初期化する方法

  29. 29

    構造体内にあり、構造体が他の構造体の配列内にあるNULLへのポインターの配列を初期化する方法

ホットタグ

アーカイブ