Russian Qt Forum
Ноябрь 23, 2024, 22:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: std::vector еще один вопрос  (Прочитано 10699 раз)
Ovoshlook
Гость
« : Май 25, 2011, 09:33 »

Здравствуйте. есть вопрос. В программе у меня имеется несколько векторов. До этого я с ними особо не работал но необходимость заставила.
Проблема заключается в следующем:
Векторы определяются как нулевые глобальные переменные. В одной из функция определяется их размер:
Код:
void OTS_MainWindow::AddTabForQuestion(QTabWidget *TabWidget)

{
    MainTabWidget       =new QWidget;
    MainTabVBoxLayout   =new QVBoxLayout;


    GlobalVaribles::NumberOfTab++;
    
    GlobalVaribles::SummOfTabAndTypeOfQuestionForCurrentTab.resize(GlobalVaribles::NumberOfTab);
    GlobalVaribles::NumberOfQuestionsCurrentTab.resize(GlobalVaribles::NumberOfTab);

    QString NumberOfTabForTabWidget=QString::number(GlobalVaribles::NumberOfTab);
    TabWidget->addTab(MainTabWidget,NumberOfTabForTabWidget);
    TabWidget->setCurrentWidget(MainTabWidget);
    TabWidget->currentWidget()->setLayout(MainTabVBoxLayout);

}

В следующей функции мне нужно записать значение в один из элементов вектора:
Код:
void OTS_MainWindow::AddVariantForSingleAnsverQuestion(QTabWidget *TabWidget)

{
   AnsverRadioButton= new QRadioButton;
   TextForAnsverContainer= new QTextEdit;
   RadioOrCheckButtonAndAnsverHBoxLayout=new QHBoxLayout;
   QVBoxLayout *Layout=static_cast<QVBoxLayout*>(TabWidget->currentWidget()->layout()->layout()->itemAt(1));

   GlobalVaribles::NumberOfQuestionsCurrentTab[TabWidget->currentIndex()]++;

   Layout->addLayout(RadioOrCheckButtonAndAnsverHBoxLayout);
   RadioOrCheckButtonAndAnsverHBoxLayout->addWidget(AnsverRadioButton,1);
   RadioOrCheckButtonAndAnsverHBoxLayout ->addWidget(TextForAnsverContainer,5);
}


собственно при выполнении последней функии программа завершается с кодом 0 но при этом закрывается крахом. Учитывая что при удалении операции увеличения элемента вектора она работает нормально я делаю вывод, что что то я с вектором неправильно делаю.

Прошу помощи, так как не совсем пойму, что и как у меня неправильно делается.
Заранее спасибо всем кто откликнулся.
« Последнее редактирование: Май 30, 2011, 09:17 от Ovoshlook » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Май 25, 2011, 10:06 »

если у тебя элементы всегда записываются в конец вектора, то вместо resize() и operator[] лучше использовать push_back() (это так, на всякий случай)

может у тебя там банальный выход за границы массива? что дебаг говорит?

з.ы. а почему не QList? Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Май 25, 2011, 10:12 »

з.ы. а почему не QList? Улыбающийся
Тогда уж лучше QVector советуй.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 25, 2011, 10:36 »

з.ы. а почему не QList? Улыбающийся
Тогда уж лучше QVector советуй.
Имхо, в данном случае абсолютно разницы нет Улыбающийся

Цитата: cpp author=Ovoshlook
GlobalVaribles::GlobalVaribles::NumberOfQuestionsCurrentTab.resize(GlobalVaribles::NumberOfTab);
GlobalVaribles::NumberOfQuestionsCurrentTab[TabWidget->currentIndex()]++;
А ты случаем не разные вектора используешь?
И, имхо, очень трудно читабельный и перегруженный код, особенно члены класса с большой буквы.
Записан

Qt 5.11/4.8.7 (X11/Win)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Май 25, 2011, 11:05 »

з.ы. а почему не QList? Улыбающийся
Тогда уж лучше QVector советуй.
Цитата: assisstant
For most purposes, QList is the right class to use. Its index-based API is more convenient than QLinkedList's iterator-based API, and it is usually faster than QVector because of the way it stores its items in memory. It also expands to less code in your executable.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ovoshlook
Гость
« Ответ #5 : Май 25, 2011, 12:09 »

