大物实验-直接测量量不确定度计算器 开发备忘录
资源链接:https://share.weiyun.com/CxCS4Jyj 密码:7ineil
链接里面附带了一个execl表格
源代码链接:https://github.com/WWIandMC/space/tree/master/calc
初学c语言,目前还比较菜,编写过程中遇到一些问题,通过不懈努力解决,记下来让自己以后少走弯路
开发备忘录
开发环境:vs2010
项目类型:win32控制台程序
输入:三个文本文件
unit.txt | 测量单位 |
data.txt | 测量数据 |
delta.txt | 误差极限值 |
异常判断机制:
- 文本文件打开失败
- 文本文件没有数据
- 内存空间申请失败(malloc函数返回NULL值)
- data.txt中的数据小数点位数不一致
- data.txt中的数据有非正数(0或负数)
- 选择是否检查正负值和选择置信系数时输入非系统提示字符无效
使用说明:
- 程序将会读入unit.txt里所有的字符串,使用前请仔细检查unit.txt的数据是否正确
- 此程序保留有效数字功能只能处理到小数点后5位
问题总结
错误1
解决方法
项目->“项目名”属性->配置属性->清单工具->嵌入清单 “是”改成“否”
错误2
全局变量重定义
最开始的写法是在头文件中定义全局变量
//head.h
int eps = 0;
编译的时候,只要include了head头文件的就会插入这条语句,于是出现了重定义的错误
正确的写法应该是在头文件里声明链接属性,在main.c里定义变量
//head.h
extern int eps = 0;
//main.c
int eps;
错误3
CRT detected that the application wrote to memory after end of heap buffer:
sprintf是<stdio.h>的库函数 sprintf的说明
strchr是<string.h>的库函数 strchr的说明
程序中识别小数点的方式就是使用sprintf将double类型的数据写进一个字符串当中
//cnt是小数整数部分的位数
c = (char*)malloc(sizeof(char)*cnt+8);/
//sprintf读入一个双精度类型的数据时,会读入小数点后面6位数字,加上小数点和'\0'就有8个char
if(c==NULL){
printf("u_Decimal内存申请失败!\n");
error = 1;
return;
}
sprintf(c,"%lf", *u);
最开始的代码对malloc的内存空间是没有算进'\0'的位置的
调试运行
malloc在内存中申请到了一块空间,图中cd就是申请到的内存空间,而后面fd和ab是no man`s land 顾名思义就是不允许写入的地方
继续执行
显然,最后的'\0'写到了第一个fd的位置,最后调用free函数释放这一块内存空间时,程序就会崩溃
看了下面这篇blog才意识到问题,看完之后还学会了使用内存窗口查看的调试技巧。
释放内存free()错误:CRT detected that the application wrote to memory after end of heap buffer:内存访问违规
之所以会犯这样的错误,是我在之前的调试中,只仅仅给c分配了一个char的空间也可以写入8个字符,产生了奇怪的错觉。
将bug解决之后,继续执行,到了strchr函数
c = strchr(c,'.');
...
free(c);
执行strchr
c的地址改变了
到了free函数 程序崩溃了
问题就在于,strchr函数返回值是第一次出现目标字符位置的地址
而free()里面的指针,必须指向malloc返回的那块内存空间
解决方法
用char *ret来存储strchr返回的地址
char *ret;
...
ret = strchr(c,".");
...
free(c);
把项目上传到自己的github仓库也花了一些时间
ps:如果git提示你需要
$ git --global origin user_mail “yourexample.com”(找不到图了,只记得大概的指令)
照着提示 把uesr_email 和user_name 都输入即可
Git的使用--如何将本地项目上传到Github(两种简单、方便的方法)
github删除库的办法
进入库,点击Settings
进入Setting之后,在网页底找到Danger Zone
点击Delete this repository,完成验证即可
原本上传到github的文本文件下载下来之后变为了二进制文件,后期又把文件打开方式改为"rb"