我正在尝试制作argv的新副本,然后将其传递给python PySys_SetArgv,我收到错误:
我的argv参数是:
./matrix -r 2 -c 2 -MIN 0 -MID 10 -UPPER 50 -MAX 100
我想创建一个名为argv_new的argv的新副本,其中包含从-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 :(得分: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()
答案 1 :(得分: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);