Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
hdnn
11 / 11 / 3
Регистрация: 14.11.2012
Сообщений: 48
Завершенные тесты: 1
#1

Метод push_back заносит некорректные данные в вектор - C++

24.06.2013, 10:36. Просмотров 432. Ответов 9
Метки нет (Все метки)

Есть структура вида:
C++
1
2
3
4
5
6
7
struct PadStyleDef
{
    std::string name;
    std::string padShapeType;
    float shapeWidth;
    float shapeHeight;
};
И есть две переменные типа этой структуры. Одна из них - вектор. В процессе работы я заполняю все поля обычной переменной и через push_back добавляю в вектор - всё как обычно. Но почему-то правильно отрабатывает далеко не всегда.
Например, заполнив структуру, я имею следующие данные в переменной:
C++
1
2
3
4
    name == "(Default)";
    padShapeType == "Ellipse";
    shapeWidth == 60.000000;
    hapeHeight == 60.000000;
А после добавления этой переменной в вектор, элемент оного хранит данные такого вида:
C++
1
2
3
4
    name == "НННН(Default)";
    padShapeType == "ННННEllipse";
    shapeWidth == 2.102e-044#DEN;
    hapeHeight == 60.000000;
На второй и последующих итерациях элементы вектора имеют уже такой вид:
C++
1
2
3
4
    name == <Bad Ptr>;
    padShapeType == <Bad Ptr>;
    shapeWidth == 5.605e-045#DEN;
    hapeHeight == 2.102e-044#DEN;
Что я делаю неправильно?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
bool CPcb::ReadPadViaStyle(std::string srcStr)
{   
    pcre * re = NULL;
    int options = 0;
    const char *error = NULL;
    int erroffset=0;
    std::string pattern = PAD_STYLE_DEF;         
    re = pcre_compile ((char*)pattern.c_str(), options, &error, &erroffset, NULL);      
    if (!re)
        return FALSE;
    else
    {
        PadStyleDef psd;
        int j=0;
        int count=0;
        int k=0;
        int ovector[30];
        const char *psubStrMatchStr;
        
        while((count=pcre_exec(re, NULL, (char *) srcStr.c_str(),strlen(srcStr.c_str()),j,PCRE_NOTEMPTY,ovector,30))>=0)
        {
            pcre_get_substring(srcStr.c_str(),ovector,count,0,&psubStrMatchStr);
            switch(k)
            {
                case 0: psd.name = psubStrMatchStr; break; 
                case 2: psd.padShapeType1 = psubStrMatchStr; break;
                case 3: psd.shapeHeight1 = atof(psubStrMatchStr); break;
                case 4: psd.shapeWidth1 = atof(psubStrMatchStr); break;
                case 6: psd.padShapeType2 = psubStrMatchStr; break;
                case 7: psd.shapeHeight2 = atof(psubStrMatchStr); break;
                case 8: psd.shapeWidth2 = atof(psubStrMatchStr); break;
            }
            pcre_free_substring(psubStrMatchStr);
            j=ovector[1]+1;
            if(k==8) 
            {
                psd.id=m_padStyleDef.size();
                break;
            }
            k++;            
        }
        m_padStyleDef.push_back(psd);    //Злополучная строчка
    }
    return TRUE;    
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2013, 10:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод push_back заносит некорректные данные в вектор (C++):

Немного поясните(вектор, push_back) - C++
Вот вам код, господа #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int main() { vector&lt;int&gt; m; for...

Как через push_back заполнить вектор векторов? - C++
Как через push_back заполнить вектор векторов? просто вектор например так: for(int i=0;i&lt;100;i++) m.push_back(rand()/100);...

Как положить в вектор структур значение через push_back - C++
есть вот такой вектор vector&lt;struct&lt;Point&gt;&gt; в структуре point , есть координата икс. struct Point { double Point_x; ...

Есть вектор пар, как положить туда значение пары через push_back - C++
Есть вот такой вектор vector&lt;vector&lt;pair&lt;int, int&gt;&gt;&gt; number_pair; размер number_pair.size() у меня определен изначально, а вот...

Метод push_back() класса vector - C++
Пишу алгоритм динамического программирования, на каждой итерации в множество векторов возможно добавление вектора из этого же множества, но...

Как ведет себя cin, если пользователь вводит некорректные данные? - C++
Читаю C++ Primer Plus by Stephen Prata. В седьмой главе у него есть следующий пример. // lotto.cpp -- probability of winning ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.06.2013, 11:13 #2
@hdnn, перед вызовом push_back() проверьте что в psd лежит. Так как строку копируете из обычного char*, возможно просто psubStrMatchStr уже кривой в момент записи в psd.name и пр.
0
hdnn
11 / 11 / 3
Регистрация: 14.11.2012
Сообщений: 48
Завершенные тесты: 1
24.06.2013, 11:22  [ТС] #3
@Tulosba, к сожалению, проблема не в этом. Скрин:
0
Миниатюры
Метод push_back заносит некорректные данные в вектор  
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.06.2013, 11:24 #4
вы часом не в Release mode дебажите?
0
hdnn
11 / 11 / 3
Регистрация: 14.11.2012
Сообщений: 48
Завершенные тесты: 1
24.06.2013, 11:27  [ТС] #5
Нет, в Debug
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
24.06.2013, 11:31 #6
@hdnn, конструктор копий и присваивания покажите.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.06.2013, 11:32 #7
@hdnn, так у Вас структуры похоже разные. Где поле id у элемента, который в векторе?
1
hdnn
11 / 11 / 3
Регистрация: 14.11.2012
Сообщений: 48
Завершенные тесты: 1
24.06.2013, 11:42  [ТС] #8
@IGPIGP, какой, простите, конструктор? Код, в котором заполняю структуру и вектор? В шапке под спойлером.
@Tulosba, нет слов... Спасибо. Clean project и Build project решили проблему). Хотя для меня такое поведение остаётся загадкой(переменные ведь одного типа)
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.06.2013, 11:49 #9
Цитата Сообщение от hdnn Посмотреть сообщение
Хотя для меня такое поведение остаётся загадкой(переменные ведь одного типа)
Видимо среда глючит. Не учитывает все зависимости при построении проекта. Я например наблюдал как в Eclipse при изменении только *.h-файлов не пересобираются зависимые от них модули, которые явно не были изменены. В итоге получаем, что в одной программе разные части кода используют по факту разные структуры, несмотря на идентичность типов.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
24.06.2013, 13:23 #10
Цитата Сообщение от hdnn Посмотреть сообщение
В шапке под спойлером.
Извините просмотрел...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2013, 13:23
Привет! Вот еще темы с ответами:

В вектор не записываются данные - C++
в двумерны вектор хочу передать данные из файла, а они не записываются. что я пропустила? vector&lt;vector&lt;double&gt;&gt; data; ...

Вставить данные типа float в вектор - C++
Вставить данные типа float введенные с клавиатуры Если чётный номер - в конец, нечет, - в начало вектора. #include &lt;iostream&gt; ...

Как вызвать метод из указателя на вектор пользовательского типа? - C++
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; struct Client { vector &lt;string&gt; login; vector...

Записать из файлов данные о людях (ф.и.о. , дата рожд) в вектор - C++
Всем халоу, тут такая задачка: надо из двух файлов с разными данными о людях (1 файл - уникальный код, ф.и.о. , дата рожд, номер тел; 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.06.2013, 13:23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru