我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。

这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。

如何在不删除所有数据断言的情况下解决这些错误?


当前回答

不要删除所有断言,您仍然应该检查诸如某人是自己的父母或其他不可能的情况,并提出错误。如果不太可能的话,可能会发出警告,这样用户仍然可以检测到常见的输入错误,但如果一切都正确的话,它会起作用。

我会将数据存储在一个向量中,每个人都有一个永久整数,并将父母和孩子存储在个人对象中,其中所述int是向量的索引。这在几代人之间会很快(但在名字搜索等方面会很慢)。对象将按创建时的顺序排列。

其他回答

你应该把Atreides家族(现代的Dune,或古代的Oedipus Rex)作为一个测试案例。通过使用经过净化的数据作为测试用例,您不会发现错误。

最重要的是避免产生问题,所以我认为你应该使用直接关系来避免循环。

正如@markmywords所说,#包括“fritzl.h”。

最后,我不得不说重新检查您的数据结构。也许那边出了问题(也许双向链接列表解决了您的问题)。

这是家谱的问题:它们不是树。它们是有向无环图或DAG。如果我正确理解人类生殖生物学的原理,就不会有任何周期。

据我所知,即使是基督徒也接受表兄弟之间的婚姻(以及孩子),这将把家谱变成家庭DAG。

这个故事的寓意是:选择正确的数据结构。

不要删除所有断言,您仍然应该检查诸如某人是自己的父母或其他不可能的情况,并提出错误。如果不太可能的话,可能会发出警告,这样用户仍然可以检测到常见的输入错误,但如果一切都正确的话,它会起作用。

我会将数据存储在一个向量中,每个人都有一个永久整数,并将父母和孩子存储在个人对象中,其中所述int是向量的索引。这在几代人之间会很快(但在名字搜索等方面会很慢)。对象将按创建时的顺序排列。

一些答案显示了保持断言/不变量的方法,但这似乎是滥用断言/不变量。断言是为了确保应该是真的东西是真的,不变量是为了确保不应该改变的东西不会改变。

你在这里断言的是乱伦关系是不存在的。显然它们确实存在,因此您的断言是无效的。您可以解决这个断言,但真正的错误在于断言本身。应删除断言。