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 == 1およびargv == ${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コマンドを変更して適切なディレクトリを選択する必要があります)最初の2つの引数を固定して561回(51 x 11)最後の 2 つは 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;

argcただし、argv-array の構築は簡単ではありません。これは、標準で規定されているのと同じ規則に従う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 に答える