Невозможно сохранить значение в векторной структуре - PullRequest
0 голосов
/ 11 февраля 2019

Так что я пытаюсь сохранить строку в этой структуре:

struct node{
    std::string name;
};

(примерно) делая это:

int main(int argc, char *argv[]) {
    // ... other code ...

    std::vector<char> chars;
    chars.push_back('n');

    std::vector<node> nodes;
    for(int i = 0; i < argc; i++) {
        nodes.push_back(node());
        for(auto ch : chars) {
            switch(ch) {
                 case 'n': {
                     nodes[i].name = argv[i];
                     break;
                 }
             }
         }
     }

     // ... other code ...

     for(auto n : nodes) {
         std::cout << n.name << '\n';
     }
     return 0;
}

Вся программа компилируется и запускается, но безвывод n.name.Кажется, что это только установка значений узлов [i] в ​​пределах его блока переключателей, но я не уверен, почему это так.При отладке и просмотре значений в gdb значения узлов [i] устанавливаются в случае этого блока переключателей, однако, когда я смотрю на весь массив (узлы печати), это показывает, что я не установил поле имени в структуре.Когда я полностью покидаю блок переключателей (на новой итерации цикла) и смотрю на значение этого узла (например, node [0]), я также не вижу установленного там значения имени.

Я не уверен, что я делаю неправильно, я новичок в C ++ (знаком с C), но не было бы смысла использовать argv [i] (который приводится в c ++Строка И объявляется вне области действия коммутатора) или новый узел, который перемещается назад в начале итерации цикла, выходит из области.

Любая помощь будет принята.Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я обнаружил проблему, она заключалась в индексации узлов в моем исходном коде (здесь не показано).

0 голосов
/ 11 февраля 2019

Если это ваш настоящий код, в этом нет ничего плохого:

#include <iostream>
#include <vector>

struct node{
    std::string name;
};

int main(int argc, char *argv[]) {
    // ... other code ...

    std::vector<char> chars;
    chars.push_back('n');

    std::vector<node> nodes;
    for(int i = 0; i < argc; i++) {
        nodes.push_back(node());
        for(auto ch : chars) {
            switch(ch) {
                 case 'n': {
                     nodes[i].name = argv[i];
                     break;
                 }
             }
         }
     }

     // ... other code ...

     for(auto n : nodes) {
         std::cout << n.name << '\n';
     }
     return 0;
}

Когда я скомпилирую и запуском этого, я получу ожидаемый результат:

pax$ ./testprog a b c
./testprog
a
b
c

Поэтому мне нужнопредположим, что это не ваш реальный код, тем более что процесс создания одноэлементного вектора, содержащего 'n', и последующей работы над чем-то другим на основе каждого элемента в этом векторе 'n', скорее всего,эээ ... странно (это настолько дипломатично, насколько я понимаю).

Я бы предложил сократить ваш код до самого маленького, который демонстрирует проблему, и опубликовать ее.Отладка достаточно сложного кода, когда у нас есть исходный код, нет особых причин усложнять его, публикуя другой код: -)


Не видя действительногокод, мы можем все еще внести некоторые предложения о том, как вы можете определить, в чем заключается проблема.

Сначала, когда вы назначаете имя, выведите его, чтобы убедиться, что оно правильно установлено в этой точке (добавьтевторая строка ниже):

nodes[i].name = argv[i];
std::cout << "Added #" << i << " with value '" << nodes[i].name << "'\n";
break;

Во-вторых, убедитесь, что управляющий вектор делает то, что вы ожидаете (добавьте вторую строку ниже).Для каждого аргумента должна быть одна n строка:

for(auto ch : chars) {
    std::cout << "Control ch is '" << ch << "'\n";
    switch(ch) {

В-третьих, проверьте размер вектора перед печатью, он должен быть ненулевым (добавьте первую строку ниже):

std::cout << "Vector size is " << n.size() << "\n";
for(auto n : nodes) {
    std::cout << n.name << '\n';
}

Вы также должны вывести это, когда вы расширяете вектор (добавьте третью строку ниже):

for(int i = 0; i < argc; i++) {
    nodes.push_back(node());
    std::cout << "Vector size on build is " << n.size() << "\n";

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

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