![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Jade |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 заносится заветная восьмерка. Подскажите пожалуйста, в чем проблема, и как ее исправить. Заранее спасибо. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а что сравниваться то будет при сравнении ключей ? содержимое строки или значение указателя ? думаю, что первой подсказки хватило или ? Это сообщение отредактировал(а) mes - 10.2.2009, 20:37 |
|||
|
||||
| Jade |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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". Я скорее всего задаю смешные и глупые вопросы =) На с++ пришлось писать не так давно, и пока приёмов всех не знаю. Спасибо за помощь, если поможете =) Если нет, буду рад если скажете где почитать про работу со строками. |
|||
|
||||
| Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
все работает. Это сообщение отредактировал(а) Torsten - 11.2.2009, 18:01 --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
| Jade |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 18.10.2006 Где: Киев Репутация: нет Всего: нет |
Спасибо, разобрался.
Оказалось, что помимо всего прочего, проблема была еще и в строчках: if (temp.at(temp.length()-1) == '\n') temp.at(temp.length()-1) = '\0'; Этими строчками я заменял символ перевода на новую строку (отображается квадратиком) на символ конца строки. Думал, что строка "+2" и "+2\0" это одно и тоже, т.к. в вотчах при трассировке обе отображаются как "+2". Ан нет. Спасибо за функцию substr, она мне как раз и нужна. Теперь я просто вырезаю, ничего не заменяя, и все работает. Было бы 100 постов, добавил бы "+" |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |