Использование содержимого членов Struct в векторе - PullRequest
1 голос
/ 24 июля 2011

После превосходного совета я определил структуру, заполнил ее данными, прочитанными из файла, и поместил ее в вектор.Ницца!!!Может ли кто-нибудь сказать мне сейчас, как я могу отозвать содержимое члена i-й структуры, которую я нажал на вектор?

Определение структуры:

struct Config_Data
{
    int Surf_Index;
    std::string Surf_Mnemo;
    double Surf_Param[5];
    std::string Surf_Comm;
};

Создание структурыи определение вектора:

Config_Data SURF;
std::vector<Config_Data> CDATA_SURF;

Для заполнения структуры:

for (i=1;i<=10;i++)
{
    getline(INP_Stream, Line, delim_Config);
    SURF.Surf_Index=atoi(Line.c_str());

    getline(INP_Stream,SURF.Surf_Mnemo,delim_Config);
    SURF.Surf_Param[0]=Mnemo_list[SURF.Surf_Mnemo];
    for (j=1;j<=Mnemo_list[SURF.Surf_Mnemo];j++)
    {
        getline(INP_Stream,Line,delim_Config);
        SURF.Surf_Param[j]=strtod(Line.c_str(),NULL);
    }
    getline(INP_Stream, SURF.Surf_Comm,delim_Line);
    CDATA_SURF.push_back(SURF);
    cout<<CDATA_SURF.size()<<endl;
    string aaa=CDATA_SURF[i].Surf_Comm;
}

Как вы можете видеть, я читаю строки из файла CSV.Я не очень доволен тем, как я конвертирую строки в типах int или double, но, похоже, это работает.

Способ, которым я хотел вызвать i-тую структуру в векторе и его члене Surf_Comm:

std::string aaa=CDATA_SURF[i].Surf_Comm;   

Я скомпилировал без проблем, но во время выполнения я получаю сигналы нарушения сегмента.Будучи новичком, я понятия не имею, что происходит.

Вся помощь очень приветствуется !!!

Заранее спасибо,

С уважением,

Stefan

Ответы [ 3 ]

1 голос
/ 24 июля 2011

Нумерация элементов в std::vector начинается с нулевого значения. Таким образом, если вектор содержит один элемент, индекс этого значения равен 0. В случае двух значений - 0 и 1 и так далее. Не путайте векторный метод size(). Возвращает количество удерживающих элементов.

Таким образом, индекс вновь введенного значения равен size()-1. Доступ к i-му элементу (который не существует) приводит к ошибке.

Этот код должен работать, если вы измените диапазон значений i в цикле на for( i = 0; i < 10; i++ ).

1 голос
/ 14 сентября 2011

Могу только повторить: в этом случае вы возвращаете пустой вектор в цикл for и обращаетесь к данным в том же цикле, используя i, поэтому вы должны изменить его на for(i=0; i<10; i++).

В противном случае вы

  1. Создаете векторный элемент 0 (первый элемент вектора) с данными через push_back
  2. Считывает векторный элемент 1 (второй элемент вектора), который не существует до следующей итерации цикла. О-о, спагетти!
  3. segfault:)
1 голос
/ 24 июля 2011

Каким бы ни было значение i, оно должно быть в std::vector.То есть вы должны положить не менее i + 1 предметов в std::vector.

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