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 字节填充=======|

|-------------------- 浮点频率 - 4 个字节 ------------------------- |


这些大小会因机器而异,并且它在内存中的外观由编译器决定。

于 2010-05-21T20:55:46.960 回答
1

为了补充卡尔的答案,C++ 中的同样事情也是可能的:

class Foo {
public:
    Foo() {}

    Foo *anotherFoo;
};   

(注意上面的类很傻,但关键是你可以在类类型的类中拥有一个指针)

于 2010-05-21T21:01:39.340 回答
0

这被称为自引用结构,它就像它听起来的那样:一个包含对自身的引用的结构。这种情况常见于描述链表节点的结构中。每个节点都需要对链中下一个节点的引用。

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

(struct huffnode_s *) 声明指向另一个结构的指针,该结构包含与声明它的结构相同的变量。请参阅此问题

于 2010-05-21T21:00:07.737 回答
0

这是一个指向 huffnode 内部的 huffnode 的指针。这意味着您可以说:

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

这将编译,只要所有这些 huffnode 后代都被实际分配并正确指向,它就会工作。

指针很像 JavaScript 中的对象引用。它们实际上并不包含数据,它们只是引用它。请放心,您看到的不是无限类型。

于 2010-05-21T21:00:09.093 回答
0

正如其他人所指出的,对自身的引用只是指向该结构的其他实例的指针。

结构中的指针将允许将实例连接在一起作为链表。

于 2010-05-21T20:57:47.977 回答