0

我有一个 Visual Studio C++ 项目。如果我只想运行一次,我可以简单地手动输入参数

int main(int argc, char** argv)

进入debugging options,然后单击Debug

但是现在,我希望一次使用不同的参数运行多次。例如,我希望像这样运行它:

for(i=0; i<10; i++)
{
    main(i);
}

如何使用 Visual Studio 执行此操作?

4

3 回答 3

4

在 C++ 中,在程序中调用是非法main的(C++11 §3.6.1/3)。但是,在内部完成的任何工作都main可以在另一个函数中轻松完成。

int main( int argc, char** argv ) {
    foo( argc, argv );
}

int foo( int argc, char** argv ) {
    // do something
}

此时,您可以随意foo(...)在您的程序(或 Visual Studio 调试器)中任意调用多次。

于 2013-10-07T02:04:30.947 回答
3

我不相信调用main. 即使是这样,您也会传递错误的参数(argc == 1argv == ${DEITY}_ONLY_KNOWS)。

这是一个我可能会用 cmd 脚本解决的问题。只需确保您的程序已编译,然后运行类似:

@echo off
cd \path\to\debug\dir
rem this bit can be as complex as cmd.exe allows:
for /l %%a in (0,1,50) do (
    for /l %%b in (0,1,10) do (
        echo data.txt result.txt %%a %%b
    )
)

这将运行一个命令(echo在我的例子中,你可以看到它工作,但你应该用你的实际可执行文件名称替换它,并修改 cd 命令以选择正确的目录)561 次(51 x 11),前两个参数固定最后两个运行 0-50 和 0-10,其输出完成:

: : : : : : : : : :
data.txt result.txt 49 7
data.txt result.txt 49 8
data.txt result.txt 49 9
data.txt result.txt 49 10
data.txt result.txt 50 0
data.txt result.txt 50 1
data.txt result.txt 50 2
data.txt result.txt 50 3
data.txt result.txt 50 4
data.txt result.txt 50 5
data.txt result.txt 50 6
data.txt result.txt 50 7
data.txt result.txt 50 8
data.txt result.txt 50 9
data.txt result.txt 50 10

可能有一种方法可以让 VS 作为构建/运行序列的一部分自动执行此操作,但我不知道有任何方法(而且我大多数时候倾向于选择最简单的解决方案)。


当然,您可以重构代码,以便重命名为其他名称,然后使用如下main过滤器:main

int main (int argc, char *argv[]) {
    // Do this normally:
    return worker (argc, argv);

    // Or do this for debugging:
    // int stat = 0;
    // for (int i = 0; i < 10; i++) {
    //     // construct argv-lookalike based on i.
    //     stat = worker (myargc, myargv);
    //     if (stat != 0) break;
    // }
    // return stat;

但是,argv 数组的构造并非易事,因为您必须遵循标准中规定的相同规则,特别是argc并且argv必须同意,argv必须是字符指针数组(比 表示的多一个argc),以便每个参数是 C 风格的字符串,argv[0]必须表示程序名称,argv[argc]必须为 NULL,等等。

使用cmd脚本解决方案可能是最简单的,让启动代码为您处理所有参数准备工作。

于 2013-10-07T01:57:37.087 回答
2

假设您有这个假设的程序:

#include <iostream>
#include <cstdlib>
using namespace std;

int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        cerr << "bad input" << endl;
        exit(1);
    }
    auto arg = atoi(argv[1]);
    cout << (2*arg) << endl;
}

您可以使用批处理脚本。将以下内容保存test.bat在与您的程序可执行文件相同的目录中。键入help或专门help for在命令提示符中输入有关批处理文件命令的更多信息:

@echo off
for /L %%i in (0,1,9) do prog.exe %%i

输出:

0
2
4
6
8
10
12
14
16
18

或者您可以将 main 重构为循环并调用函数:

#include <iostream>
using namespace std;

void func(int arg)
{
    cout << (2*arg) << endl;
}

int main()
{
    for(auto i = 0; i < 10; ++i)
        func(i);
}

输出:

0
2
4
6
8
10
12
14
16
18
于 2013-10-07T02:10:59.543 回答