Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Как исправить ошибки в программном коде
Закрытая тема
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
atomsk atomsk вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2004
По умолчанию Как исправить ошибки в программном коде - 11.06.2005, 05:10

Всем привет!

Сегодня потратил целый день и 2 бутылки пива на вылавливание глюка.
Поймал его, но совсем не понимаю в чем причина.

Значит так. перебираю вектор(весь лишний код удалил, оставил только глюк). В конец вектора забивается объект(с конструктором по умолчанию). В момент, когда емкость вектора равна его размеру... при добавлении очередного элемента - весь вектор херится(в нем остается только бред)

Не знаю точно в чем проблема, но проблема в условии(двойное условие - смотрите код), если оставить условие или любую из двух частей условия - глюк.
если сделать тупое условие (if 1==1), то все нормально, вектор растет и при достижении предела емкости увеличивает ее... пока не переберет вктор.

код:

Код:
vector<treeitem>::iterator iter0    = vec.begin();
vector<treeitem>::iterator iter_end = vec.end();
                
int count = 0;

/* перебрать весь вектор */
for (iter0  = vec.begin();
         iter0 != iter_end; 
         ++iter0 )
{
        treeitem item  = *iter0;
        //iter_tmp = iter0-1;

        HTREEITEM hndl = item.get_handle();
        char     *cap  = item.get_caption();
        HKEY      key  = item.get_key();
        char     *path = item.get_regpath();

        if((key == HKEY_LOCAL_MACHINE) && (cap[0] == '.')) // здесь глюк, если заменить условие на if(1==1) то все ок, если же оставить любое из двух то глюк
        {

                                treeitem tmpitem;
                                //currentitem.setitem(au_sfg_handle, current, 0, defvalue, HKEY_LOCAL_MACHINE, path);
                                
                                vec.push_back(tmpitem);
                                
                                
                                /* это фигня для вывода в консольное окно */
                                /*
                                count ++;
                                char buffer[20];
                                _itoa(count, buffer, 10);

                                char buf0[65];
                                char buf1[65];
                                long s = vec.size();
                                long c = vec.capacity();

                                _itoa(s, buf0, 10);
                                _itoa(c, buf1, 10);

                                char *caret = "n";
                                console1.Write(buffer,   strlen(buffer));
                                console1.Write(" ",      1);
                                console1.Write("(",      1);
                                console1.Write(buf0,     strlen(buf0));
                                console1.Write("/",      1);
                                console1.Write(buf1,     strlen(buf1));
                                console1.Write(")",      1);
                                console1.Write(" ",      1);

                                char buf[2];
                                console1.Read(buf, 2);
                                */
                                
                //RegCloseKey(key);
        }
}
Пожалуйста помогите кто может!!!
  (#2 (permalink)) Старый
atomsk atomsk вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2004
По умолчанию 11.06.2005, 07:25

Вдобавок:

вот этот код глючит:
Код:
if(key == HKEY_LOCAL_MACHINE)
{
    treeitem tmpitem;
    vec.push_back(tmpitem);
}
else
{
    treeitem tmpitem;
    vec.push_back(tmpitem);
}
а этот нет!
Код:
if(key == HKEY_LOCAL_MACHINE)
{}
    treeitem tmpitem;
    vec.push_back(tmpitem);
  (#3 (permalink)) Старый
atomsk atomsk вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2004
По умолчанию 11.06.2005, 08:11

Кажеться начинаю въезжать.
Похоже в момент ресайза старые итераторы уже указывают на фуфло.
  (#4 (permalink)) Старый
atomsk atomsk вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2004
По умолчанию 11.06.2005, 08:46

гы-гы... кажецца нашол!!!!
http://www.hardforum.ru/t50467

ps плохо работать ночью в одиночестве, никто не подскажет
  (#5 (permalink)) Старый
Кошмар Кошмар вне форума
Member
 
Сообщений: 2,694
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.04.2005
По умолчанию 11.06.2005, 18:44

Вот видишь как полезно самому с собой разговаривать.


импортирован с progz.ru
Ads.
  (#6 (permalink)) Старый
dronni dronni вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.04.2005
По умолчанию 11.06.2005, 20:05

atomsk каждый раз когда ты заходиш в блок условия происходит создание новой автоматической переменной treeitem tmpitem;. После выхода из блока она уничтожается.
Тебе нужно что то подобное:
Код:
if(key == HKEY_LOCAL_MACHINE) 
{ 
   vec.push_back(*(new treeitem)); 
} 
else 
{ 
   vec.push_back(*(new treeitem)); 
}
  (#7 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 11.06.2005, 20:49

dronni, мне кажется, ты не совсем прав.
Насколько я помню, при добавлении элемента вызовется его копирующий конструктор. Так что твой код будет приводить к ликам.
atomsk, коварный вопрос: а ты определил правильный копирующий конструктор для treeitem? Копирующий конструктор по умолчанию не копирует строки char*, он просто копирует сами указатели.
  (#8 (permalink)) Старый
dronni dronni вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.04.2005
По умолчанию 12.06.2005, 01:59

Garik, странно но ты прав! Но тогда зачем в функции push_back(const T & __x); объект передается по ссылке?
  (#9 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 12.06.2005, 02:02

Цитата:
Originally posted by dronni
[b]Garik, странно но ты прав! Но тогда зачем в функции push_back(const T & __x); объект передается по ссылке?
По указателю передавать не совсем удобно для пользователя, а по значению - большая нагрузка на стек.
  (#10 (permalink)) Старый
atomsk atomsk вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2004
По умолчанию 13.06.2005, 05:57

Цитата:
Originally posted by Garik
[b]atomsk, коварный вопрос: а ты определил правильный копирующий конструктор для treeitem? Копирующий конструктор по умолчанию не копирует строки char*, он просто копирует сами указатели.
Вопрос коварный. Я его вообще не определил. Когда были глюки, я думал что проблема где-то здесь. По идее для элемента конейнера должны соблюдаться 3 условия: конструктор по умолчанию, операция сравнения, и операция меньше.

Я выполнил только первое, имеет ли смысл определять остальные?
Подскажи если не лень что может быть неправильно в моем классе.

Код:
class treeitem
{
public:
    treeitem()
        : h_parent (0), 
          h_item   (0),
          h_icon   (0),
          caption  (0),
          hkey     (0),
          regpath  (0)
    {}
    treeitem(HTREEITEM  h_p,
             HTREEITEM  h_it,
             HICON      h_ic,
             char      *cap,
             HKEY       hk,
             char      *reg)
    {
        h_parent = h_p;
        h_item   = h_it;
        h_icon   = h_ic;
        strcpy(caption, cap);
        hkey     = hk;
        strcpy(regpath, reg);
    }
    //bool operator == ( const vector & a)
    //{
    
    //}

    //treeitem ( const treeitem & )
    //{}

    setitem(HTREEITEM  h_p, 
            HTREEITEM  h_it,
            HICON      h_ic,
            char      *cap,
            HKEY       hk,
            char      *reg)
    {
        h_parent = h_p;
        h_item   = h_it;
        h_icon   = h_ic;
        caption  = cap;
        hkey     = hk;
        regpath  = reg;
    }

    HTREEITEM   get_handle()  { return h_item; }
    char      * get_caption() { return caption; }
    HKEY        get_key()     { return hkey; }
    char      * get_regpath() { return regpath; }

    void        set_icon(HICON icon) { h_icon = icon; };
    

private:
    HTREEITEM   h_parent;           // хэндл родителя, если - 0, то значит элемнет рутовый      
    HTREEITEM   h_item;             // хэндл элемента
    HICON       h_icon;             // ассоциированная картинка
    char       *caption;            // название элемента
    HKEY        hkey;               // ключ реестра
    char       *regpath;            // путь в реестре ассоциированный с этим элементом
};
  (#11 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 13.06.2005, 17:02

Чего-то я одного не понял...
А где ты выделяешь память под
Код:
char       *caption;            // название элемента
char       *regpath;            // путь в реестре ассоциированный с этим
???
  (#12 (permalink)) Старый
atomsk atomsk вне форума
Member
 
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2004
По умолчанию 14.06.2005, 04:38

Уже выделяю , разобрался сам, спасибо.
Ads
Закрытая тема

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти ошибки в программном коде NotFound Assembler 0 03.04.2011 11:57
Как исправить ошибки в программном коде Julia220992 Visual Basic 1 30.04.2010 22:09
Как исправить ошибки в программном коде imported_Witcher Lisp 1 06.06.2009 14:54
Исправление ошибки в программном коде berserker Вопросы начинающих программистов 1 11.01.2009 14:01
Как устранить ошибки в программном коде Наташа85 Java 2 04.12.2008 14:17
Как исправить ошибку в программном коде berserker Delphi 2 10.08.2007 15:19
Как исправить ошибки в программном коде _sg Lisp 0 29.07.2007 10:24
Как исправить ошибку в программном коде fikys Delphi 7 07.06.2007 15:28
Как исправить ошибку в программном коде costa WinAPI 1 21.02.2007 22:12
Как исправить ошибки в программном коде MoonChild WinAPI 19 03.08.2005 19:17
Как найти ошибки в программном коде Regbist Assembler 6 04.05.2005 10:52
Как исправить ошибки в программном коде Belldandy Assembler 4 05.06.2003 07:09



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов