user-0 提问: 程序错误~~求指教~~

回复:
user: user-1
content: 引用 8 楼 pokerLee 的回复:问一下~~你调试的时候观察的变量是哪个？在哪设的断点？ 你要观察哪里，观察什么变量，就在哪里设断点咯。但你该不会是光标指向那一行的时候就记录值吧！要到下一行才算执行过。VS下看自动窗口，如果有修改过会变红色的。  查看完整的步骤时，最好写一下简单的测试用例，然后利用条件断点来看，可以省下不少时间。比如下面的例子，我设前两个人是第三人的父母，那么之前两个人就完全没必要判断了。   也可以直接定位到(*pmember1).p_to_pa=pmember2; 这个要观察的一行，查看执行前后的值变化

user: user-0
content: 引用 9 楼 Adol1111 的回复:[quote=引用 8 楼 pokerLee 的回复:] 问一下~~你调试的时候观察的变量是哪个？在哪设的断点？ 你要观察哪里，观察什么变量，就在哪里设断点咯。但你该不会是光标指向那一行的时候就记录值吧！要到下一行才算执行过。VS下看自动窗口，如果有修改过会变红色的。  查看完整的步骤时，最好写一下简单的测试用例，然后利用条件断点来看，可以省下不少时间。比如下面的例子，我设前两个人是第三人的父母，那么之前两个人就完全没必要判断了。   也可以直接定位到(*pmember1).p_to_pa=pmember2; 这个要观察的一行，查看执行前后的值变化  [/quote]谢谢~~除了谢谢没别的感谢  引用 9 楼 Adol1111 的回复:[quote=引用 8 楼 pokerLee 的回复:] 问一下~~你调试的时候观察的变量是哪个？在哪设的断点？ 你要观察哪里，观察什么变量，就在哪里设断点咯。但你该不会是光标指向那一行的时候就记录值吧！要到下一行才算执行过。VS下看自动窗口，如果有修改过会变红色的。  查看完整的步骤时，最好写一下简单的测试用例，然后利用条件断点来看，可以省下不少时间。比如下面的例子，我设前两个人是第三人的父母，那么之前两个人就完全没必要判断了。   也可以直接定位到(*pmember1).p_to_pa=pmember2; 这个要观察的一行，查看执行前后的值变化  [/quote]方法了~~

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-0
content: 引用 4 楼 Adol1111 的回复:[quote=引用 3 楼 pokerLee 的回复:] [quote=引用 1 楼 Adol1111 的回复:] while(current!=NULL)//改成这样，不是比较下一个不是NULL，不然最后一个无法比较 { 	int parents=0; 	last=first;//第一个开始查，而不是当前的下一个 	while(last!=NULL) 	{ 		if(related(current,last)) 			if(++parents==2) 				break; 		last=(*last).next; 	} 	current=(*current).next; }  bool related(struct Family *pmember1,struct Family *pmember2) {     //return set_ancestry(pmember1,pmember2)||set_ancestry(pmember1,pmember2);     //重复操作没有意义啊，改成下面这样，或者去掉该函数直接调用set_ancestry     return set_ancestry(pmember1,pmember2); }感觉还有些其他问题，代码模块上最好能拆解一下，一般一个某块在5-10行左右，最好不超过20行。main写的长了，完全可以再拆成3个函数。总之尽量的简单点，自己号管理，看代码也不累。每个函数间功能也尽可能单一，最好能光看命名不看代码就知道该某块的功能会更好额~~我感觉这个修改指示改变了指针~~并没有把关系函数修改过来啊~~我单步调试的时候运行到relate（）时（*current）.p_to_pa的内存没有改变~~求指点啊~~[/quote] 改了啊，你看看你的测试用例写的怎么样。你按贴出来的那个截图输入的，前两个结点是找不到父母的，第三个才有效果。我这边没问题，你看看是不是测试用例打错了。还是执行了没反应？[/quote]问一下~~你调试的时候观察的变量是哪个？在哪设的断点？

user: user-0
content: 引用 4 楼 Adol1111 的回复:[quote=引用 3 楼 pokerLee 的回复:] [quote=引用 1 楼 Adol1111 的回复:] while(current!=NULL)//改成这样，不是比较下一个不是NULL，不然最后一个无法比较 { 	int parents=0; 	last=first;//第一个开始查，而不是当前的下一个 	while(last!=NULL) 	{ 		if(related(current,last)) 			if(++parents==2) 				break; 		last=(*last).next; 	} 	current=(*current).next; }  bool related(struct Family *pmember1,struct Family *pmember2) {     //return set_ancestry(pmember1,pmember2)||set_ancestry(pmember1,pmember2);     //重复操作没有意义啊，改成下面这样，或者去掉该函数直接调用set_ancestry     return set_ancestry(pmember1,pmember2); }感觉还有些其他问题，代码模块上最好能拆解一下，一般一个某块在5-10行左右，最好不超过20行。main写的长了，完全可以再拆成3个函数。总之尽量的简单点，自己号管理，看代码也不累。每个函数间功能也尽可能单一，最好能光看命名不看代码就知道该某块的功能会更好额~~我感觉这个修改指示改变了指针~~并没有把关系函数修改过来啊~~我单步调试的时候运行到relate（）时（*current）.p_to_pa的内存没有改变~~求指点啊~~[/quote] 改了啊，你看看你的测试用例写的怎么样。你按贴出来的那个截图输入的，前两个结点是找不到父母的，第三个才有效果。我这边没问题，你看看是不是测试用例打错了。还是执行了没反应？[/quote]我改错了~~谢谢大神~~这个程序折磨我半个月了~~你这个改法是对的~~我得好好看看自己思路错在哪了~~再次谢谢~~

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。首先谢谢您的教诲~~我刚开始学习调试~~调试的结果是在relate()函数中(*current).p_to_pa和(*current).p_to_ma就没有变量值~~我也在找错误~~只是还没有经验~~上面大侠的指点并没有给我太多的指点~~我的想法是看看自己的想法和别人的正确答案差在哪~~所以希望大侠指点一下~~再次谢谢~~

