Я определил некоторую структуру выше основной как:
struct arguments
{
int c;
char *v[];
};
Теперь я хочу сделать это в основном:
int main(int argc, char *argv[])
{
arguments arg;
arg.c = argc;
arg.v = argv; /* error: incompatible types in assignment of 'char** to char* [0]' */
}
Итак, я не до конца понимаю, что делаю, но инстинктивно я переделал структуру так, чтобы линия char *v[];
вместо char **v[];
однако, это означает, что когда я передаю ссылку на мою структуру arg
, если я хочу разыменования и получить значение arg.v[0]
, который будет именем программы, теперь я должен сделать *arg.v[0]
и это больше не работает для *arg.v[1]
,
У меня есть такая функция, как:
void argument_reader(arguments &arg)
{
cout << "Number of arguments: " << arg.c << endl << endl;
cout << "Array\t\tValue\n";
cout_bar(40);
for (int i = 0; i < arg.c; i++)
{
cout << "argv[" << i << "]\t\t" << *arg.v[i] << endl;
}
return;
}
но когда я звоню *arg.v[i]
программа заканчивается без вывода значения второго аргумента или каких-либо других в этом отношении.
Итак, мой вопрос, есть ли какой-то способ, которым я могу использовать структуру для передачи между функциями, так что я могу вызвать arg.v[some_index < arg.c]
внутри другой функции, сделав линию arg.v = argv
в основной работе, как я планировал (для хранения адреса argv
в arg.v
)
Вся структура делает это так, чтобы вместо того, чтобы пройти argc
а также argv
к функции, которая имеет замедление, как: void func(int &argc, char *argv[]);
Вместо этого я могу передать свой новый тип структуры с именем переменной arg
к функции, объявленной как void func(arguments &arg)
и это в основном все, что я хотел для структуры. Поэтому, если я не могу этого сделать, я могу вернуться к первому способу.
Вам нужно написать:
struct arguments
{
int c;
char **v;
};
Теперь ваш main()
буду работать. (И такого рода путаница, почему я всегда использую int main(int argc, char **argv)
, но это личная причуда.)
Если вы работали в C99 или более поздней версии, то, что вы создали с помощью своей структуры, называется «член гибкого массива» (FAM), дополнение к C99 по сравнению с C89 (и, следовательно, по сравнению с C ++ 98). Я не заметил, что вы работаете в C ++! Существуют специальные правила для FAM в C, и вы не можете выполнять назначение, как вы делали с членом гибкого массива.
Однако исправление будет работать в C ++ так же, как и в C; это просто не обязательно правильно, что вы используете FAM. Вы используете компилятор C ++, который поддерживает FAM как расширение?
В вашей выходной строке у вас есть:
cout << "argv[" << i << "]\t\t" << *arg.v[i] << endl;
Это напечатало бы первый символ аргумента; бросить *
и вы получите первый аргумент в виде строки:
cout << "argv[" << i << "]\t\t" << arg.v[i] << endl;
Измените свою структуру на это:
struct arguments
{
int c;
char **v;
};
Массив и указатель в стиле C очень похожи, и вы можете использовать приведенную выше структуру так же, как вашу версию или оригинал argv
параметр.
Действительно, часто основная функция объявляется так вместо использования []:
int main(int argc, char **argv)
Обратите внимание, что с этим кодом ответа v
указывает на оригинал argv
массив указателей на char, указатели не копируются. Если вы действительно хотите получить копию, вам нужно динамически выделить массив указателей на символы и скопировать.
две вещи:
struct arguments
{
int c;
char *v[]; /*unknown length, hence structure is incomplete*/
};
Вам нужен двойной указатель, который содержит адрес argv
struct arguments {
int c;
char **v;
};