Я пытался портировать этот код на 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?
Чтобы добавить к ответу Карла, то же самое возможно и в C ++:
class Foo {
public:
Foo() {}
Foo *anotherFoo;
};
(Обратите внимание, что приведенный выше класс глуп, но дело в том, что вы можете иметь указатель внутри класса, который является класса)
Это указатель на huffnode внутри huffnode. Это означает, что вы можете сказать:
huffnode_t *node = ...;
huffnode_t *greatgreatgreatgrandchild = node->zero->zero->zero->zero->zero;
Это будет скомпилировано и будет работать до тех пор, пока все эти потомки huffnode действительно выделены и на которые указывают правильно.
Указатели очень похожи на ссылки на объекты в JavaScript. На самом деле они не содержат данных, они просто ссылаются на них. Будьте уверены, что вы не смотрите на бесконечный тип.
huffnode_s
не находится внутри себя, там находятся только указатели на huffnode_s
. Поскольку указатель имеет известный размер, это не проблема.
Это известно как самоссылающаяся структура, и это именно то, на что она похожа: структура, которая содержит ссылку на саму себя. Чаще всего это встречается в структуре, которая описывает узел для связного списка. Каждый узел нуждается в ссылке на следующий узел в цепочке.
struct linked_list_node {
int data;
struct linked_list_node *next; // <- self reference
};
Как отмечали другие, ссылки на себя - это просто указатели на другие экземпляры этой структуры.
Указатели внутри структуры позволяют соединять экземпляры вместе в виде связного списка.
Это.
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)
Это все, что требуется.
(struct huffnode_s *) объявляет указатель на другую структуру, которая включает те же переменные, что и структура, в которой он объявлен. См. этот вопрос .
он не имеет структуры сам по себе. он имеет указатель на эту структуру.
в памяти struct huffnode_s будет выглядеть так (32-битная машина):
|------------------ huffnode_s* zero - 4 байта --------------|
|------------------ huffnode_s* one - 4 байта----------------|
|unsigned char val - 1 байт + 3 байта padding=======|
|------------------- float freq - 4 байта -------------------------|
эти размеры зависят от машины, а как это выглядит в памяти, решает компилятор.