基于WinForm开发的高效率C/C++程序源码编译测试系统

2021-10-25 03:42赵中堂刘明勋
信息记录材料 2021年10期
关键词:编译器文本框窗体

赵中堂,刘明勋

(1郑州航空工业管理学院智能工程学院 河南 郑州 450046)

(2北京理工大学智能机器人与系统高精尖创新中心 北京 100081)

1 引言

学习C、C++语言时,需要进行大量的练习[1-2]。对于初学者来说选择一个简洁易懂、容易使用的集成开发环境将对后续的学习提供巨大的帮助。经过对多个流行的文本编辑器及集成开发环境(integrated development environment,IDE)满意度调研发现,许多初学者对于这些代码编辑器并不满意。

(1)对于初学者而言,系统越简单失误率越低;系统越复杂,一旦失效所造成的损失也是巨大的,甚至是灾难性的。例如,VC++6.0的集成开发环境会因为庞大的软件体系与键盘热键等一系列全新内容而劝退一大批初学者,这无疑增加了学习成本。并不是认为其不优秀,只是复杂的系统并不适合初学者。

(2)初学者需要一个稳定便捷的软件,简单如DEV-C++的编译器,也会因为无人维护等一系列原因,造成软件崩溃的现象。Notepad++也是一款不错的代码编辑软件,它带有语法高亮与缩进功能,但是它并不能编译以及调试C/C++源码,还是需要借助外部编译器,显然这也会增加初学者的负担。

(3)初学者需要大量的数据测试[3-5],数据测试的效率问题可能是众多编译器的通病。据作者统计,许多初学者在做编程练习的时候都有测试数据以检查代码正确性的习惯,而目前市面上的编辑器及IDE大多都是编译后执行命令行,去让使用者去输入数据,这将会浪费很大一部分时间。

根据以上缺点分析,本文设计了一个方便易用的C/C++的源代码编译测试系统,只需要用户输入待测试源码、测试数据及预期输出,就可以对该源码进行多次带有正误反馈的测试结果,多次使用证明可以极大减少测试的时间。

2 系统功能简介

在设计该系统时,参考并改良了一些测试系统[6],本系统成品界面见图1。

从图1所示界面,点击文件菜单,在出现的下拉菜单中点击新建菜单项,或者直接使用快捷键Ctrl+N,就会弹出一个新的子窗体,老的子窗体并不会消失。若想关闭当前子窗体,可以点击窗体右上角的关闭按钮,也可以通过文件菜单的“关闭”菜单项关闭。

图1 编译测试系统主界面

在弹出的“C++编译调试器”窗口中,就是我们要操作的部分。在左边第一个文本框中粘贴或者通过键盘输入C、C++程序代码,在“测试输入数据”提示下面的文本框中输入用户的测试数据,在“预期输出数据”提示下面的文本框中输入标准答案[7]。然后点击右上方的“编译运行”按钮,程序会把源码编译后自动执行并输入测试数据,执行结果将与其预期输出进行对比。如果编译不通过,编译器输出栏将以黑底红字显示编译器报错结果;如果编译通过且执行结果与预期结果相同,运行结果栏将正常显示执行结果;如果执行结果与预期结果不相同,运行结果栏将以红底黑字显示出来。

程序的执行流程见图2。

图2 程序执行流程图

3 开发技术

本系统所使用的开发工具为微软公司的产品Visual Studio2019,基于.Net Framework框架,利用C#语言的WinForm技术制作[8,10]。

本系统所使用到的技术有:C#桌面应用开发、MDI(Multiple Document Interface,多文档界面)、文件操作、进程调用、C/C++程序编译原理。

3.1 基本窗体控件操作

从图1可以看出,该系统界面简洁,所使用的窗体控件有窗体Form、标签控件Label、文本框控件TextBox、按钮控件Button,并调整了相关控件的相应属性,使它更符合使用习惯。设置左边3个文本框的背景为白色,字体为黑色,允许用户向其中粘贴代码和数据,也允许通过键盘输入数据;设置代码输入文本框为等宽字体显示;设置编译器输出文本框和输出结果文本框为灰色背景,只读属性,不允许用户向其中输入数据。

