Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > wxWidgets - Ошибка сигментации


Автор: Stajor 19.12.2005, 11:54
Всем доброго времени суток.
Возникла проблема в работе с библиотекой wxWidgets при использовании wxTreeCtrl. Использую MinGwStudio2.05, wxWidgets2.5, ОС- Win2K.
Суть проблемы.
Программа предназначена для редактирования тестов некоторого девайса. В главном окне есть дочерние окна дерева и редактора тестов.
Иерархия дерева:
КОРЕНЬ (название проекта тестов)
ГРУППА (группа тестов, кол-во не ограниченно)
ПАРАГРАФ (параграф тестов, кол-во не ограничено)
...
Создаю дерево, наследуя от wxTreeCtrl, так же создаю структуру, в которой должны хрониться тесты во вложенных векторах(при первоначальном запуске программы в структуру записывается только информация о названии проекта тестов). В структуре для каждой ветви дерева сохраняю wxTreeItemId в соответстующих иерархии векторах, для связи элемента дерева со структурой.
По контекстному меню добавляю в дерево ветвь группы1, с сохранением группы1 в структуре тестов
Код

ts_temp_g->s_Group.id_tree = AppendItem(IdSelect, name, 2); // создание ветви группы1 
m_TS->s_Tests.v_Group.push_back(ts_temp_g->s_Group);    // запись группы1 в вектор структуры тестов    
OnView(ts_temp_p->s_s_Group.Id); // функция выделения добавленной ветви

где:
m_TS - указатель на структуру тестов;
IdSelect - wxTreeItemId корня дерева (запоминается в селекте при вызове контекстного меню);
ts_temp_g->s_Group.id_tree - запись wxTreeItemId во временной структуре создаваемой группы1;
После чего по контекстному меню группы добавляю параграф1 тестов в группу1
Код

if(m_TS->s_Tests.v_Group.size())
            for(int i = 0; i != (int)m_TS->s_Tests.v_Group.size(); i++)
                if(IdSelect == m_TS->s_Tests.v_Group[i].id_tree)
                {    
                    ts_temp_p->s_Paragraph.id_tree = AppendItem(IdSelect, name, 3); // создании ветви параграфа1
                    m_TS->s_Tests.v_Group[i].v_Paragr.push_back(ts_temp_p->s_Paragraph); // запись параграфа1 в вектор структуры тестов    
                    break;
                }
OnView(ts_temp_p->s_Paragraph.Id); // функция выделения добавленной ветви

IdSelect - wxTreeItemId группы1 (запоминается в селекте при вызове контекстного меню);
При добавлении группы1 и последующем добавлении в нее параграфов проблем никаких не возникает, и программа функционирует без каких либо сбоев.
При добавлении группы2 и последующем добавлении в нее параграфа вылетает ошибка сигментации при селекте добавленного параграфа в функции OnView(ts_temp_p->s_Paragraph.Id);
Код

void TreeBrows::OnView(int id_test)
{
    TestStruct::structParagraph* pr; // указатель на структуру параграфа
if((pr = m_TS->s_Tests.GetS_Paragr(id_test)) != NULL) // передача id_test в функцию поиска элемента структуры
        {
            id_item = pr->id_tree;
            this->SetItemText(id_item, pr->TestParagraph); // запись названия параграфа в дереве
            if(!this->IsExpanded(id_item))
            {
                this->Expand(id_item); // раскрытие эл-та дерева, если есть нижние ветви
            }
            if(!this->IsSelected(id_item))
            {    
                wxMessageBox("OnView 1", "", wxOK ); // сообщение проходит
                wxASSERT_MSG(id_item.IsOk(), "Неверный wxTreeItemId! OnView") ; // ошибка не выдается
                
                this->SelectItem(id_item); // выделение параграфа в дереве, ЗДЕСЬ ВЫЛЕТАЕТ ПРОГРАММА
                
                wxMessageBox("OnView 2", "", wxOK ); // сообщение не проходит
            }
        }
}

В функции поиска элемента структуры ошибок не возникает, элемент находится без проблем.
Ошибка, выдаваемая компилятором:
Program has received a signal-name="SIGSEGV",signal-meaning="Segmentation fault" at operator==({name="i1",value="@0x22d4e0"},{name="i2",value="@0x1f21014"}), file C:\Projekts of VGenba\include\wx\treebase.h:77
Эта ошибка возникает почти всегда, но очень редко программа проходит без сбоев.
Над этой проблемой бьюсь уже неделю, и никак не могу найти ее решения. Пробовал использовать в структуре указатель wxTreeItemId*, результат тот же. Так же пробовал использовать wxTreeItemData в структуре и добавлении wxTreeItemData к создаваемым ветвям, ошибка возникает та же.
Если кто сталкивался или знает способ решения подобной ситуации, помогите.

Автор: Kagor 22.12.2005, 02:43
Stajor, извиняюсь, конечно, за оффтоп, но по мойму вы не много разделом ошиблись, судя по этому: ОС- Win2K. Может лучше в общих вопросах это спросить?

Автор: Stajor 22.12.2005, 10:27
Kagor
Согласен что ошибся (затупил с размещением темы), задал Chipset вопрос о перемещении темы в вопросы WinApi\ MFC\.... ответа пока не получил.

Автор: ABATAPA 25.1.2006, 21:55
Цитата(Kagor @ 22.12.2005, 02:43)
Stajor, извиняюсь, конечно, за оффтоп, но по мойму вы не много разделом ошиблись, судя по этому: ОС- Win2K. Может лучше в общих вопросах это спросить?

Извиняюсь и я за offtop ;), но, как новый тут человек, спрошу: почему не здесь? wxWidgets - кроссплатформенная среда, и, по идее, обсуждение использования wxWidgets при создании кроссплатформенных приложений тут - уместно? Я понимаю, что сама проблема, возможно, общего характера, но...

Вопрос не праздный - я пришел сюда для поиска информации о проблемах wxWidgets в общем, и кросс-компиляции программ - в частности.

Автор: Kagor 25.1.2006, 22:32
Цитата(ABATAPA @ 25.1.2006, 22:55 Найти цитируемый пост)
Извиняюсь и я за offtop ;), но, как новый тут человек, спрошу: почему не здесь? wxWidgets - кроссплатформенная среда, и, по идее, обсуждение использования wxWidgets при создании кроссплатформенных приложений тут - уместно?
Уместно, но, на мой взгляд, было бы лучше задавать вопросы при проблемах в разработке кросс платформенных приложений в "Общих вопросах", если конечно проблема не связанна ни посредственно с ОС.
К тому же в данной теме про кросс платформенность не было ни слова. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)