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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> map::find map set iterator not dereferencable 
:(
    Опции темы
Jade
Дата 10.2.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.10.2006
Где: Киев

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



Добрый вечер.
Возникла проблема с поиском данных в std::map.

Тип в хедере сдк:
typedef unsigned char  prUInt8;


Объявил в своем хедере:
std::map <char*, prUInt8> mExpoCompMap;


В конструкторе формы написал для проверки:
mExpoCompMap["+2"] = 0x08;

Потом в теле самой функции, имею переменную tmp, которую читаю из текстового файла
fgets(current, 128, current_file);
char* tmp = strchr(current, '=') +1;
tmp[strlen(tmp)-1] = '\0' //т.к. в конце его читается и символ конца строки в блокноте

После таких махинаций, при строке в файле xxx=+2, в tmp сохраняется "+2", это проверено трассировкой.
Но, тогда следующая строка:
uExpoComp = mExpoCompMap.find(tmp)->second;

вылетает с ошибкой map set iterator not dereferencable.

Примечательно, что если писать прямо:
uExpoComp = mExpoCompMap.find("+2")->second;
то в переменную uExpoComp заносится заветная восьмерка.

Подскажите пожалуйста, в чем проблема, и как ее исправить.
Заранее спасибо.

PM MAIL ICQ   Вверх
mes
Дата 10.2.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Jade @  10.2.2009,  19:20 Найти цитируемый пост)
std::map <char*, prUInt8>..

а что сравниваться то будет при сравнении ключей ? содержимое строки или значение указателя ?  smile

Цитата(Jade @  10.2.2009,  19:20 Найти цитируемый пост)
Подскажите пожалуйста, в чем проблема, и как ее исправить.

думаю, что  первой подсказки хватило или ?  smile  

Это сообщение отредактировал(а) mes - 10.2.2009, 20:37


--------------------
PM MAIL WWW   Вверх
Jade
Дата 11.2.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.10.2006
Где: Киев

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



Спасибо, подсказки-то хватило.
Таки да, сравниваются указатели а не содержимое строк.

Я попробовал сделать так:

std::map<std::string, prUInt8> mExpoCompMap;
mExpoCompMap["+2"] = 0x08;

А когда уже читаем:

char* tmp = strchr(current, "=") +1;
std::string temp;
temp.assign(tmp,128);
uExpoComp = mExpoCompMap.find(temp)->second;

Но ошибка получается такая же.
Видимо, строка temp не задается явно при assign.
Тогда нужно либо переписать содержимое из char* в std::string, либо отказаться от использования char*, но тогда я не знаю как вырезать из строки вида "xxx=10" строку вида "10".

Я скорее всего задаю смешные и глупые вопросы =)
На с++ пришлось писать не так давно, и пока приёмов всех не знаю.
Спасибо за помощь, если поможете =)
Если нет, буду рад если скажете где почитать про работу со строками.
PM MAIL ICQ   Вверх
Torsten
Дата 11.2.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 10.6.2008
Где: Pskov

Репутация: 3
Всего: 7



Код

#include <string>
#include <iostream>
#include <map>
int main()
{
    std::map<std::string, int> mExpoCompMap;
    mExpoCompMap["+2"] = 0x08;
    char * current="sgds=+2";
    std::string temp(current);
    int nPos = temp.find('=');
    if (nPos == std::string::npos)
        return 0;
    temp = temp.substr(nPos+1);
    int n = mExpoCompMap.find(temp)->second;
    std::cout<<n<<"\n";
    return 0;
}

все работает.

Это сообщение отредактировал(а) Torsten - 11.2.2009, 18:01
--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
Jade
Дата 11.2.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.10.2006
Где: Киев

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



Спасибо, разобрался.
Оказалось, что помимо всего прочего, проблема была еще и в строчках:

if (temp.at(temp.length()-1) == '\n')
    temp.at(temp.length()-1) = '\0';

Этими строчками я заменял символ перевода на новую строку (отображается квадратиком) на символ конца строки.
Думал, что строка "+2" и "+2\0" это одно и тоже, т.к. в вотчах при трассировке обе отображаются как "+2".
Ан нет.
Спасибо за функцию substr, она мне как раз и нужна. Теперь я просто вырезаю, ничего не заменяя, и все работает.
Было бы 100 постов, добавил бы "+" smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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