我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。
这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。
如何在不删除所有数据断言的情况下解决这些错误?
我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。
这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。
如何在不删除所有数据断言的情况下解决这些错误?
当前回答
家谱数据是循环的,不适合于非循环图,所以如果你有针对循环的断言,你应该删除它们。
在不创建自定义视图的情况下在视图中处理此问题的方法是将循环父对象视为“幽灵”父对象。换句话说,当一个人同时是同一个人的父亲和祖父时,祖父节点正常显示,但父亲节点被渲染为“幽灵”节点,该节点具有简单的标签(如“看见祖父”)并指向祖父。
为了进行计算,您可能需要改进处理循环图的逻辑,以便在存在循环的情况下不会多次访问节点。
其他回答
这是家谱的问题:它们不是树。它们是有向无环图或DAG。如果我正确理解人类生殖生物学的原理,就不会有任何周期。
据我所知,即使是基督徒也接受表兄弟之间的婚姻(以及孩子),这将把家谱变成家庭DAG。
这个故事的寓意是:选择正确的数据结构。
最重要的是避免产生问题,所以我认为你应该使用直接关系来避免循环。
正如@markmywords所说,#包括“fritzl.h”。
最后,我不得不说重新检查您的数据结构。也许那边出了问题(也许双向链接列表解决了您的问题)。
家谱数据是循环的,不适合于非循环图,所以如果你有针对循环的断言,你应该删除它们。
在不创建自定义视图的情况下在视图中处理此问题的方法是将循环父对象视为“幽灵”父对象。换句话说,当一个人同时是同一个人的父亲和祖父时,祖父节点正常显示,但父亲节点被渲染为“幽灵”节点,该节点具有简单的标签(如“看见祖父”)并指向祖父。
为了进行计算,您可能需要改进处理循环图的逻辑,以便在存在循环的情况下不会多次访问节点。
你的家谱应该使用定向关系。这样你就不会有循环了。
我讨厌评论这种糟糕的情况,但最简单的方法是在你的图中创建一个虚拟顶点,作为回到乱伦父亲的代理。