Я писал свой собственный lex/yacc с помощью cpp. Есть несколько кодов для создание двоичного дерева регулярных выражений. Такой код вызвал странную ошибку Nodes[parent].right = add(R, output, s); Он копирует дерево R как правое поддерево Nodes[parent]. ]. Все узлы в дереве хранились в массиве Nodes в куче. Таким образом, Nodes[parent].right и возвращаемое значение add(R, output, s) оба имеют тип size_t. Начальное значение Nodes[parent].right — (size_t)-1. Я проверил возвращаемое значение непосредственно перед добавлением. (R, output, s) вернулось, это было правильное значение 8. После его возврата я напечатал значение Nodes[parent].right, оно все равно было неправильным начальным значением (size_t )-1. Казалось, что при возврате произошел сбой. Вместо этого я использую size_t temp; temp =append(R, output, s); ошибка исчезла.
Оба стиля кода кажутся эквивалентными, поэтому первый вызвал ошибку, а второй был прав.
Ниже приводится определение шаблона двоичного дерева: я должен извиниться за то, что классы шаблонов buffer и list были определены мной, они не являются частью std.< /p>
Код: Выделить всё
template class Bitree
{
public:
struct node
{
size_t left;
size_t right;
T content;
};
Bitree();
~Bitree();
void clear(void);
void SetHead(size_t head);
size_t NewNodeOffset(void);
node* NewNode(void);
node* Node(size_t site)const;
node* LeftChild(const node* now)const;
node* RightChild(const node* now)const;
const node& operator[](size_t target) const;
node& operator[](size_t target);
void postorderTraversal(buffer& output, list& s) const;
void postorderTraversal(buffer& output) const;
void inorderTraversal(buffer& output, list& s) const;
void inorderTraversal(buffer& output) const;
bool IfLeaf(size_t site)const;
void Demo(FILE* fp)const;
void removal(size_t site);
void removal(size_t site, buffer& outpaput, list& s);
size_t append(const Bitree& source, buffer& output, list& s);
void append(const Bitree& left, size_t parent);
void append(const Bitree& left, const Bitree& right, size_t parent);
size_t append_t(const Bitree& source, buffer& output, list& s, bool key);//for testing of this bug
void append_t(const Bitree& left, const Bitree& right, size_t parent, bool key);
//for testing of this bug
size_t Head;// root
private:
size_t Size;// capacity of node* Nodes
size_t Count;// amount of nodes in this tree
size_t FirstEmpty;
node* Nodes;
};
Код: Выделить всё
void append(const Bitree& left, const Bitree& right, size_t parent);
{
size_t now, new_node, temp;
s.refresh();
output.refresh();
new_node = SizeMax;
source.postorderTraversal(output, s);
s.refresh();
s.renew(source.Size);
while (output.dequeue(now))
{
new_node = NewNodeOffset();
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78719391/when-writing-my-own-lex-yacc-my-code-that-was-cpmpiled-by-g-producted-a-weird[/url]