大物实验-直接测量量不确定度计算器 开发备忘录

资源链接: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"

posted @ 2020-03-05 18:40  LanceHansen  阅读(110)  评论(0编辑  收藏  举报