Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работать с указателем, полученным через итератор 
V
    Опции темы
Rickert
Дата 20.7.2007, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Код

struct uTerminal
{
  uTerminal(){}
  ~uTerminal(){}
  aString last_boot;
};
...
vector<uTerminal> terms;
terms.push_back(uTerminal())
...
vector<uTerminal>::iterator ti;

ti = terms.end();

uTerminal* ftt = &(*ti);

ftt->last_boot.set("20.07.07");

Почему segmentation fault на последней строке?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 20.7.2007, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Блин, ну конечно же:
Код

uTerminal tff = *ti;

Только надо будет перегрузить оператор =.

Это сообщение отредактировал(а) Rickert - 20.7.2007, 06:54


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 20.7.2007, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



а разве terms.end() указывает не на следующий после последнего элемент.. Мне кажется лучше так:
Код

if ( ! terms.empty() )
  uTerminal tff = terms.back();


Это сообщение отредактировал(а) Lazin - 20.7.2007, 07:40
PM MAIL Skype GTalk   Вверх
Rickert
Дата 20.7.2007, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Твоя правда!


Это сообщение отредактировал(а) Rickert - 20.7.2007, 08:11


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 20.7.2007, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата

Пример, который я привёл во втором посте проваливается segmentation fault

потому-что vector.end() указывает на следующий после последнего элемент, в STL итератор end() используется обычно в качестве NULL-pointer-a. Если нужен последний элемент, то back() - возвращает ссылку на него, а итератор:
Код

std::vector<uTerminal>::iterator i = terms.end();
--i;
uTerminal* ftt = &(*i);


PM MAIL Skype GTalk   Вверх
Rickert
Дата 20.7.2007, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Хорошо, тогда смотри так:
Код

vector<uTerminal> tff;
vector<uTerminal>::iterator it;
...
for (it = terms.begin(); it != terms.end(); it++)
{
tff = *it;
...
}

Почему в этом случае у меня всегда идёт указание на последний элемент?

Это сообщение отредактировал(а) Rickert - 20.7.2007, 08:24


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 20.7.2007, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



:(

Это сообщение отредактировал(а) Rickert - 20.7.2007, 08:36


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 20.7.2007, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата

Почему в этом случае у меня всегда идёт указание на последний элемент?

Потому что тело цикла исполняется только в том случае, если it != terms.end(), т.е. для it == terms.end() присваивание не выполняется. Подумайте, если вектор пуст, то присваивание не должно выполняться ни разу, так-как в этом случае terms.begin() == terms.end().
PM MAIL Skype GTalk   Вверх
Rickert
Дата 20.7.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Lazin, он не пуст стопудово!
Цитата(Lazin @  20.7.2007,  08:42 Найти цитируемый пост)
Потому что тело цикла исполняется только в том случае, если it != terms.end()

Нет, он выполняется до тех пор пока данное условие - true
У меня ошибка в другом видать была.
Смотри:
Код

У меня есть цикл в котором:
uTerminal* tff;

while(...)
{
  ...
  term.push_back(uTerminal());
  tff = &term.back();
}

term.push_back(uTerminal()) отрабатывает два раза, а при третьей итерации цикла - выдаёт:
Цитата
*** glibc detected *** double free or corruption (fasttop): 0x09abc350 ***


Это сообщение отредактировал(а) Rickert - 20.7.2007, 08:55


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 20.7.2007, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Дело не в том - пуст или нет,
Код

int a = -1; 
for (int i = 0; i !=10; ++i)
{
    a = i;
}
cout << a << endl;

выдаст 9 а не 10. 
А зачем tff = &term.back(); в каждой итерации выполнять? Все итераторы - указатели на элементы вектора могут стать не действительными после добавления нового элемента в контейнер, может в этом дело?
PM MAIL Skype GTalk   Вверх
Rickert
Дата 23.7.2007, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Ладно, короче. Лишний раз убедился, что лучше за 2 минуты напишу свой класс списка, чем буду колупаться с этим stl smile
Всё равно, спасибо!


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Daevaorn
Дата 23.7.2007, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Rickert @  23.7.2007,  07:52 Найти цитируемый пост)
Ладно, короче. Лишний раз убедился, что лучше за 2 минуты напишу свой класс списка, чем буду колупаться с этим stl smile
Всё равно, спасибо! 

удачи и успехов в этом не легком труде - написаниии велосипедов. Разобраться в конструкциях языка и спецификации стандартной библиотки, понятно дело, лень. Бывает.
А Lazin всё по делу говорил.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0881 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.