копирование элементов argv в новый массив

0

Я пытаюсь создать новую копию 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**)

Я не уверен, как исправить эту ошибку. Любая помощь будет оценена.

  • 0
    Вам не нужно копировать argv перед передачей его на Python - PySys_SetArgv использует его только для создания строк Python.
Теги:

2 ответа

0
Лучший ответ

Предполагая, что все, что вы хотите сделать, это пропустить некоторые аргументы, другим решением было бы построить новый массив указателей на строки аргументов, чтобы перейти к нему вместо копирования строк фактического аргумента:

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);
1

Массив указателей (как 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() если вы предпочитаете это)

Ещё вопросы

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