Обработка переменного числа аргументов во время выполнения в структуре - PullRequest
1 голос
/ 30 июля 2010

У меня есть классы, исполнитель с этими методами:

  1. Executer ()
  2. struct Execute (string s)
  3. Lookup (имя строки, intmodule, int num, ...)

и анализатор:

  1. Parser ()
  2. struct Parse (строка s)

Метод Exectuers Execute вызывает метод Parser Parse.Затем анализатор разбивает строку на более мелкие биты (он разбивает строку на; -sign) и возвращает структуру в метод Execute.Эта структура используется для вызова метода Lookup.Структура, которую возвращает Parse, содержит некоторую стандартную информацию:

  1. Имя команды
  2. SenderId (имя пользователя, MAC-адрес и пароль)
  3. Переменное число аргументов

И это моя проблема.Метод Lookup принимает переменные аргументы, но как мне обработать передачу этих переменных переменных структурой?Я не эксперт в C и C ++.Должен ли я массировать два класса вместе?Таким образом, метод Parser может вызывать метод Execute, избавляя от структуры.Или, может быть, есть способ анализа неизвестной переменной аргументов во время выполнения?К какому-либо массиву?

EDIT Я не могу использовать библиотеку STL из C ++.Я использую только класс C ++ и виртуальную функцию.Я пишу в компилятор, где я ограничен в использовании почти всех библиотек C + магические навыки C ++ (виртуальные и классовые).Извините, что не сказал об этом сразу.

EDIT 2 Я пишу код во встроенную систему и, таким образом, использую avr-gcc для компиляции моего кода.Вот почему я не могу использовать STL.Avr-gcc не поддерживает это.

Ответы [ 3 ]

1 голос
/ 30 июля 2010

Вы можете объявить ваш метод Lookup следующим образом:

void Lookup(string name, int module, int num, std::vector<std::string> &args);

Сохраняя аргументы переменных в массиве args, вы можете иметь столько, сколько захотите.

1 голос
/ 30 июля 2010

См.

В: Как я могу написать функцию, которая принимает переменное число аргументов и передает их другой функции (которая принимает переменное количество аргументов)?

A:В общем, вы не можете.В идеале вы должны предоставить версию этой другой функции, которая принимает указатель va_list.

Предположим, вы хотите написать функцию faterror, которая будет печатать фатальное сообщение об ошибке, а затем завершиться.Возможно, вы захотите написать это в терминах функции ошибок в вопросе 15.5:

    void faterror(const char *fmt, ...)
    {
        error(fmt, what goes here? );
        exit(EXIT_FAILURE);
    }

, но не совсем понятно, как передать аргументы faterror ошибочно.

<snip>

Читайте на

http://c -faq.com / varargs / handoff.html

1 голос
/ 30 июля 2010

Используйте std :: vector <> или симулированный контейнер, который может содержать произвольное количество записей.

struct {
  std::string commandName;
  sender_t senderId;
  std::vector<arg_t> arguments;
};

Редактировать: о, вы не можете использовать std :: vector. В этом случае: используйте массив и сохраните длину:

struct {
  const char* commandName;
  sender_t senderId;
  int argumentCount;
  int maxArgumentCount; // you might not need this
  arg_t* arguments; // pointer to array of (at least) argumentCount elements.
};

Используйте malloc () или new () для создания массива для arguments.

Я бы предложил обернуть argumentsCount, maxArgumentCount и arguments в отдельный класс, который также может обрабатывать malloc / new и free / delete. Это облегчит предотвращение утечек памяти.

В конце концов, вы напишите свой собственный класс vector_of_arg_t, так что, возможно, взгляните на некоторую базовую векторную реализацию. В Интернете должны быть учебники по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...