8

このコードを python に移植しようとしてきましたが、C++ でよくわからないことがあります (C++ は少し知っていますが、これは私を超えています)。

typedef struct huffnode_s
{
    struct huffnode_s *zero;
    struct huffnode_s *one;
    unsigned char val;
    float freq;
} huffnode_t;

私が得られないのは、 huffnode_s がそれ自体の中にどのように存在できるかということです.これは前に見たことがなく、よく理解していません. これはどういう意味ですか?もし誰かができるなら、pythonに相当するものは何ですか?

4

8 に答える 8

19

huffnode_sはそれ自体ではなく、へのポインタhuffnode_sのみがそこにあります。ポインターのサイズは既知であるため、問題ありません。

于 2010-05-21T20:56:04.463 に答える
11

これ。

class Huffnode(object):
    def __init__(self, zero, one, val, freq):
        """zero and one are Huffnode's, val is a 'char' and freq is a float."""
        self.zero = zero
        self.one = one
        self.val = val
        self.freq = freq

その後、さまざまな C 関数をリファクタリングして、このクラスのメソッドにすることができます。

または多分これ。

from collections import namedtuple
Huffnode = namedtuple( 'Huffnode', [ 'zero', 'one', 'val', 'freq' ] )

C関数を関数のままにしたい場合。

それでおしまい。

h0 = Huffnode(None, None, 'x', 0.0)
h1 = Huffnode(None, None, 'y', 1.0)
h2 = Huffnode(h0, h1, 'z', 2.0)

必要なのはそれだけです。

于 2010-05-21T20:58:22.267 に答える
4

それ自体に構造はありません。その構造体へのポインタがあります。

メモリ内の構造体 huffnode_sは次のようになります (32 ビット マシン):


|------------------ huffnode_s* ゼロ - 4 バイト --------------|

|------------------ huffnode_s* 1 - 4 バイト----------------|

|unsigned char val - 1 バイト + 3 バイトのパディング=======|

|------------------- float freq - 4 バイト ------------------------- | |


これらのサイズはマシンごとに異なり、メモリ内での外観はコンパイラによって決定されます。

于 2010-05-21T20:55:46.960 に答える
1

カールの答えに追加するには、C++ でも同じことが可能です。

class Foo {
public:
    Foo() {}

    Foo *anotherFoo;
};   

(上記のクラスはばかげていることに注意してください。ただし、要点は、クラス型のクラス内にポインターを持つことができるということです)

于 2010-05-21T21:01:39.340 に答える
0

(struct huffnode_s *) は、宣言されている構造と同じ変数を含む別の構造へのポインターを宣言します。この質問を参照してください。

于 2010-05-21T21:00:07.737 に答える
0

これは、ハフノード内のハフノードへのポインタです。これが意味することは、次のように言うことができるということです。

huffnode_t *node = ...;
huffnode_t *greatgreatgreatgrandchild = node->zero->zero->zero->zero->zero;

これはコンパイルされ、すべてのハフノードの子孫が実際に割り当てられ、正しく指されている限り機能します。

ポインターは、JavaScript のオブジェクト参照によく似ています。それらは実際にはデータを含んでおらず、参照しているだけです。無限型を見ているわけではないので安心してください。

于 2010-05-21T21:00:09.093 に答える
0

他の人が指摘したように、それ自体への参照は、その構造の他のインスタンスへの単なるポインターです。

構造内のポインターを使用すると、インスタンスをリンクされたリストとして接続できます。

于 2010-05-21T20:57:47.977 に答える
0

これは自己参照構造として知られており、まさにその名の通り、それ自体への参照を含む構造です。これは、リンクされたリストのノードを記述する構造でよく発生します。各ノードには、チェーン内の次のノードへの参照が必要です。

struct linked_list_node { 
    int data; 
    struct linked_list_node *next; // <- self reference 
}; 
于 2010-05-21T21:03:50.727 に答える