我欠大王一个leetcode(之二)——跨文件的C调用

-----------------------------2018.2.4-------------------------------

失眠半晚作出放弃JNI的决定之后,神清气爽地一觉睡到12点orz

设想一个用例:

布置作业:让学生实现一个返回双精度数平方的函数。学生通过网页的某textarea提交一个函数,后端获取学生提交的函数并测试它的正确性。

极简例如下:


文件"D:\gcc-workspace\function.c":

double sqr(double x){
	return x*x;
}
文件"D:\gcc-workspace\caller.c":

#include<stdio.h>
extern double sqr(double x);
int main(){
	double y = sqr(3.0);
	printf("%f\n",y);
	printf("hello world!\n");
	system("pause");
	return 0;
}
CMD输入:(这个命令可优化:对于没有变化的caller.c,在预编译、编译、汇编、链接四步中的某一步及其之前的步骤是可省的。我猜是该步骤是汇编)
gcc d:\gcc-workspace\function.c d:\gcc-workspace\caller.c -o d:\gcc-workspace\hhh

双击"D:\gcc-workspace\hhh.exe",肉眼观察到

9.000000
hello world!
请按任意键继续. . .
人工检查function.c的过程至此完毕。




当然了,这个例子是一个最小集,以后需要面对的是多种题型,多个测试用例,以及大量文件。


人工检查是低效率的,之后应该做的是复习C的文件操作,将结果记录到文件系统中让java来做比较。

java可以操作cmd,所以剩下的全交给java即可。


顺便,java操作命令行的demo如下:

package cn.edu.nju.zyf.cmddemo;

import java.io.IOException;

public class CMDTest {
	public static void main(String[] args) {
		Process process = null;
		try {
			String compileCommand = "gcc d:\\gcc-workspace\\function.c d:\\gcc-workspace\\caller.c -o d:\\gcc-workspace\\hehehe411";
			process = Runtime.getRuntime().exec(compileCommand);
			process.waitFor();
			System.out.println(process.exitValue());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally {
			if(process!=null) {
				process.destroy();
			}
		}
	}
}

------输入命令后,cmd会将此命令的正确结果或错误结果输出到console。注意一下这里的输出结果有正确和错误之分。------

package cn.edu.nju.zyf.cmddemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class CMDTest {
	public static void main(String[] args) {
		Process process = null;
		BufferedReader br1 = null;
		BufferedReader br2 = null;
		try {
			String compileCommand = "gcc -h";//这是一条不正确的指令。正确的指令是gcc --help
			process = Runtime.getRuntime().exec(compileCommand);
			process.waitFor();
			br1 = new BufferedReader(new InputStreamReader(process.getInputStream()));
			br2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
			String line = null;
			while((line = br1.readLine())!=null) {
				System.out.println(line);
			}
			while((line = br2.readLine())!=null) {
				System.out.println(line);
			}
			
			System.out.println(process.exitValue());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally {
			if(process!=null) {
				process.destroy();
			}
		}
	}
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值