如何构建灵活的代码层次结构

时间:2015-10-23 11:05:50

标签: c algorithm makefile flexibility

所以,我有一个算法,由参数A,B,C和D,以及操作X,Y和Z组成。目的是编写代码来测试A,B的所有组合(在一定范围内) ,C和D,并可能改变操作X,Y或Z。

如果只是将变量放在一定范围内,这将很简单。但是,既然我想改变运营商,那也不是那么简单。

我的想法是编写涵盖所有组合的代码。例如,让我们考虑只有两个参数(A和B),并且两者的范围相同:[1,2],整数。代码将构建(并且如果可能,执行)4个不同的可执行文件,对应于使用以下算法:

A = 1, B = 1
A = 1, B = 2
A = 2, B = 1
A = 2, B = 2

现在添加运营商。例如,我们选择前面的示例并添加操作X,它可以是[+, - ]。结果集是:

A = 1, B = 1, X = +
A = 1, B = 2, X = -
A = 2, B = 1, X = +
A = 2, B = 2, X = -
A = 1, B = 1, X = -
A = 1, B = 2, X = +
A = 2, B = 1, X = -
A = 2, B = 2, X = +

(我希望我写完所有组合)

无论如何,我相信可以使用makefile构建这样的结构,它将值归因于用C编写的代码的常量。我不确定是否可以以这种方式更改运算符。我正在考虑使用makefile来简化。编写生成代码的代码总是可能的,但对于这种情况似乎相当夸张。

也许它会创建一个树形结构?我不确定是否有益(并选择第一个例子):

|--Makefile
|--A1
|   |--B1
|   |   |--a.out
|   |--B2
|       |--a.out
|--A2
    |--B1
    |  |--a.out
    |--B2
        |--a.out

使用make我相信我可以在代码中添加额外的变量/运算符,并轻松地重建所有测试。此外,此结构是否允许使用make的作业功能以使多个线程运行?

由于

1 个答案:

答案 0 :(得分:1)

过去使用的方法I:

您可以编写一个shell脚本来定义一个宏,然后然后编译该程序。使用此方法,您只需编写一个源文件并编译多个程序。对通过命令行args传入的两个数字执行某些操作的示例程序:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv[]){
    if (argc != 3){ //takes just 2 numbers (for example purposes)
        fprintf(stderr, "Usage: prog num1 num2\n");
        return 1;
    }
    int a = (int)strtol(argv[1], (char**)NULL, 10);
    int b = (int)strtol(argv[2], (char**)NULL, 10);
    int c = a MySpecialOperation b;
    printf("%d %s %d = %d\n", a, MySpecialOperationText, b, c);
    return 0;
}

您很快就会注意到MySpecialOperationMySpecialOperationText未定义。这是故意的。 (此外,程序假定命令行参数有效。)

现在让我们假设你想要4个执行4个基本算术运算的程序。编写一个脚本来编译你的程序(这是在BASh中):

echo \#define MySpecialOperation \+ > tmp.c
echo \#define MySpecialOperationText \"plus\" >> tmp.c
cat myprogram.c >> tmp.c
gcc tmp.c -o addition_prog
echo \#define MySpecialOperation \- > tmp.c
echo \#define MySpecialOperationText \"minus\" >> tmp.c
cat myprogram.c >> tmp.c
gcc tmp.c -o subtraction_prog
echo \#define MySpecialOperation \* > tmp.c
echo \#define MySpecialOperationText \"times\" >> tmp.c
cat myprogram.c >> tmp.c
gcc tmp.c -o multiplication_prog
echo \#define MySpecialOperation \/ > tmp.c
echo \#define MySpecialOperationText \"divided by\" >> tmp.c
cat myprogram.c >> tmp.c
gcc tmp.c -o division_prog
rm tmp.c

此脚本自动创建新文件,将预处理程序语句#define写入其中,定义先前未定义的变量,然后将原始源文件附加到其中。现在,编译器将MySpecialOperation替换为具有相应字的操作(+-*/)和MySpecialOperationText ,代码将编译并执行该操作。