У меня есть проект Visual Studio C++. Если я хочу только запустить его один раз, я могу просто вручную ввести аргументы
int main(int argc, char** argv)
в debugging options
а затем нажмите Debug.
Однако сейчас я хочу запускать несколько раз с разными параметрами за один раз. например, я хочу запустить его следующим образом:
for(i=0; i<10; i++)
{
main(i);
}
Как я могу это сделать с помощью Visual Studio?
Я не считаю это технически законным (по стандарту), чтобы назвать 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
и пусть код запуска заботится обо всех этих приготовлениях для вас.
В 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), сколько захотите.
Скажем, у вас есть эта гипотетическая программа:
#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
.exe
обычно будет находиться в каталоге Debug
или Release
рядом с решением.