Короче, Господа , проблемма следующая!
имеем следующий код
#include <string>
int main()
{
std::string str("123456789012345"); //15 символов
str.clear(); //работает (смотрим под дебагом значение переменной)
std::string str2("1234567890123456"); //16 символов и больше
str2.clear(); //не работает! оставляет мусор! и к этой str2 ничего нельзя добавить!
return 0;
}
помогло только отключение типов символов (not set) и отключение MinimizeCtrUseInAtl
после этого всё вроде работает...
проверял и на 6й студии — там работает! (вместо clear надо erase(begin(), end()))
23.06.04 20:18: Перенесено модератором из 'C/C++'. PM (5) в Средства разработки — Павел Кузнецов
Здравствуйте, sl2, Вы писали:
sl2>Короче, Господа , проблемма следующая! sl2>имеем следующий код
sl2>#include <string>
sl2>int main() sl2>{ sl2> std::string str("123456789012345"); //15 символов sl2> str.clear(); //работает (смотрим под дебагом значение переменной) sl2> std::string str2("1234567890123456"); //16 символов и больше sl2> str2.clear(); //не работает! оставляет мусор! и к этой str2 ничего нельзя добавить! sl2> return 0; sl2>}
sl2>помогло только отключение типов символов (not set) и отключение MinimizeCtrUseInAtl
sl2>после этого всё вроде работает...
sl2>проверял и на 6й студии — там работает! (вместо clear надо erase(begin(), end()))
А что значит нельзя добавить?
Вот такой вот код работает нормально
извините может не по теме, но все же.
sl2> std::string str("123456789012345"); //15 символов
смотрим значение str — 1...5 sl2> std::string str2("1234567890123456"); //16 символов и больше
смотрим значение str2 — ботва какая то. типа 8:2
Здравствуйте, sl2, Вы писали:
sl2>короче, выводится всё нормально, но, похоже в дебаге не выдаёт нормальные значения для отладки! sl2>а на экран всё правильно....
да на экран выводиться нормально.
Но вот еще ты писал erase( begin(), end() );
std::string str("1234567890123456"); //15 символов
str.erase( str.begin(), str.end() );
Здравствуйте, sl2, Вы писали:
sl2>проверял и на 6й студии — там работает! (вместо clear надо erase(begin(), end()))
По поводу магического числа 16.
В этой реализации для коротких строк используется не динамический буфер на 16 элементов. Все что больше, работает с динамически выделяемым буфером.
Тот мусор, который ты видишь во втором случае, скорее всего содержимое маленького буфера, в то время как clear очистил динамический буфер.
Дальнейшая работа со строкой также идет с динамическим буфером. так что ты просто не туда смотришь.
Здравствуйте, UGN, Вы писали:
UGN>В этой реализации для коротких строк используется не динамический буфер на 16 элементов. Все что больше, работает с динамически выделяемым буфером.
[]
Если ты смотришь это под отладчиком Visual Studio 7.0 (в 7.1, судя по всему, это поправили), не верь ему. Посмотри лучше в окне Watch выражение str.c_str()
Найди файл autoexp.dat (лежит в каталоге $(VSInstallDir)\Common7\Packages\Debugger), и попробуй вместо
> std::string str("123456789012345"); //15 символов
> str.clear(); //работает (смотрим под дебагом значение переменной)
> std::string str2("1234567890123456"); //16 символов и больше
> str2.clear(); //не работает! оставляет мусор! и к этой str2 ничего нельзя добавить!
> return 0;
>
Здраствуйте, ssm, Вы писали:
s> Здравствуйте, PM, Вы писали:
PM>> Найди файл autoexp.dat (лежит в каталоге PM>> $(VSInstallDir)\Common7\Packages\Debugger), и попробуй вместо
s> а нельзя как-то указать метод объекта, результат которого я хочу s> видеть?
Возможно (почти) всё:
; $ADDIN allows external DLLs to be added to display even more complex
; types via the EE Add-in API. The first argument is the DLL name, the
; second argument is the name of the export from the DLL to use. For
; further information on this API see the sample called EEAddIn.
Здравствуйте, zubr, Вы писали:
Z>Здравствуйте, sl2, Вы писали:
sl2>>проверял и на 6й студии — там работает! (вместо clear надо erase(begin(), end()))
Z>почему вот это не работает? или так нельзя? Z>//MS VS 2002 Z>
Z>#include <string>
Z>int main()
Z>{
Z>std::string str("123456789012345"); //15 символов
Z>str.erase( str.begin(), str.end() ); //работает
Z>std::string str2("1234567890123457"); //16 символов и больше
Z>str2.erase( str.begin(), str.end() ); //не работает!
Z>return 0;
Z>}
Z>
Так нельзя, обрати внимание, итераторы какой строки ты передаешь в erase
Здравствуйте, PM, Вы писали:
PM>Здраствуйте, ssm, Вы писали:
s>> Здравствуйте, PM, Вы писали:
PM>>> Найди файл autoexp.dat (лежит в каталоге PM>>> $(VSInstallDir)\Common7\Packages\Debugger), и попробуй вместо
s>> а нельзя как-то указать метод объекта, результат которого я хочу s>> видеть? PM>Возможно (почти) всё: PM>
PM>; $ADDIN allows external DLLs to be added to display even more complex
PM>; types via the EE Add-in API. The first argument is the DLL name, the
PM>; second argument is the name of the export from the DLL to use. For
PM>; further information on this API see the sample called EEAddIn.
Я специально для std::string написал такой Add-in: FeinEvaluatorPro http://www.feinsoftware.com/FeinEvaluator.php
Кроме просто строк (которые нормально отображаются студией 2003), мой Add-in показывает содержимое списков и векторов строк (std::vector<string> и std::list<string>), и много всего другого...