user: user-3
content: 引用 1 楼 Adol1111 的回复:while(current!=NULL)//改成这样，不是比较下一个不是NULL，不然最后一个无法比较 { 	int parents=0; 	last=first;//第一个开始查，而不是当前的下一个 	while(last!=NULL) 	{ 		if(related(current,last)) 			if(++parents==2) 				break; 		last=(*last).next; 	} 	current=(*current).next; }  bool related(struct Family *pmember1,struct Family *pmember2) {     //return set_ancestry(pmember1,pmember2)||set_ancestry(pmember1,pmember2);     //重复操作没有意义啊，改成下面这样，或者去掉该函数直接调用set_ancestry     return set_ancestry(pmember1,pmember2); }感觉还有些其他问题，代码模块上最好能拆解一下，一般一个某块在5-10行左右，最好不超过20行。main写的长了，完全可以再拆成3个函数。总之尽量的简单点，自己号管理，看代码也不累。每个函数间功能也尽可能单一，最好能光看命名不看代码就知道该某块的功能会更好 + +

user: user-1
content: while(current!=NULL)//改成这样，不是比较下一个不是NULL，不然最后一个无法比较 { 	int parents=0; 	last=first;//第一个开始查，而不是当前的下一个 	while(last!=NULL) 	{ 		if(related(current,last)) 			if(++parents==2) 				break; 		last=(*last).next; 	} 	current=(*current).next; }  bool related(struct Family *pmember1,struct Family *pmember2) {     //return set_ancestry(pmember1,pmember2)||set_ancestry(pmember1,pmember2);     //重复操作没有意义啊，改成下面这样，或者去掉该函数直接调用set_ancestry     return set_ancestry(pmember1,pmember2); }感觉还有些其他问题，代码模块上最好能拆解一下，一般一个某块在5-10行左右，最好不超过20行。main写的长了，完全可以再拆成3个函数。总之尽量的简单点，自己号管理，看代码也不累。每个函数间功能也尽可能单一，最好能光看命名不看代码就知道该某块的功能会更好

user: user-1
content: 引用 3 楼 pokerLee 的回复:[quote=引用 1 楼 Adol1111 的回复:] while(current!=NULL)//改成这样，不是比较下一个不是NULL，不然最后一个无法比较 { 	int parents=0; 	last=first;//第一个开始查，而不是当前的下一个 	while(last!=NULL) 	{ 		if(related(current,last)) 			if(++parents==2) 				break; 		last=(*last).next; 	} 	current=(*current).next; }  bool related(struct Family *pmember1,struct Family *pmember2) {     //return set_ancestry(pmember1,pmember2)||set_ancestry(pmember1,pmember2);     //重复操作没有意义啊，改成下面这样，或者去掉该函数直接调用set_ancestry     return set_ancestry(pmember1,pmember2); }感觉还有些其他问题，代码模块上最好能拆解一下，一般一个某块在5-10行左右，最好不超过20行。main写的长了，完全可以再拆成3个函数。总之尽量的简单点，自己号管理，看代码也不累。每个函数间功能也尽可能单一，最好能光看命名不看代码就知道该某块的功能会更好额~~我感觉这个修改指示改变了指针~~并没有把关系函数修改过来啊~~我单步调试的时候运行到relate（）时（*current）.p_to_pa的内存没有改变~~求指点啊~~[/quote] 改了啊，你看看你的测试用例写的怎么样。你按贴出来的那个截图输入的，前两个结点是找不到父母的，第三个才有效果。我这边没问题，你看看是不是测试用例打错了。还是执行了没反应？

user: user-0
content: 引用 1 楼 Adol1111 的回复:while(current!=NULL)//改成这样，不是比较下一个不是NULL，不然最后一个无法比较 { 	int parents=0; 	last=first;//第一个开始查，而不是当前的下一个 	while(last!=NULL) 	{ 		if(related(current,last)) 			if(++parents==2) 				break; 		last=(*last).next; 	} 	current=(*current).next; }  bool related(struct Family *pmember1,struct Family *pmember2) {     //return set_ancestry(pmember1,pmember2)||set_ancestry(pmember1,pmember2);     //重复操作没有意义啊，改成下面这样，或者去掉该函数直接调用set_ancestry     return set_ancestry(pmember1,pmember2); }感觉还有些其他问题，代码模块上最好能拆解一下，一般一个某块在5-10行左右，最好不超过20行。main写的长了，完全可以再拆成3个函数。总之尽量的简单点，自己号管理，看代码也不累。每个函数间功能也尽可能单一，最好能光看命名不看代码就知道该某块的功能会更好额~~我感觉这个修改指示改变了指针~~并没有把关系函数修改过来啊~~我单步调试的时候运行到relate（）时（*current）.p_to_pa的内存没有改变~~求指点啊~~