C++从入门到放弃

仅作为记录,接下来有别的事,免得回头这个程序又跑不起来了。

目标是有一些坐标文件作为输入,算的是该GEO坐标对应点的AP8AE8模型值。

师兄已经编译好了模型,C++写的。下面只是用师兄的模型的过程遇到的问题。

1、版本问题。C++对版本要求高到离谱。师兄当时用的编译器是MinGW440,那就得下这个旧版本的,不然就会疯狂报错。下载后,还是疯狂报错,太多了,当时没记录

比如 cc1plus.exe: error: unrecognized command line option "-fno-keep-inline-dllexport"基本上都是版本的问题,也就是MinGW和qt版本不对应,没办法,下了很多个版本的qt还是不行,只能用命令行。

命令行运行要记得加上需要用的库,并且要在.cpp文件里加上需要的头文件#include "geopack2008.h",注意这里是双引号不是<>

2、代码问题

师兄的代码是自动生成间隔相等的GEO坐标,固定的xstart,ystart,heightstart和xend,yend,heightend,再固定的xgap,ygap,heightgap,但是我需要的坐标没有规律,所以需要一个一个地算,那就得读入一次数据,运行一次模型程序。把gap设成0,但问题是模型程序是输入是一系列的坐标,输出直接生成一个tom3.txt,但如果是读入一次数据运行一次程序,会把之前生成的tom3覆盖,也就是最后tom3.txt中,只有最后一条数据的计算结果。那么在每次运行完模型程序后,需要把tom3中的数据读出来,存到另一个result文件中,防止被覆盖。

更大的问题是,调用一次模型程序,生成一个a.exe可执行文件,然后要执行该文件,才能生成数据文件tom3.txt

基本思路是,读入一条数据、调用一次模型程序、执行a.exe、读入tom3.txt、存到result.txt中。

2.1 自动执行exe的问题

假如直接写runexe.cpp文件,直接用命令行运行,那么还会生成一个对应于runexe.cpp的a.exe,再写入执行a.exe,就会不断执行,陷入循环。

这个时候就没有编译器的问题了,所以可以用VisualStudio实现。

在VisualStudio的代码里用system("g++ .....");就可以实现命令行运行模型程序。这时在VisualStudio文件夹下会生成a.exe,但是,直接在这个文件夹下执行a.exe,出现任务框闪退,tom3.txt文件没有生成,不知道为什么

复制到模型程序所在的文件夹下system("copy D:\\documents\\VisualStudio\\testCPP\\testRuncalflux\\testRuncalflux\\a.exe D:\\documents\\cpp\\tests\\testReadTom");

然后执行:ShellExecute(NULL, "open", "D:\\documents\\VisualStudio\\testCPP\\testRuncalflux\\testRuncalflux\\a.exe",NULL,"D:\\documents\\VisualStudio\\testCPP\\testRuncalflux\\testRuncalflux",SW_SHOWDEFAULT);

一开始,还是没反应,需要加上红字部分的路径。就可以执行了

2.2 合作问题

模型程序由于编译器版本的问题,不能直接在VS中引用,在VS中只能运行命令行的g++,生成a.exe这一步,也就是g++后面的cpp文件需要执行的任务是,给定输入,然后执行模型程序。所以,main函数需要配置输入的时间和坐标参数。

第一个参数是年份,然后分别是三个坐标。

3、VS使用问题

3.1 编码不兼容问题

编码问题直接在工程设置里修改

改为未设置就可以

3.2 字符类型问题

VS的过程是这样的,首先读入坐标文件,data.txt,然后对每个坐标执行一次g++,把生成的a.exe copy到模型程序所在的文件夹下,

//system("g++ D:\\documents\\cpp\\tests\\testCalFluxWithVS\\CalFlux_copy.cpp -L D:\\documents\\cpp\\tests\\testCalFluxWithVS\\lib -lpe8 -lgfortran -lgeopack2008");
    //system("copy D:\\documents\\VisualStudio\\testCPP\\CalFluxtest\\CalFluxtest\\a.exe D:\\documents\\cpp\\tests\\testCalFluxWithVS");

然后用ShellExecute执行a.exe,而执行是需要传入参数的https://bbs.csdn.net/topics/310242153,把传入参数作为一个string,放到ShellExecute对应的参数位置。然后会报错C++不存在从std::string转换为LPCSTR的适当函数

需要改一下类型,把string改为LPCSTR

用一个坐标测试一下

好,到此,由程序自动生成了tom3文件,接下来读入tom3文件再写入到result.txt里就可以了

先记录到这,今天也要加油鸭

 

继续

接下来tom3文件生成后发现有问题,是这样的

发现时间混乱了,变成了0.0002014,后面顺序是错的,显然高度的值也没有输入进去

到模型程序的main函数里,打印一下输入的数据,发现输入的第一个是ShellExecute的第一个路径的char类型值。应该是ShellExecute没有明白,弄错了输入。但是没关系,改一下main函数,从第二个开始读就可以了。

算出来结果

输入测试数据3条,最后输出文件是对的

 

3.3 更新

后来运行所有数据又遇到了一个问题,大概是运行到读取tom3.txt的时候fscanf那里报错,报的错是输入参数严重不符合fscanf的输入参数要求,因为tom3.txt是模型程序自动生成的,所以会有表头,无法去掉,所以我加了一行代码,把tom3第一行的字符都忽略,直接从第二行数据开始读。

fscanf(fp,"%*[^\n]%*c"); /* 跳过一行字符串 */

这句总是断点出问题,报错是这样的

其实是程序流程的问题,首先生成了模型文件的a.exe,然后执行a.exe,生成tom3,再去读取tom3的内容,但是执行a.exe生成tom3的时候,程序已经去读tom3了,其实这个时候tom3还不存在。所以报错

只要在读tom3之前加一个延时就可以了。

加了一个0.5s的延时

到此为止应该全部搞定了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值