Запускать C ++ Project main () несколько раз в Visual Studio?

0

У меня есть проект Visual Studio C++. Если я хочу только запустить его один раз, я могу просто вручную ввести аргументы

int main(int argc, char** argv)

в debugging options а затем нажмите Debug.

Однако сейчас я хочу запускать несколько раз с разными параметрами за один раз. например, я хочу запустить его следующим образом:

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

Как я могу это сделать с помощью Visual Studio?

Теги:

3 ответа

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, чтобы выбрать соответствующий каталог) 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 должен argv массив указателей символов (один из них больше, чем указано argc), так что каждый аргумент является строкой типа C, argv[0] должен представлять имя программы, argv[argc] должен быть NULL и т.д.

Вероятно, проще всего использовать решение сценария cmd и пусть код запуска заботится обо всех этих приготовлениях для вас.

  • 0
    Вы могли бы, вероятно, открыть несколько экземпляров VS и запустить код в каждом экземпляре, хотя и немного грязно.
  • 0
    Большое спасибо! Как я могу написать сценарий cmd для этого конкретного main ()? pastie.org/8382923 скажем, мои arg0, arg1 всегда data.txt и result.txt. Мои циклы arg2 от 0 до 50, а мои циклы arg3 от 0 до 10? Действительно новичок в C ++ и никогда не слышал о сценарии cmd. Спасибо
Показать ещё 6 комментариев
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), сколько захотите.

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 и проект VC ++. Что я могу сделать? 2. Параметр input функции main () выглядит следующим образом: pastie.org/8382923 Как мне написать свой командный файл? Спасибо! Действительно новичок в C ++. :)
  • 1
    После сборки проекта .exe обычно будет находиться в каталоге Debug или Release рядом с решением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню