【问题标题】:How to build a flexible code hierarchy如何构建灵活的代码层次结构
【发布时间】:2016-01-22 21:38:07
【问题描述】:

所以,我有一个算法,由参数 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 的作业功能来运行多个线程?

谢谢

【问题讨论】:

  • 在 SO 上,您应该表现出努力并提供证据证明您已经尝试过某些东西,并询问为什么它不起作用。所以用户不会为你编写代码。
  • 我不是要代码。我问这样的想法是可能的,特别是它使用不同的运算符自动生成可执行文件的部分。到时候我会说清楚的,所以你可以删除你的反对票。
  • 就在我的脑海中,如果你有一些包含可能值的数组,你可以遍历所有这些值。把它想象成一个密码锁。您循环遍历第一个数组,然后在内部循环遍历第二个数组,依此类推。然后,在最后一个循环中,您运行可执行文件。
  • 正如我在问题上所说,对于基本的变量。困难的部分是使代码自动具有不同的运算符。
  • 你说你有可执行文件对吗?否则使用函数?在任何情况下,如果每次操作都相同,您可以调用systempopen 在最终循环中运行可执行文件或调用函数等。您可以传递参数以每次更改操作。跨度>

标签: c algorithm makefile flexibility


【解决方案1】:

我过去使用过的方法:

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

#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 用适当的单词,代码将编译并执行该操作。

【讨论】:

  • 谢谢。现在我将尝试用它编写某种make。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2013-12-11
  • 1970-01-01
相关资源
最近更新 更多