Здравствуйте, Аноним, Вы писали:
А>Помогите, новичку, пожалуйста:
А>В следующем коде происходит ссылка на массив чаров из Memo? где они храниятся и как?
А>static char *text; А>text=Form1->Memo1->Lines->Text;
text=Form1->Memo1->Lines->Text.c_str();// точнее так
А>тогда почему поле данного кода происходит потеря данных(вмысле text ссылается на что-то другое)?
А> int SIZE_TEG=NULL; А> int BEGIN_TEG=NULL; А> int END_TEG=NULL; А> while(!(text[POSITION]=='\0')) А> {
А> if (text[POSITION]=='<') А> { А> BEGIN_TEG=(POSITION+1); А> while(!(text[POSITION]=='>')) А> { А> POSITION++; А> } А> END_TEG=POSITION;
А> //////////////////
А> int COUNT_TAG=NULL; А> SIZE_TAG=((END_TEG-BEGIN_TEG)+1);
А> char *t_text; А> t_text=new char[SIZE_TAG]; А> for (int POSITION_TEG=BEGIN_TEG;POSITION_TEG<END_TEG;POSITION_TEG++) А> { А> t_text[COUNT_TAG]=text[POSITION_TEG]; А> COUNT_TAG++; А> } А> while (!(COUNT_TAG==SIZE_TAG)) А> { А> t_text[COUNT_TAG]='\0'; А> COUNT_TAG++; А> } А> COUNT_TAG=NULL;
А> return(*t_text); А> ///////////////////
А> }
А> POSITION++;
А> }
А>В чём я не прав, может быть во всём?
Для копирования в массив char'ов лучше пользоваться вот этим:
char *data;
data = new[Form1->Memo1->Lines->Text.Length()+1]
strcpy( data, Form1->Memo1->Lines->Text.c_str() );
// работаем с data
// ....
// удаляем data:delete[] data; data = NULL;
Кроме того, не рекомендую возвращать, char* в качестве результата функции (из-за соображений потокобезопасности). Для этого используй контейнеры для строк: AnsiString, std::string
Здравствуйте, SWW, Вы писали:
А>>> text=Form1->Memo1->Lines->Text.c_str();// точнее так
AD>>Ни в коем случае нельзя так делать. c_str() возвращает указатель на временный буффер.
SWW>Когда-то я писал о вредности оператора c_str(),
AD>Кроме того, не рекомендую возвращать, char* в качестве результата функции (из-за соображений потокобезопасности). Для этого используй контейнеры для строк: AnsiString, std::string
Когда это у нас std::string стал потокобезопасным?
Здравствуйте, SWW, Вы писали:
А>>> text=Form1->Memo1->Lines->Text.c_str();// точнее так
AD>>Ни в коем случае нельзя так делать. c_str() возвращает указатель на временный буффер.
SWW>Когда-то я писал о вредности оператора c_str(),
однако читатели со мной не согласились и наставили мне минусов. Вы и сейчас считаете, что я не прав?
Да если программист не понимает, почему так писать нельзя, то ему это все равно не поможет, прочтиав сообщение компилятора об ошибке он быстро исправится и напишет: const char* ps = (s1 + s2).c_str();
Вот так и получаются висячие поинтеры!
А с_str() нужен имхо для совместимости: когда вместо std::string нужно передать const char*.
Например, fstream принимает в кач-ве параметра (почему-то?) const char*.
Serge.
Hасколько проще была бы жизнь, если бы она была в исходниках.
S>Да если программист не понимает, почему так писать нельзя, то ему это все равно не поможет, прочтиав сообщение компилятора об ошибке он быстро исправится и напишет:
S>const char* ps = (s1 + s2).c_str();
S>Вот так и получаются висячие поинтеры!
Не могу понять логику в таком написании. c_str() вообще не предназначен для того, чтобы его результат где-то сохранялся.
Здравствуйте, Vamp, Вы писали:
AD>> Кроме того, не рекомендую возвращать, char* в качестве результата AD>> функции (из-за соображений потокобезопасности). Для этого используй AD>> контейнеры для строк: AnsiString, std::string V> Когда это у нас std::string стал потокобезопасным?
Уточню: AD>>...не рекомендую возвращать, char*, полученный от c_str() AD>>в качестве результата функции в любом случае....
Кроме того, если ты используешь в разных потоках функцию, возвращающую
std::string, то проблем с потокобезопасностью не будет, т.к. возвращаемые
объекты работают с различающмися наборами данных. Когда ты работаешь с
c_str(), есть вероятность того, что буфер, возвращаемый c_str — статический.
Тогда вызов c_str() одновременно из двух потоков приведёт к плачевному
результату.
А>>>> text=Form1->Memo1->Lines->Text.c_str();// точнее так
AD>>>Ни в коем случае нельзя так делать. c_str() возвращает указатель на временный буффер.
S>
S>Да если программист не понимает, почему так писать нельзя, то ему это все равно не поможет, прочтиав сообщение компилятора об ошибке он быстро исправится и напишет:
S>const char* ps = (s1 + s2).c_str();
S>Вот так и получаются висячие поинтеры!
Вероятно мне следовало слово "исправится" взять в кавычки, чтобы абзацы, вырванные из контекста, оставались понятными.
S>А с_str() нужен имхо для совместимости: когда вместо std::string нужно передать const char*. S>Например, fstream принимает в кач-ве параметра (почему-то?) const char*.
Речь шла не о том, нужна эта функция или нет, а о том, что вместо нее std::string должен иметь operator(const char*). Тогда везде, где требуется const char* можно было бы писать саму строку. Но Страуструп, помешанный на безопасности, решил, что программист может по ошибке написать const char* ps = s1 + s2, в результате чего возникнет, как ты выражаешься, висячий пойнтер. Я же писал, что наличие функции c_str() ничем не поможет программисту. И исходное письмо является подтверждением этого: его автор ошибся так же, как если бы у std::string был operator(const char*) вместо функции c_str().
Здравствуйте, SWW, Вы писали:
S> Речь шла не о том, нужна эта функция или нет, а о том, что вместо нее S> std::string должен иметь operator(const char*). Тогда везде, где S> требуется const char* можно было бы писать саму строку.
Если бы operator const char*() const "включала" только преобразование к const char*, было бы еще
более-менее терпимо... Однако наличие operator const char*() const позволяет, например, такие вещи:
string s1 = "abcd";
string s2 = s1 + 10;
плюс делает использование многих других "нормальных" перегруженных операций более трудным, чем в случае,
когда это преобразование "выключено".
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
ПК>Если бы operator const char*() const "включала" только преобразование к const char*, было бы еще ПК>более-менее терпимо... Однако наличие operator const char*() const позволяет, например, такие вещи:
ПК>
E:\users\pavel\test\string_conv>como -c test.cpp
Comeau C/C++ 4.3.0.1 (Aug 21 2002 15:45:32) for MS_WINDOWS_x86
Copyright 1988-2002 Comeau Computing. All rights reserved.
MODE:strict warnings C++
"test.cpp", line 11: error: more than one operator "[]" matches these operands:
built-in operator "pointer-to-object[integer]"
function "string::operator[](unsigned int) const"
operand types are: string [ int ]
s[10];
^
1 error detected in the compilation of "test.cpp".
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Ты хочешь убедить меня в том, что operator const char*() в std::string отсутствует потому, что это невозможно реализовать? При желании сделать можно все, например заменить unsigned int на int. Но дело-то не в этом, а в том, что это не было сделано специально, для повышения такназываемой "безопасности", о чем и пишет Страуструп.
Здравствуйте, SWW, Вы писали:
S> Ты хочешь убедить меня в том, что operator const char*() в S> std::string отсутствует потому, что это невозможно реализовать?
Нет. Просто его наличие приводит к большему количеству неприятностей, чем его отсутствие.
S> При желании сделать можно все, например заменить unsigned int на int.
Тогда будут проблемы с int. Если добавить и int, и unsigned, будут проблемы с long.
В общем, перегружать operator[] придется со всеми встроенными типами.
S> Но дело-то не в этом, а в том, что это не было сделано специально, для S> повышения такназываемой "безопасности", о чем и пишет Страуструп.
Нарушение безопасности типов — одна из добавляющихся неприятностей, но не единственная.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен