Поиск:

Ответ в темуСоздание новой темы Создание опроса
> stl::map, метод size() 
V
    Опции темы
elterrible
Дата 17.8.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть проблема с stl::map, со следующими переменными:
map<CString,int> typesMap;
int total;

Выполняется такой код:
typesMap["JPEG"]=IDC_CHECK_JPEG;
typesMap["PNG"]=IDC_CHECK_PNG;
typesMap["GIF"]=IDC_CHECK_GIF;

total = typesMap.size();

После этого шага смотрю в дебаггере total - там лежит что-то семизначное.
Скажите, где я облажался ?


PM MAIL   Вверх
smoke_man
Дата 17.8.2009, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



size() возвращает количество элементов в контейнере.
Этот код отработал корректно в переменной total было значение 3
Код

    std::map<CString,int> typesMap;
    int total;

    typesMap[_T("JPEG"])=0;
    typesMap[_T("PNG")]=1;
    typesMap[_T("GIF")]=2;

    total = typesMap.size();



--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
Fazil6
Дата 18.8.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(elterrible @  17.8.2009,  23:10 Найти цитируемый пост)
Скажите, где я облажался ?

если ты больше нигде не используешь total, то видимо оптимизатор просто нестал выполнять 
Код

total = typesMap.size();

и total на самом деле осталась неинициализированной.
PM MAIL   Вверх
Rapalex
Дата 18.8.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Fazil6, в дебаге оптимизация обычно выключена!
elterrible, если код работает корректно то все ок.
Но использования map для 3-х элементов, по крайней мере не адекватно  smile 


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
elterrible
Дата 18.8.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо за ответы.
Мап действительно в порядке, непонятным осталось следующее:
1) в каких ситуациях дебаггер может писать подобную лажу в value ?
2) есть ли способ заставить его отображать корректные значения ?
PM MAIL   Вверх
Fazil6
Дата 18.8.2009, 13:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Rapalex @  18.8.2009,  11:56 Найти цитируемый пост)
Fazil6, в дебаге оптимизация обычно выключена!

шо Вы говорите... А помидоры обычно красные. А зимой обычно снег.
Цитата(elterrible @  18.8.2009,  12:40 Найти цитируемый пост)
1) в каких ситуациях дебаггер может писать подобную лажу в value ?

дебагер пишет то, что он видит.

Цитата(elterrible @  18.8.2009,  12:40 Найти цитируемый пост)
2) есть ли способ заставить его отображать корректные значения ? 

попробуй так
Код

map<CString,int> typesMap;
int total;


typesMap["JPEG"]=IDC_CHECK_JPEG;
typesMap["PNG"]=IDC_CHECK_PNG;
typesMap["GIF"]=IDC_CHECK_GIF;

total = typesMap.size();
total;


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


Новичок



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

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



Fazil6, не помогает. 
Непонятен принцип, переменная не инициализируется из-за того что не используется ?
PM MAIL   Вверх
Rapalex
Дата 19.8.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Fazil6, ты приколист, думешь поледняя строчка total; избежит оптимизатора и решит все проблеммы smile 

elterrible, ты проект как релиз или как дебаг собираешь?


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Peter
Дата 19.8.2009, 11:17 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Слишком мало кода приведено. Могу его дополнить так, чтобы в total сидело значение миллион.
Код
int total = 1000000;
{
    int total;
    std::map<CString, int> typesMap;
    typesMap["JPEG"]=IDC_CHECK_JPEG;
    typesMap["PNG"]=IDC_CHECK_PNG;
    typesMap["GIF"]=IDC_CHECK_GIF;
    total = typesMap.size();
}
printf("%i", total);

Внутреннему total будет присвоено значение 3, но сразу после выполнения этой команды дебаггер перепрыгнет на строку с printf(). Там внутренний total уже окажется уничтоженным, а виден будет только внешний.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Fazil6
Дата 19.8.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Rapalex @  19.8.2009,  11:07 Найти цитируемый пост)
Fazil6, ты приколист, думешь поледняя строчка total; избежит оптимизатора и решит все проблеммы 

а почему ты думаешь, что не решит? Ты думаешь я никогда с оптимизатором дела не имел и не понимаю что пишу?
PM MAIL   Вверх
azesmcar
Дата 19.8.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(elterrible @  18.8.2009,  20:21 Найти цитируемый пост)
Непонятен принцип, переменная не инициализируется из-за того что не используется ? 

Да запросто, если ее значение не нужно, то кому нафиг нужна эта переменная, оптимизатор может вообще и переменную убрать. 
Сделай вывод переменной в консоль или файл - результат должен измениться.

Цитата(Rapalex @  19.8.2009,  11:07 Найти цитируемый пост)
Fazil6, ты приколист, думешь поледняя строчка total; избежит оптимизатора и решит все проблеммы smile 

вполне может и решить, но давать гарантии я бы на это не стал. Все таки по поводу оптимизаторов никаких гарантий нет, у разных компиляторов он работает по разному.


Это сообщение отредактировал(а) azesmcar - 19.8.2009, 11:57
PM   Вверх
elterrible
Дата 19.8.2009, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Rapalex, как релиз. Это отражается на чем то ?


azesmcar, добавил printf("%i", total); - ничего не изменилось. Теряюсь что еще попробовать ? 
PM MAIL   Вверх
azesmcar
Дата 20.8.2009, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



elterrible

В каком смысле не изменилось? printf выводит семизначное число? Что-то мне не верится..покажи ка весь код.

Добавлено через 2 минуты и 13 секунд
Да..и еще, поскольку это Visual Studio сделай полный ребилд проекта..есть такая бага в студии.
PM   Вверх
Rapalex
Дата 20.8.2009, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



elterrible, ты тоже приколист.  smile 
Когда проект полностью отлажен и готов к передаче клиенту он собирается как релиз.
А когда отлаживаеш проект нужно собирать в дебаге, это какбы из названия понятно  smile 
Разница между дебагом и релизом обсуждалась очень, очень, очень много рас!!! Можешь по форуму поискать, почитать.
А в данном простом случае с одной переменной в релизе, вышло следующее: Ты отладчике смотришь и видишь в её значении мусор, а если ты её выведешь в консоль то увидишь её реальное значение.
Это потому что в релизе НЕТ отладочной информации, а также включена оптимизация!

Это ко всем: ветка форума называется "Visual C++/MFC/WTL" следовательно тут рассматривается единственный компилятор от микрософта.

И на последок, у меня VS2008+SP1 и этот код не компилится  smile 


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Fazil6
Дата 20.8.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Rapalex @  20.8.2009,  10:53 Найти цитируемый пост)
Это потому что в релизе НЕТ отладочной информации, а также включена оптимизация!

прям как солнце из-за туч.... 
Только, возможно, для тебя будет сюрпризом, что релиз вполне можно собирать с отладочной информацией smile , а без нее вообще невозможно увидеть какое-либо значение переменной, будь то мусор или правильное, т.к. дебагер вообще не сможет по коду идти. smile 

Цитата(Rapalex @  20.8.2009,  10:53 Найти цитируемый пост)
И на последок, у меня VS2008+SP1 и этот код не компилится 

6 строк кода собрать не можешь и хвастаешься? 
PM MAIL   Вверх
Rapalex
Дата 20.8.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Цитата(Fazil6 @  20.8.2009,  13:44 Найти цитируемый пост)
6 строк кода собрать не можешь и хвастаешься? 

Не у меня не получается, а компилятор не может шаблон сгенерить.
А ты сам та собрал?

Цитата(Fazil6 @  20.8.2009,  13:44 Найти цитируемый пост)
Только, возможно, для тебя будет сюрпризом, что релиз вполне можно собирать с отладочной информацией 

Нет для меня это не будет сюрпризом, я релизы именно так и собираю.
Я говорю о ситуации рядового пользователя которая складывается "по умолчанию", а ты такой шибко умный, на всё свои неуместные если вставляешь, на кого-то впечатление хочешь произвести? Мало ли как что можно накрутить в настройках, там можно и дебаг с релизом поменять местами, и что? будеш всем доказывать что ты в релизе отлаживаешь?

Тут человек не знает разницы между бебагом и релизом, сомневаюсь что он будет настройки наугад ставить.

Добавлено через 3 минуты и 30 секунд
elterrible, я уже говорил, и поэтому повторюсь, для 3-х элементов не целесообразно создавать ассоциативный массив, со сложной структурой. Поставь 3 оператора if и всего та.


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Fazil6
Дата 20.8.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Rapalex @  20.8.2009,  14:15 Найти цитируемый пост)
Я говорю о ситуации рядового пользователя которая складывается "по умолчанию", а ты такой шибко умный, на всё свои неуместные если вставляешь, на кого-то впечатление хочешь произвести?

Я что-то не понял... Твои, значит, уместные, а я у тебя модерировать свои посты должен? Насколько я помню именно ты меня поправлять начал. Потвоему, все что не совпадает с твоей ТЗ тут неуместно?
Цитата

шибко умный
 это ты меня так презрительно охарактеризовал? Мне, видимо, должно быть очень стыдно, что окружающие обо мне такого мнения...

Цитата(Rapalex @  20.8.2009,  14:15 Найти цитируемый пост)
Мало ли как что можно накрутить в настройках, там можно и дебаг с релизом поменять местами, и что? будеш всем доказывать что ты в релизе отлаживаешь?

Тут человек не знает разницы между бебагом и релизом, сомневаюсь что он будет настройки наугад ставить.

ну так "по умолчанию" как раз отладочная информация есть в релизе. 

Удачи.


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


Новичок



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

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



azesmcar, совсем тупой вопрос, где можно посмотреть вывод этого printf ? Приложение то визуальное.
Я имел в виду только что в дебаггере показания не изменились.


Rapalex, переключил обратно в дебаг моду, вылетают "debug assertion failed", пока разбираюсь.
Насчет использования мапа - мягко говоря спорное утверждение. Какие аргументы ?  
PM MAIL   Вверх
azesmcar
Дата 20.8.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(elterrible @  20.8.2009,  20:51 Найти цитируемый пост)
azesmcar, совсем тупой вопрос, где можно посмотреть вывод этого printf ? Приложение то визуальное.
Я имел в виду только что в дебаггере показания не изменились.

хм. я думал консоль..ну тогда MessageBox покажи, либо в файл выведи, но вобщем-то хотелось бы сперва посмотреть на весь код, еще, попытайся локализировать проблему. Выдели неработающую часть в отдельный проект, так легче будет разобраться. Ну и тут покажи.
PM   Вверх
elterrible
Дата 20.8.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



azesmcar, в мессадж боксе все в порядке (т.е. "3"). Так что тут наверно нечего уже локализовывать, код видимо выполняется правильно, непонятно почему в дебаггере такие значения. Избавлюсь от assertion failed - попробую в дебаг моде. 
PM MAIL   Вверх
Earnest
Дата 21.8.2009, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



elterrible, тебе правильно сказали, что в релизе бесполезнго смотреть переменные в "отладчике" - там в 50% или больше ерунда. 
Вывод в отладочную консоль (output) можно сделать с помощью TRACE в дебаге или OutputDebugString в релизе. Но скорее всего, в дебаге значения переменных станут нормальными.
Так что разбирайся с ассертом (ктати, он ведь сам тебе показывает, где проблема).

Fazil6, 
Rapalex, 
кончайте склоку. Как две бабки, ей богу.


--------------------
...
PM   Вверх
azesmcar
Дата 21.8.2009, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Earnest @  21.8.2009,  07:05 Найти цитируемый пост)

Fazil6, 
azesmcar, 
кончайте склоку. Как две бабки, ей богу. 

промахнулась? smile 
PM   Вверх
Earnest
Дата 21.8.2009, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



azesmcar, да, извини,замечание относится к Rapalex'у.
Сейчас поправлю.


--------------------
...
PM   Вверх
elterrible
Дата 22.8.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Earnest, как всегда в точку. В дебаг моде все отлично. 

Всем спасибо за ответы.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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