Я пытаюсь создать новую копию argv, а затем передать ее на python PySys_SetArgv, где я получаю сообщение об ошибке:
Мои аргументы argv:
./matrix -r 2 -c 2 -MIN 0 -MID 10 -UPPER 50 -MAX 100
Я хочу создать новую копию argv, называемую argv_new, которая содержит аргументы, начиная с -MIN и заканчивая на 100. Я выполняю это следующим образом:
char argv_new[argc-4][6];
strcpy(argv_new[0],argv[0]);
cout << argv_new[0] << "\n";
for(int j=5; j<argc; j++)
{
strcpy(argv_new[j-4],argv[j]);
cout << argv_new[j-4] << "\n";
}
Мой выход выглядит следующим образом:
./matrix
-MIN
0
-MID
10
-UPPER
50
-MAX
100
Затем я пытаюсь передать этот argv_new
в PySys_SetArgv as PySys_SetArgv(argc - 4, argv_new)
чтобы установить argv для передачи на python. Однако я получаю следующую ошибку:
не может преобразовать 'char (*)[6] to 'char** for argument '2 to 'void PySys_SetArgv(int, char**)
Я не уверен, как исправить эту ошибку. Любая помощь будет оценена.
Предполагая, что все, что вы хотите сделать, это пропустить некоторые аргументы, другим решением было бы построить новый массив указателей на строки аргументов, чтобы перейти к нему вместо копирования строк фактического аргумента:
char *argv_new[argc-4];
argv_new[0] = argv[0];
for(int j=5; j<argc; j++)
argv_new[j-4] = argv[j];
PySys_Argv(argc-4, argv_new);
Массив указателей (как argv
) и двухмерный массив не совпадают. В первом случае argv [0], argv [1] и т.д. Являются реальными указателями, которые могут указывать на совершенно разные адреса, во втором случае это один непрерывный блок памяти, где индексы просто считываются как смещения к начальному адресу. Таким образом, невозможно успешно бросить один в другой.
Чтобы скопировать argv
должны сделать это:
char *argv_new[argc-4];
argv_new[0] = strdup(argv[0]);
for(int j=5; j<argc; j++)
{
argv_new[j-4] = strdup(argv[j]);
}
(вы можете заменить strdup(s)
на malloc(strlen(s)+1)
+ strcpy()
если вы предпочитаете это)
argv
перед передачей его на Python -PySys_SetArgv
использует его только для создания строк Python.