resize я спользую чтобы переопределить размер вектора, чтобы он был равным количесву элементов, которые содержатся на widget (в данном случае количество табов). То есть после переопределения размеров количесво элементов в векторе значение которых равно 0 будет равно количеству табов. Далее на таб кладутся определенные элементы. Мне нужно подсчитать их количество, поэтому вместе с каждым положенным элементом я увеличиваю значение нужного мне элемента вектора на единицу. Вот примерно такая логика.
Записан
Ovoshlook
Гость
« Ответ #6 : Май 25, 2011, 12:10 »



может у тебя там банальный выход за границы массива? что дебаг говорит?

з.ы. а почему не QList? Улыбающийся

Да вроде бы вектор мне подходит по своему описанию и по своим методам...

Дебаг вот что сказал:
Приложение остановлено, так как оно получило сигнал от операционной системы.

Сигнал:
SIGSEGV
Назначение:
Segmentation fault

GreatSnake
Не. Не разные. просто опечатался здесь. Это один вектор.

З.Ы. Еще вот чего надоумалось:
http://www.exdll.ru/stl-vektory/
Обращаться к элементам вектора можно по индексам. Значения индекса начинаются с нуля. Например, присвоить значение четвертому элементу объявленного выше вектора можно следующим образом:
Ints[3] = 15;
 Если первоначально зарезервированная память для элементов вектора исчерпана, число элементов вектора будет автоматически увеличено.

То есть получается что даже если моего элемента не сущесвовало то вектор увеличит память и создаст этот элемент. То есть выхода за пределы массива быть не должно. Поправьте если я не прав.
« Последнее редактирование: Май 25, 2011, 14:15 от Ovoshlook » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Май 25, 2011, 14:27 »

а в трейсе что? в каком конкретно месте падает?

может у тебя в QTabWidget изначально уже есть один таб? тогда будет выход за границы вектора.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ovoshlook
Гость
« Ответ #8 : Май 25, 2011, 14:29 »

а в трейсе что? в каком конкретно месте падает?

может у тебя в QTabWidget изначально уже есть один таб? тогда будет выход за границы вектора.
В том то и дело что в трейсе падает именно на GlobalVaribles::NumberOfQuestionsCurrentTab[TabWidget->currentIndex()]++;
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Май 25, 2011, 14:29 »

То есть получается что даже если моего элемента не сущесвовало то вектор увеличит память и создаст этот элемент. То есть выхода за пределы массива быть не должно. Поправьте если я не прав.
Нет, это тебе не джава.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Май 25, 2011, 14:30 »

Ovoshlook, сделай вывод:
qDebug () << GlobalVaribles::NumberOfQuestionsCurrentTab.size () << TabWidget->currentIndex();
Перед этой строчкой.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Май 25, 2011, 14:42 »

и кстати правильно не Ansver, а Answer
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ovoshlook
Гость
« Ответ #12 : Май 25, 2011, 14:44 »

По поводу джавы не на туда посмотрел. прошу прощения. Ну по поводу ansver- это моя безграмотность по английскому)
Добавил сточку. Действительно вектор нулевого размера( БУду смотреть .Спасибо за наводку. и за qDebug.

вопрос по qDebug(). Если не сложно отетьте пожалуйста. В одной функции он у меня выводит значение а в другой:
 qDebug()<< GlobalVaribles::NumberOfQuestionsCurrentTab.size()<<GlobalVaribles::NumberOfTab;

почему то ничего показывать не хочет. Может чего не так написал?
« Последнее редактирование: Май 25, 2011, 15:28 от Ovoshlook » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Май 25, 2011, 15:31 »

В консоль ничего не выводит? Сразу за этой строчкой падения не происходит? Вообще, попадает ли на эту строчку?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Ovoshlook
Гость
« Ответ #14 : Май 25, 2011, 15:58 »

Та стока которую вы привели работает нормально. по ней видно что размер вектора нулевой, и я пытаюсь обратиться к несуществующему элементу. поэтому программа и падает.
А по вопросу той строчки что я выписал (там последняя переменная для вывода в дебаг изменена), то эта строчка ничего в консоль не выводит к сожалению.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.