3.2 MDI窗体

使用主界面MDI属性,创建MDI窗体[9],并设定子窗体的MDI父窗体为主界面;从菜单栏中新建选项即可创建新的测试窗体。

3.3 文件操作

在点击“编译运行”按钮后,程序File类的open方法打开代码文件tempCode.cpp,建立FileStream文件流[10]对象。通过创建StreamWriter对象将代码文本框中的代码存入到该文件中,覆盖掉原有内容;如果该文件不存在,则创建该文件并写入代码。参考代码如下:

privatevoidWriteFile(string code) {

string path = “tempCode.cpp”;

FileStream fs=File.Open(path,FileMode.Create);

StreamWritersw = newStreamWriter(fs);

sw.WriteLine(code);

sw.Flush();

sw.Close();

fs.Close();

3.4 进程调用

使用保存的C/C++源代码文件tempCode.cpp,程序调用g++编译器编译该源代码文件。为了使用g++编译器的功能,需要在控制台下调用g++,就需要用到C#的进程类Process。

用Process类创建对象p,设置要为控制台程序cmd.exe创建进程,并设置对应的重定向标准输入、标准输出、标准错误等属性,然后启动进程。参考代码如下:

Process p = newProcess();

p.StartInfo.FileName = "cmd.exe";

p.StartInfo.UseShellExecute = false;

p.StartInfo.RedirectStandardInput = true;

p.StartInfo.RedirectStandardOutput = true;

p.StartInfo.RedirectStandardError = true;

p.StartInfo.CreateNoWindow = true;

国内外学者围绕技术溢出,对合作创新的市场绩效进行了系统且细致的研究。但是研究的视角单一,技术溢出仅仅是影响合作创新的主要原因之一,另外实证研究也非常不够。因此,从以下几方面加强对合作创新市场绩效的研究,对提高我国企业的自主创新动力和效率,发展战略新兴产业,实现创新型国家的目标意义重大。

p.Start();

接下来,模拟在控制台下输入编译指令,调用g++.exe编译器程序编译tempCode.cpp源代码文件。并将编译信息写入一个字符串,以备查看。参考代码如下:

p.StandardInput.AutoFlush = true;

p.StandardInput.WriteLine(""..\..\MinGW64\bin\g++.exe" tempCode.cpp -g -Wall -O2 -staticlibgcc -std=c++14 -pipe -fexec-charset=GBK &exit");

stringcompilerOutput = p.StandardError.ReadToEnd();

当编译器g++执行完毕,若有错误输出,则把错误信息写入编译器输出文本框,等待用户修订程序,然后点击“编译运行”按钮。若程序没有编译错误,则继续运行,查看程序的正确性。

当程序没有语法错误时,编译器g++的产出为可执行文件,不失一般性,命名为a.exe。为a.exe创建进程,将测试数据作为标准输入进程中,并通过标准输出得到输出结果,存入一个字符串runOutput中,将runOutput与标准答案进行比较,如果不想等,则是程序存在逻辑错误,指示用户进行改正。

4 结语

本文针对现有C/C++集成开发工具在开发、测试源代码程序时,需要多次输入测试数据的缺点,基于WinForm技术设计了一个专门为初学者打造的高效率编译测试系统,能够做到使用户只需要输入一次测试数据,就将极大提高开发效率。同时,可以将该功能基于Web系统实现,使得更多的学习者受益。

猜你喜欢
编译器文本框窗体
巧用文本框实现PPT多图片排版
基于相异编译器的安全计算机平台交叉编译环境设计
PPT文本框的另类应用
试谈Access 2007数据库在林业档案管理中的应用
文本框酷变3D效果
通用NC代码编译器的设计与实现
巧设WPS窗体控件让表格填写更规范
文本框在地理课件中的应用
编译器无关性编码在微控制器中的优势
基于ARM嵌入式平台的x86译码SOC架构设计