C项目实现过程中的记录

C项目实现过程中的记录

从开始可行性分析到转为C代码实现,至今已有半年的时间。开始只是简单看了C的基础语法,根据之前的代码经验便开始动手写了。

第一全局变量的定义。全局变量每次用完之后没有手动清除,后续再次调用该部分算法时会有访问错误。对于全局变量应该谨慎使用。一方面不便于代码的维护,同时一旦出现重名会使得调试时很难捕捉到值的异常。加上变量在全局都可以被访问修改,操作难度极高。可通过传值的方式实现信息的共享。

第二拿不准到底是否要用动态内存分配。动态内存虽然有“随用随开随放”的便捷之处。在不确定输入长度的情况下可以自由定义。但是自由必定会牺牲掉一部分性能。动态内存主要在堆上分配和操作。对新手最大的难度在于不知在何处释放。对计算密集型的任务过多的动态内存分配会导致内存空间吃不消,程序崩溃。另外释放之后的指针应该要重新置为NULL,避免出现指向不明的野指针。动态分配内存时从外向内,释放时从内向外。

第三对数组的操作。在C语言中一维数组和二维数组本质上并没有不同。都是在内存空间中存储相同类型的一个容器。唯一的差别是在访问上。初始实现时为了和Python等的二维数组有相同的下标访问方式,所以简单粗暴用指针的指针访问二维数组,便于将数组的访问写为a[0][1]的形式。加上嵌套了动态内存分配,使得代码内存占用率及其高。二维数据是在一维数据行的基础上增加列的信息。一维数组可以当作每行每列只有一个数值,二维数组列可以有多个数值。一维数组的访问a[i],二维数组可以写为a[i * j + j](i为行数j为列数)

第四原始算法中均以矩阵计算为主,转换为C代码之后受到矩阵操作思维的影响,容易将问题复杂化。有些判断在数组中并非必要步骤。

第五是对数据类型的定义。只是简单的整型或者double型,没有依照实际需要做相应的定义。

第六算法中的嵌套和循环调用。算法实现是通过一层一层的嵌套,最终得到想要的结果。在实现过程中对算法每一步的执行要有合理的思考。有些可以不必要放在循环中的步骤,可以提升代码的效率。一方面减少反复调用导致的资源消耗问题。另一方面会导致出乎意料的错误。

第七对指针的操作。通过指针操作数组或者其他数据类型时,防止访问越界和内存泄露导致程序崩溃。指针是C语言的精华所在,如何熟悉掌握指针的操作是写好C的基础。

第七代码debug。C语言的错误有时虽然出错在某一个函数中,但是问题未必是在这个地方。可能是其他地方操作错误导致运行到该函数内部报错。特别是大型算法,尽可能函数“高内聚,低耦合”。函数的功能相互独立,每个函数只实现一个特定的功能。便于阅读维护和debug。

第八性能分析。VS中的调试->探查器->性能探查器中对内存、CPU的分析结果可以作为优化的依据。特别是某些CPU内存占用率极高的函数,可以作为首先优化的依据。

第九栈内存分配。C语言的编译器对栈分配大小有特定的要求。为了方便将函数运行的结果带回,要提前分配内存,并将该局部变量传到函数中。查阅VS2010要求局部变量的栈大小不能超过1M。否则会有栈溢出的错误。

到今天算法已经可以完整调试成功。算是一个阶段性的节点。总结在该项目中遇到的问题,也可以避免在后续项目中规避一些低级错误。通过C语言实现项目,对我的代码质量有很大的提升。特别是对程序设计有了一点点认识。也督促我更好学习C语言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值