520深夜混合多线程多进程debug总结

居然在图书馆肝到现在,还是520,太有意义了必须纪念下

来先看一下作业(其实很简单,毕竟源码都给我们了,虽然是一堆bug的源码,这里手动打出gg)

第三次作业:

分析矩阵相乘源码,画出程序流程图,编译并运行程序。

  • 分析源码中的问题,逐一说明

  • 提交程序流程图和程序解决方案

  • 提交实验源程序(50%注释)

  • 辅助程序(生成矩阵程序,打印矩阵程序)

  • 用生成矩阵程序生成A与B矩阵,形成两个矩阵文件,并修改源程序,从文件中读取A与B矩阵,将计算结果C矩阵输出到文件中,通过打印矩阵程序打印C矩阵

  • 提交实验结果

好的,老规矩,一堆错误的源代码,其实如果没有第五条文件操作要求,一切顺风顺水。bug不是很多:

一个是二维数组的参数传递问题,指针数组和数组指针,想想就头疼,这里参考了很多博主的博文,现在还是有点晕,好在并不难,照着经验很快就解决了这个bug。

第二个就是发现在运行的时候,矩阵求出来的结果总是会有重复的,特别是当进程数不同的时候,于是仔细查代码,发现是下标的问题,如果进程数小于矩阵维度的时候,有一行会被反复求,而不是再分配。总之这两个bug比较简单,可以说良心了。

于是,我看时间还多,就想想思考题:什么情况下会有死锁呢?可惜自己操作系统知识浅薄,真的没想到(还是太菜,这里捂脸)。然后准备把,文件操作秒了,代码都调通了,文件操作就是小事了吧。然而事实并不是这样的,加入文件操作,调代码要死啊!!!

首先,两个矩阵读入的问题,秉承坚决不重复劳动的思想,用一个for循环,分两次读入两个矩阵文件,此处借鉴了print函数的操作,以及二维数组动态分配内存。小bug不说了,结果出现了段错误!我的个神啊!最怕数组溢出这种问题了。而且我还不会(也不想花时间)多进程的调试,只能print调试法(好吧print大法好)。然后,找了半天,最后很无语,原理是疯狂用int i作循环变量,然后i的值改了好几次!我的神啊!!这种sb错误,我居然花时间这个上面....无语了,以后一定要记住!!

然后,读入了矩阵,然后遇到了第二个抓狂的报错!:什么什么terminate, exit code 11,上网查错误代码,好的没有。好的手动gg! 继续Pirnt大法(好吧,我真的会print)然后发现这个八成是矩阵存不进去啊!大概是malloc错误,此时快吐血了,对内存错误毫无还手之力,好的,仔细查,再看看genmat源码。咦?怎么这里存进去的是double,我的主程序默认是float!!啊一查,double 2字节好像(管他啥),反正float比他小!!我的个神!!改老师源码!!!一通乱改,老师辅助程序已经面目全非了。

然后,怎么写文件啊!!不能向print那样一行行输出了,因为想借鉴matgen的做法,一起操作然后写入文件,而且由于老师需要用print函数打印出来,所以写入格式必须和matgen一样。ok,继续改代码,借鉴代码。发现不对啊!怎么文件的矩阵和print矩阵不一样啊!!应该一样啊!!抓狂!此时已经过1点了!!继续print,好的发现,文件输入好几次!!???又是多进程的问题!!额的神,联想起第一次作业!!此时准备放弃,哭了,我不想猝死!!去上了趟厕所,中途出去走走或者上厕所真的对我的debug有神助攻!多次经验!灵机一动!应该在主进程完成收尾工作啊!!对啊!然后机智的解决了,测了两个样例,emmmm好像没问题,不想再发现bug了,饶了我吧,我枯了!!

好的,踩坑认识,520快乐。我爱并行程序设计!好了,我要去睡觉了。。。。

猜你喜欢

转载自blog.csdn.net/wooooooc/article/details/90365046