Russian Qt Forum
Апрель 19, 2024, 11:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Преобразовать символ из QChar в char  (Прочитано 36518 раз)
zayac_val
Гость
« : Март 20, 2009, 15:53 »

Вопрос примитивный, но ответ найти не получается. Подскажите как преобразовать символ из  QChar в char, или из QString в char ? Непонимающий
Записан
igor_bogomolov
Гость
« Ответ #1 : Март 20, 2009, 15:59 »

Цитировать
char QChar::toAscii () const
char QChar::toLatin1 () const

const char * qPrintable ( const QString & str )
Записан
zayac_val
Гость
« Ответ #2 : Март 20, 2009, 16:03 »

Спасибо. Смеющийся
Записан
nn1317
Гость
« Ответ #3 : Март 20, 2009, 19:08 »

Цитировать
char QChar::toAscii () const
char QChar::toLatin1 () const

const char * qPrintable ( const QString & str )
чувааак! респект и уважуха тебе!)))
а то я уже года 3-4 делаю так:
Код:
QString str;
char* ss = str.toAsii().data();
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Март 23, 2009, 10:14 »

Есть одно но:

Код
C++ (Qt)
const char *ss = qPrintable ( str );
char* ss = str.toAsii().data();

В обоих случаях ss будет невалиден и дальнейшая работа с ним приведет к крашу проги. Почему? Читать в ассистанте
« Последнее редактирование: Март 23, 2009, 11:37 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
BRE
Гость
« Ответ #5 : Март 23, 2009, 11:33 »

Есть одно но:

Код
C++ (Qt)
const char *ss = qPrintable ( str );
char* ss = str.toAsii().data();

В обоих случаях ss будет невалиден и бальнейшая работа с мин приведет к крашу проги. Почему? Читать в ассистанте
Дополню pastor'а. Причина будет одна, потому что qPrintable определено как:
Код
C++ (Qt)
#define qPrintable(string) (string).toLocal8Bit().constData();
 
Записан
Barmaglodd
Гость
« Ответ #6 : Март 23, 2009, 14:51 »

Есть одно но:

Код
C++ (Qt)
const char *ss = qPrintable ( str );
char* ss = str.toAsii().data();

В обоих случаях ss будет невалиден и дальнейшая работа с ним приведет к крашу проги. Почему? Читать в ассистанте


Зачем же так категорично? Если str не разрушать, и косяков с преобразованием из UTF нет, то вполне себе валиден, и работать можно Подмигивающий

тьфу, прогнал Грустный
« Последнее редактирование: Март 23, 2009, 14:54 от Barmaglodd » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Март 23, 2009, 15:11 »

Есть одно но:

Код
C++ (Qt)
const char *ss = qPrintable ( str );
char* ss = str.toAsii().data();

В обоих случаях ss будет невалиден и дальнейшая работа с ним приведет к крашу проги. Почему? Читать в ассистанте


Не соглашусь, это стандартный механизм преобразования, рекомендуемый тролями, для доступа ReadOnly.
Конечно, если попытаться менять контент - может быть плохо, но не краш.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
BRE
Гость
« Ответ #8 : Март 23, 2009, 15:16 »

Не соглашусь, это стандартный механизм преобразования, рекомендуемый тролями, для доступа ReadOnly.
Конечно, если попытаться менять контент - может быть плохо, но не краш.
Имеется ввиду следующее использование:
Код
C++ (Qt)
const char *func()
{
   QString str = "......";
   return qPrintable( str );
}
 
Хорошего от него не жди....  Подмигивающий
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Март 23, 2009, 15:35 »

Имеется ввиду следующее использование:

Нет, имеется ввиду какраз вот такое:

Код
C++ (Qt)
QString str("bla-bla");
 
const char *ptrStr = str.toLocal8Bit().constData();
 
//do something with ptrStr

Вот какраз на do something with ptrStr мы и получим краш, т.е. ptrStr будет не валиден после вызова toLocal8Bit().constData().

Эта тема уже поднималась ранее http://www.prog.org.ru/topic_3658_0.html
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Март 23, 2009, 15:38 »

Не соглашусь, это стандартный механизм преобразования, рекомендуемый тролями, для доступа ReadOnly.
Конечно, если попытаться менять контент - может быть плохо, но не краш.

А ты проверь Подмигивающий Можно также посмотреть исходники Qt на предмет toLocal8Bit
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
BRE
Гость
« Ответ #11 : Март 23, 2009, 15:46 »

А ты проверь Подмигивающий Можно также посмотреть исходники Qt на предмет toLocal8Bit
А я и проверять не буду, полностью соглашусь (сообразил).  Смеющийся
Записан
nn1317
Гость
« Ответ #12 : Март 23, 2009, 19:07 »

перечитал ту тему еще разок - дошло, почему у меня все работает))
« Последнее редактирование: Март 23, 2009, 19:10 от nn1317 » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #13 : Март 23, 2009, 19:39 »

хм, ну вот скока себя помню - всегда работала подобная конструкция
(const char *ptrStr = str.toAscii().constData()Подмигивающий

естественно, что возвращать ptrStr не стоит Улыбающийся но в локальном методе все ок.
QByteArray то живет до очистки стека.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Rcus
Гость
« Ответ #14 : Март 23, 2009, 20:02 »

В том то и дело, что не живет, Valgrind единозначно выражает мнение насчет подобных конструкций

Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QString aaaa = QString("aaaaaBBBB");
   const char *astr = qPrintable(aaaa);
   qDebug("%s",astr);
   return 0;
}
valgrind --free-fill=0x55 ./test
Код:
==305== Invalid read of size 1
==305==    at 0x694EE0E: QString::fromUtf8(char const*, int) (in /usr/lib/libQtCore.so.4.5.0)
==305==    by 0x6951622: QString::vsprintf(char const*, __va_list_tag*) (in /usr/lib/libQtCore.so.4.5.0)
==305==    by 0x68FEDC7: qDebug(char const*, ...) (in /usr/lib/libQtCore.so.4.5.0)
==305==    by 0x40E2E1: main (main.cpp:20)
==305==  Address 0xbd35a68 is 24 bytes inside a block of size 41 free'd
==305==    at 0x4C265AF: free (vg_replace_malloc.c:323)
==305==    by 0x40E2D2: main (main.cpp:19)
UUUUUUUUUUUUUUUUU
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.272 секунд. Запросов: 22.