Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: cnhjrf CString  (Прочитано 17589 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Junk
Гость
« : 22-11-2005 12:05 » 

Не могу понять, почему у меня в программе в разных местах то выполняется, то не выполняется операция '+'.

void MyDlg::OnFileOpen()
{
   CString selFile, comment;
   ...
   TCHAR szError[1024];
   ...
   comment = "не открыть файл" + selFile + " " + szError;
   ...
}

а тут выдает ошибку при компиляции "cannot add two pointers":

void MyDlg::OnSend()
{
   CString comment, sHostAddr;
   ...
   comment = "посылка отправлена на " + sHostAddr;
   ...
}
« Последнее редактирование: 19-12-2007 18:26 от Алексей1153++ » Записан
Junk
Гость
« Ответ #1 : 22-11-2005 12:09 » 

И еще один вопрос:
можно как-нибудь  тип CString преобразовать в тип LPTSTR?
но способом попроще этого:

CString   str;
LPTSTR  ch;
StrCpy(ch, str);
Записан
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 22-11-2005 14:33 » 

Привет Junk, я нашел другой вариант
        CString str;
   LPTSTR lpStr;

   str = "Привет";
   lpStr = str.GetBuffer();

Он вроде более красивый на мой взгляд
Проверил работает, ведь так мы непосредственно получаем указатель на строку (если посмотреть в отладчике, то адреса совпадают).
Записан

С уважением, asker
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #3 : 22-11-2005 14:40 » 

В принципе, это обычный способ:

Код:

CString comment ("priwet belochka");
  LPTSTR str;
char buf[1024];
strcpy(buf, comment);
str = buf;


А вообще, насколько я знаю, LPTSTR больше используют как тип передаваемого параметра в функции:

Код:
	void OnMyString (LPTSTR pStr) 
{
// ...
return ;
}

void main()
{
char buf[1024];
CString comment ("priwet belochka");
strcpy(buf, comment);

OnMyString(str);
}
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Junk
Гость
« Ответ #4 : 22-11-2005 18:21 » 

Сорри, первый вопрос снимаю - моя невнимательность в определении типов переменных.
По второму - спасибо за ответы.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 23-11-2005 15:56 » 

Ууууууу, как всё запущено!!! Вы чего а?

можно как-нибудь тип CString преобразовать в тип LPTSTR?

А никак нельзя! Это абсолютно разные типы данных - LPTSTR - это указатель - 32 битное целое число.
Строка - это массив 8ми битных символов - 8бит * N - где N - число символов в строке.
Ну и как вы их собираетесь преобразовывать?

То, что ты хочешь сделать является не преобразованием, а копированием.
Поэтому правильным ответом на вопрос будет:
Можно скопироваить содержимое буфера объекта CString в другой буфер,
доступный через указатель типа LPTSTR.

То что предложил asker, есть не что иное, как доступ к внутреннему буферу объекта CString. Если оригинальный объект перестанет существовать, то указатель будет недействительным:
Код:
{
LPTSTR pszTest = NULL;

if(TRUE)
{
CString st1(_T("I'm string"));
pszTest = st1.GetBuffer(st1.GetLength());
}

//  здесь оригинальный буфер уже потерян
AfxMessageBox(pszTest);
}

Таким образом, как это здесь записано:
CString str;
LPTSTR ch;
StrCpy(ch, str);
- "расстрелять из крупнокалиберного пулемёта" (с)

Передаётся указатель (фактически адрес куска памяти) несуществующего объекта в функцию, которая будет туда что-то копировать. Практически в ch лежит какой-то мусор размером в 32 бита.

Значица так:

1. ПЕРЕМЕННЫЕ ДОЛЖНЫ БЫТЬ ИНИЦИАЛИЗИРОВАНЫ! Те в данном случае будет сразу видно, что LPTSTR есть указатель.

2. LPTSTR на самом деле есть не что иное как укзатель на TCHAR - typedef TCHAR* LPTSTR

3. Перед копированием ОБЯЗАТЕЛЬНО проверять размер целевого буфера, или создавать буфер необходимого размера.

Код:
CString stSrc = _T("I'm string.");
int nLen = stSrc.GetLength()+1; // не забываем про 0 в конце строки символов
LPTSTR pszTarget = new TCHAR[nLen];
memset(pszTarget,0,nLen*sizeof(TCHAR)); // обнуляем буфер
_tcscpy(pszTarget, stSrc.GetBuffer(stSrc.GetLength()));
stSrc.ReleaseBuffer();

Примерно так...
« Последнее редактирование: 19-12-2007 18:28 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 24-11-2005 11:06 » 

Джон,

я знаю, что LPTSTR - указатель.
Возникает небольшой вопрос:
я привела первый пример, где я указатель просто поставила на начало текстового буфера. Разве в этом случае нужно специально создавать какое-то место для LPTSTR (в твоем примере это строка LPTSTR pszTarget = new TCHAR[nLen]Ага ?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 24-11-2005 13:10 » 

я знаю, что LPTSTR - указатель.
Это хорошо - важно чтобы и другие знали, а главное понимали! На самом деле вопрос затрагивает базовые знания - ведь первый вопрос возник совсем не от невнимательности. Сразу видно, что не хватает понимания объектов и типов данных. Правильный ответ на первый вопрос:

второй пример не работает тк первым операндом стоит объект типа const char*, в котором оператор + для CString не перегружен. Если поменять операнды местами, то будет вызываться оператор + объекта CString, перегруженная версия которого может принимать в качестве параметра уазатель на char*. Вот и всё - дело совсем не в невнимательности.

А в твоем примере тоже никакого преобразования CString в LPTSTR не происходит. Сначала ты копируешь в buf. Только ты резервируешь гораздо больше места чем надо - 1024, что тоже не есть гут. А по сути ты просто продублировала указатель buf, копией в str. Вот и всё. Те практически сделала что-то типа int i; int b; i=b;
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 24-11-2005 13:26 » 

Джон,

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

Насчет 1024 - согласна, это некорректно, я хотела только привести пример (каюсь, забываю, что в примере тоже надо сразу все делать правильно).
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 24-11-2005 13:48 » 

прямое преобразование невозможно

Ничего другого я и не говорил Улыбаюсь
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tag
Гость
« Ответ #10 : 25-11-2005 11:43 » 

И еще один вопрос:
можно как-нибудь тип CString преобразовать в тип LPTSTR?
но способом попроще этого:

CString str;
LPTSTR ch;
StrCpy(ch, str);
(LPTSTR)((LPCTSTR)str)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 25-11-2005 11:48 » 

tag, ты преобразуешь не объект, а только указатель на внутренний буфер объекта CString.
Практически это тоже самое, что написал asker.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Hooter
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 25-11-2005 12:25 » 

(LPTSTR)((LPCTSTR)str)
То, что микрософт делал реализацию CString спустя рукава, еще не означает, что нужно пользоваться этой дырой.
Записан
tag
Гость
« Ответ #13 : 25-11-2005 12:30 » 

tag, ты преобразуешь не объект, а только указатель на внутренний буфер объекта CString.
Практически это тоже самое, что написал asker.
я понимаю, что реального преобразования объекта не будет, тогда встречный вопрос - нафига было заводить CString, чтобы потом его преобразовывать??? Все это напоминает людей, которые не до конца освоили ООП и мыслят старыми понятиями, пытаясь засунуть их в рамки ОО языков!!!
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 25-11-2005 13:10 » 

tag, Для меня очевидно, что Junk либо новичёк, либо перешёл с какого-нить НЕ ООП языка. Про его первый вопрос я уже упоминал. В любом случае видно - теории не хватает. Поэтому своими постами я и хотел подчеркнуть, что преобразовать нельзя. Ведь если посмотреть развитие темы - Вопрос: Как? - Ответ: А вот так. И человек думает, что он что-то преобразовал, а самое главное - и дальше будет так думать. Конечно используются все предложенные методы, но в качестве ответа никто не сказал, что реально этого сделать нельзя. Поэтому-то я и вклинился.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tag
Гость
« Ответ #15 : 25-11-2005 13:37 » 

Полностью тебя поддерживаю
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines