Перейти к содержимому


Фотография

Вопрос по VS C++


  • Закрытая тема Тема закрыта
Сообщений в теме: 2

#1 Amber

Amber
  • Молодой Участник

  • Пользователи
  • 105 Cообщений

Отправлено 06 Октябрь 2006 - 09:12

Не могу найти как в LPTSTR записать строку.

#2 Relict

Relict
  • зажигающий...

  • Пользователи
  • 1 685 Cообщений

Отправлено 09 Октябрь 2006 - 22:26

вот кусок какогто форума:
Клуб программистов Весельчак У
Программирование => WinAPI & Visual C++ => Автор: Junk на Ноябрь 22, 2005, 12:05:24 pm

Название: cnhjrf CString
Ответил: Junk на Ноябрь 22, 2005, 12:05:24 pm
Не могу понять, почему у меня в программе в разных местах то выполняется, то не выполняется операция '+'.

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

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

void MyDlg::OnSend()
{
CString comment, sHostAddr;
...
comment = "посылка отправлена на " + sHostAddr;
...
}


Название: Re: cnhjrf CString
Ответил: Junk на Ноябрь 22, 2005, 12:09:43 pm
И еще один вопрос:
можно как-нибудь тип CString преобразовать в тип LPTSTR?
но способом попроще этого:

CString str;
LPTSTR ch;
StrCpy(ch, str);

Название: Re: cnhjrf CString
Ответил: asker на Ноябрь 22, 2005, 02:33:59 pm
Привет Junk, я нашел другой вариант
CString str;
LPTSTR lpStr;

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

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

Название: Re: cnhjrf CString
Ответил: Malaja на Ноябрь 22, 2005, 02:40:12 pm
В принципе, это обычный способ:


Код:

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);
}


Название: Re: cnhjrf CString
Ответил: Junk на Ноябрь 22, 2005, 06:21:36 pm
Сорри, первый вопрос снимаю - моя невнимательность в определении типов переменных.
По второму - спасибо за ответы.

Название: Re: cnhjrf CString
Ответил: Джон на Ноябрь 23, 2005, 03:56:11 pm
Ууууууу, как всё запущено!!! Вы чего а?


цитата из: Junk на Ноябрь 22, 2005, 12:09:43 pm
можно как-нибудь тип 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);
}


Таким образом, как это здесь записано:

цитата из: Junk на Ноябрь 22, 2005, 12:09:43 pm
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();


Примерно так...

Название: Re: cnhjrf CString
Ответил: Malaja на Ноябрь 24, 2005, 11:06:16 am
Джон,

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

Название: Re: cnhjrf CString
Ответил: Джон на Ноябрь 24, 2005, 01:10:49 pm
цитата из: Malaja на Ноябрь 24, 2005, 11:06:16 am
я знаю, что LPTSTR - указатель.

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

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

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


Название: Re: cnhjrf CString
Ответил: Malaja на Ноябрь 24, 2005, 01:26:28 pm
Джон,

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

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

Название: Re: cnhjrf CString
Ответил: Джон на Ноябрь 24, 2005, 01:48:42 pm
цитата из: Malaja на Ноябрь 24, 2005, 01:26:28 pm
прямое преобразование невозможно


Ничего другого я и не говорил :-)

Название: Re: cnhjrf CString
Ответил: tag на Ноябрь 25, 2005, 11:43:21 am
цитата из: Junk на Ноябрь 22, 2005, 12:09:43 pm
И еще один вопрос:
можно как-нибудь тип CString преобразовать в тип LPTSTR?
но способом попроще этого:

CString str;
LPTSTR ch;
StrCpy(ch, str);

(LPTSTR)((LPCTSTR)str)

Название: Re: cnhjrf CString
Ответил: Джон на Ноябрь 25, 2005, 11:48:54 am
tag, ты преобразуешь не объект, а только указатель на внутренний буфер объекта CString.
Практически это тоже самое, что написал asker.

Название: Re: cnhjrf CString
Ответил: Hooter на Ноябрь 25, 2005, 12:25:20 pm
цитата из: tag на Ноябрь 25, 2005, 11:43:21 am
(LPTSTR)((LPCTSTR)str)

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

Название: Re: cnhjrf CString
Ответил: tag на Ноябрь 25, 2005, 12:30:38 pm
цитата из: Джон на Ноябрь 25, 2005, 11:48:54 am
tag, ты преобразуешь не объект, а только указатель на внутренний буфер объекта CString.
Практически это тоже самое, что написал asker.

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

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


Название: Re: cnhjrf CString
Ответил: tag на Ноябрь 25, 2005, 01:37:40 pm
Полностью тебя поддерживаю


Powered by SMF 1.1 RC2 | SMF © 2001-2005, Lewis Media

#3 AnnaSerova

AnnaSerova
  • Начинающий

  • Пользователи
  • 1 Cообщений

Отправлено 05 Ноябрь 2015 - 02:06

http://snob.ru информацию. <a href=http://www.colta.ru>...информацию.</a>


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных