std::string и Net2003
От: sl2  
Дата: 22.06.04 12:12
Оценка:
Короче, Господа , проблемма следующая!
имеем следующий код

#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) в Средства разработки — Павел Кузнецов
Re: std::string и Net2003
От: Glоbus Украина  
Дата: 22.06.04 12:21
Оценка:
Здравствуйте, 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()))


А что значит нельзя добавить?
Вот такой вот код работает нормально


#include <string>
#include <iostream>

int main()
{
    std::string str("123456789012345");
    str.clear(); 
    std::string str2("1234567890123456"); 
    str2.clear();
    str2 += "ABC"; 
    std::cout << str2 << std::endl;
    return 0;
}
Удачи тебе, браток!
Re: std::string и Net2003
От: sl2  
Дата: 22.06.04 12:21
Оценка:
пока это всё писал, вообще не стало работать (т.е. ничего не помогает)
вот и думаю, что делать???

может я что-то не понимаю в стандартной библиотеке?
Re: std::string и Net2003
От: zubr Россия  
Дата: 22.06.04 12:25
Оценка:
Здравствуйте, sl2, Вы писали:

извините может не по теме, но все же.

sl2> std::string str("123456789012345"); //15 символов

смотрим значение str — 1...5
sl2> std::string str2("1234567890123456"); //16 символов и больше
смотрим значение str2 — ботва какая то. типа 8:2

std::cout выводит нормально...
Re[2]: std::string и Net2003
От: sl2  
Дата: 22.06.04 12:30
Оценка:
короче, выводится всё нормально, но, похоже в дебаге не выдаёт нормальные значения для отладки!
а на экран всё правильно....

не понимаю
Re[3]: std::string и Net2003
От: zubr Россия  
Дата: 22.06.04 12:36
Оценка:
Здравствуйте, sl2, Вы писали:

sl2>короче, выводится всё нормально, но, похоже в дебаге не выдаёт нормальные значения для отладки!

sl2>а на экран всё правильно....

да на экран выводиться нормально.

Но вот еще ты писал erase( begin(), end() );

std::string str("1234567890123456"); //15 символов
str.erase( str.begin(), str.end() );

даёт exception.

//забыл сказать у меня VS2002
Re: std::string и Net2003
От: ssm Россия  
Дата: 22.06.04 12:37
Оценка: :))
Здравствуйте, sl2, Вы писали:

sl2> str2.clear(); //не работает! оставляет мусор! и к этой str2 ничего нельзя добавить!


не ври
Re: std::string и Net2003
От: UGN  
Дата: 22.06.04 12:38
Оценка: 5 (2) +1
Здравствуйте, sl2, Вы писали:

sl2>проверял и на 6й студии — там работает! (вместо clear надо erase(begin(), end()))


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

Тот мусор, который ты видишь во втором случае, скорее всего содержимое маленького буфера, в то время как clear очистил динамический буфер.
Дальнейшая работа со строкой также идет с динамическим буфером. так что ты просто не туда смотришь.
Re[2]: std::string и Net2003
От: UGN  
Дата: 22.06.04 12:48
Оценка:
Здравствуйте, UGN, Вы писали:

UGN>В этой реализации для коротких строк используется не динамический буфер на 16 элементов. Все что больше, работает с динамически выделяемым буфером.


Вот, специально наковырял:
Это после clear

str2 {""} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
_Bx {_Buf=0x0012fe90 "H8/" _Ptr=0x002f3848 "" }
_Buf 0x0012fe90 "H8/" char [16]
_Ptr 0x002f3848 "" char *

после str2 += "test";

str2 {""} std::basic_string<char,std::char_traits<char>,std::allocator<char> >
_Bx {_Buf=0x0012fe90 "H8/" _Ptr=0x002f3848 "test" }
_Buf 0x0012fe90 "H8/" char [16]
_Ptr 0x002f3848 "test" char *



_Bx это union который является
или
_Buf — нединамический буфер
или
_Ptr — указатель на динамический
Re: std::string и Net2003
От: PM  
Дата: 22.06.04 12:48
Оценка:
Здраствуйте, sl2, Вы писали:

[]
Если ты смотришь это под отладчиком Visual Studio 7.0 (в 7.1, судя по всему, это поправили), не верь ему. Посмотри лучше в окне Watch выражение str.c_str()

Найди файл autoexp.dat (лежит в каталоге $(VSInstallDir)\Common7\Packages\Debugger), и попробуй вместо

std::basic_string<char,std::char_traits<char>,std::allocator<char> >=$BUILTIN(NSTDSTRING)
std::basic_string<unsigned short,std::char_traits<unsigned short>,std::allocator<unsigned short> >=$BUILTIN(WSTDSTRING)
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >=$BUILTIN(WSTDSTRING)

попробуй поставить

std::basic_string<char,std::char_traits<char>,std::allocator<char> >= short_str=<_Bx._Buf>, long_str=<_Bx._Ptr> len = <_Mysize>
; аналогично для wchar_t

Posted via RSDN NNTP Server 1.9 alpha
Re[3]: std::string и Net2003
От: sl2  
Дата: 22.06.04 12:49
Оценка:
Здравствуйте, UGN

спасибо!
Re: std::string и Net2003
От: Павел Кузнецов  
Дата: 22.06.04 12:49
Оценка:
>
>   std::string str("123456789012345"); //15 символов
>   str.clear(); //работает (смотрим под дебагом значение переменной)
>   std::string str2("1234567890123456"); //16 символов и больше
>   str2.clear(); //не работает! оставляет мусор! и к этой str2 ничего нельзя добавить!
>   return 0;
>


Это только в отладчике, на самом деле все в порядке: http://rsdn.ru/forum/Message.aspx?mid=241817&amp;only=1
Автор: Павел Кузнецов
Дата: 14.04.03
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: std::string и Net2003
От: ssm Россия  
Дата: 22.06.04 13:07
Оценка:
Здравствуйте, PM, Вы писали:

PM>Найди файл autoexp.dat (лежит в каталоге $(VSInstallDir)\Common7\Packages\Debugger), и попробуй вместо


а нельзя как-то указать метод объекта, результат которого я хочу видеть?
Re[3]: std::string и Net2003
От: PM  
Дата: 22.06.04 13:10
Оценка: 16 (2)
Здраствуйте, 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.

Posted via RSDN NNTP Server 1.9 alpha
Re: std::string и Net2003
От: zubr Россия  
Дата: 22.06.04 13:54
Оценка:
Здравствуйте, sl2, Вы писали:

sl2>проверял и на 6й студии — там работает! (вместо clear надо erase(begin(), end()))


почему вот это не работает? или так нельзя?
//MS VS 2002
#include <string>
int main()
{
std::string str("123456789012345"); //15 символов
str.erase( str.begin(), str.end() ); //работает

std::string str2("1234567890123457"); //16 символов и больше
str2.erase( str.begin(), str.end() ); //не работает!

return 0;
}


похоже я чего то не понимаю...
Re[2]: std::string и Net2003
От: Анатолий Широков СССР  
Дата: 22.06.04 13:56
Оценка:
Здравствуйте, 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
Re[3]: std::string и Net2003
От: zubr Россия  
Дата: 22.06.04 13:58
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Так нельзя, обрати внимание, итераторы какой строки ты передаешь в erase


точна напутал...
Re[2]: std::string и Net2003
От: unrealalex Россия  
Дата: 22.06.04 13:59
Оценка:
#include <string>
int main()
{
    std::string str("123456789012345"); //15 символов
    str.erase( str.begin(), str.end() ); //работает

    std::string str2("1234567890123457"); //16 символов и больше
    str2.erase( str2.begin(), str2.end() ); //теперь работает!

    return 0;
}
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
Re[4]: std::string и Net2003
От: VladFein США  
Дата: 23.06.04 21:32
Оценка:
Здравствуйте, 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>), и много всего другого...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.