Если я использую структуру для переноса argc и argv, как мне назначить адрес argv переменной внутри структуры?

Я определил некоторую структуру выше основной как:

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) и это в основном все, что я хотел для структуры. Поэтому, если я не могу этого сделать, я могу вернуться к первому способу.

1

Решение

Вам нужно написать:

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;
4

Другие решения

Измените свою структуру на это:

struct arguments
{
int c;
char **v;
};

Массив и указатель в стиле C очень похожи, и вы можете использовать приведенную выше структуру так же, как вашу версию или оригинал argv параметр.

Действительно, часто основная функция объявляется так вместо использования []:

int main(int argc, char **argv)

Обратите внимание, что с этим кодом ответа v указывает на оригинал argv массив указателей на char, указатели не копируются. Если вы действительно хотите получить копию, вам нужно динамически выделить массив указателей на символы и скопировать.

3

две вещи:

struct arguments
{
int c;
char *v[]; /*unknown length, hence structure is incomplete*/
};

Вам нужен двойной указатель, который содержит адрес argv

    struct arguments {
int c;
char **v;
};
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector