程序调试
对拍
$ Windows $ 下的对拍程序
- 借助 \(Windows\) 脚本
@echo off
:loop
r.exe > input.in
coronas.exe output.a
std.exe output.b
fc output.a output.b
if not errorlevel 1 goto loop
一直没有找到怎样能控制对拍次数,今天终于醒悟,可以用 \(C++\) 写对拍 ,不仅能控制对拍次数,可移植性还更强,修改更方便
#include
#include
#define input "input.in"
#define output1 "output.a"
#define output2 "output.b"
int main() {
const int t=100;
for(int i=1; i<=t; i++) {
system("r.exe" ">" input);
system("Coronas.exe" "<" input ">" output1);
system("std.exe" "<" input ">" output2);
int a=system("fc " output1 " " output2 ">null");
printf("test Case %d : ",i);
if(a) {
printf("Error.\n");
return 1;
} else {
printf("Right.\n");
}
}
system("del " input);
system("del " output1);
system("del " output2);
system("del " "null");
return 0;
}
\(Linux\) 下的对拍程序
脚本:
#!bin/bash
while true;do
./r>input
./aoutput.a
./boutput.b
diff output.a output.b #文件比较
if [ $? -n 0 ] ; then break; fi # 判断返回值
done
\(Linux\) 下的对拍有很多问题,比如要开权限(上面的文件要用 source
命令运行),比如命令不回显,所以根本不知道是在比较还是程序死循环了,这时候借助 \(C++\) 就很有意义了
#include
#include
#define input "input"
#define output1 "output.a"
#define output2 "output.b"
int main() {
const int t=100;
for(int i=1; i<=t; i++) {
system("./r" ">" input);
system("./Coronas" "<" input ">" output1);
system("./std" "<" input ">" output2);
int a=system("diff " output1 " " output2);
//diff a b 为比较文件 a ,b 的内容,注意如果a,b的内容相同,则返回 0
//如果a,b 的内容不同,返回值为 1
printf("test Case %d : ",i);
if(a) {
printf("Error.\n");
return 1;
} else {
printf("Right.\n");
}
}
system("rm " input);
system("rm " output1);
system("rm " output2);
return 0;
}
gdb
使用 \(gdb\) 调试程序前一定要记得在编译选项中加上 -g
。
比如 \(C\)语言程序,编译命令应为 gcc example.c -g
若为 C++,编译命令应为 g++ example.cpp -o example -Wall -g
然后用 gdb example.exe
(Windows) 或 gdb example
(Linux) 来加载程序就可以了。
可以在 vimrc
中添加Debug()
函数:
func Debug()
exec "w"
if &filetype=='cpp'
exec "!g++ % -std=c++11 -Wall %< -o -g"
elseif &filetype=='c'
exec "!gcc %< -g"
endif
exec "!gdb %<"
endfunc