2013-10-07 77 views
0

我有一個Visual Studio C++項目。的在Visual Studio中多次運行C++項目main()?

int main(int argc, char** argv) 

debugging options,然後如果我想只運行一次,我可以簡單地手動輸入參數點擊調試

不過現在,我希望多次用不同參數一次運行。例如我希望像這樣運行:

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

我該如何使用Visual Studio做到這一點?

回答

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所以你可以看到它的工作,但你應該替換爲您的實際可執行文件的名稱,並修改

: : : : : : : : : : 
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 

:cd命令與固定在第一兩個參數,最後兩個運行0-50和0-10,它的輸出的完成選擇適當的目錄)561倍(51×11)可能是一種讓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陣列的結構並不因爲必須遵循與標準中規定的相同規則,特別是argcargv必須同意,argv必須有一個字符指針數組(比argc指示的多一個),以便每個參數都是C風格的字符串,argv[0]必須表示程序名稱,argv[argc]必須爲NULL,依此類推。

這可能是最簡單的使用cmd腳本解決方案,並讓啓動代碼負責所有參數準備工作。

+0

你可能會打開VS的多個實例,並在每個實例中運行代碼,雖然有點混亂。 –

+0

非常感謝!我該如何編寫這個特定的main()的cmd腳本? pastie.org/8382923說我的arg0,arg1總是data.txt和result.txt。我的arg2循環從0-50和我的arg3循環從0-10?真的是C++的新手,從來沒有聽說過cmd腳本。謝謝 –

+0

@ perfectionm1ng,已經更新了'cmd'文件樣本以顯示這樣做的一種方式。 – paxdiablo

4

在C++中,在程序(C++ 11§3.6.1/ 3)中調用main是非法的。但是,任何main內完成的工作都可以通過其他功能輕鬆完成。

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

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

在這一點上,歡迎隨時爲你希望你的程序(或Visual Studio調試器)中調用foo(...)多次。

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 

或者你可以重構主循環和調用一個函數:

#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 
+0

感謝您的分步解決方案。 1.在項目文件夾內我沒有任何東西。我擁有的是Microsoft Visual Studio Solution和VC++ Project。我可以做什麼? 2. main()的參數輸入如下所示:http://pastie.org/8382923如何編寫我的批處理文件?謝謝!真的是C++的新手。 :) –

+1

生成項目後,'.exe'通常位於解決方案旁邊的Debug或Release目錄中。 –

相關問題