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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Char* ....  (Прочитано 6812 раз)
pupapum
Гость
« : Апрель 25, 2008, 10:59 »

Привет, не могу понять почему.
вот Код:

Код:
char* fromQStringToChar(QString str)
{
char *tmpC=new char [str.size()]; ///Вот тут сайз возвращает правильную длину, но размерность у чара при этом становиться где-то на 15 больше. Что такое?
QVariant var;
for(int i=0;i<str.length();i++)
{
       var=str.at(i);
       tmpC[i] = var.toChar().toAscii();
}
return tmpC;
}
« Последнее редактирование: Апрель 25, 2008, 12:37 от pastor » Записан
pupapum
Гость
« Ответ #1 : Апрель 25, 2008, 11:12 »

Люди там строчка tmpC = var.toChar().toAscii();, почему - то у нее пропадает при tmpC.
Админы обратите внимание.
я писал:

 
Код:
 tmpC[i] = var.toChar().toAscii();
 написалось:
 tmpC = var.toChar().toAscii();

Пробовал редактировать и там показывает он все правильно, когда сохраняшь получаешь  tmpC = var.toChar().toAscii();
. Вот =)


Потому что теги КОД нужно юзать, я уже писал неоднократно про это
« Последнее редактирование: Апрель 25, 2008, 12:38 от pastor » Записан
vaprele07
Гость
« Ответ #2 : Апрель 25, 2008, 11:24 »

не путай size (размер) и length(число элементов)
возможно я тебя не понял  Строит глазки
Записан
pupapum
Гость
« Ответ #3 : Апрель 25, 2008, 11:29 »

В ассистанте написано что это одно и тоже, я говорю, что размер возвращается правильный, но char создается на где - то на 15 элементов больше
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Апрель 25, 2008, 12:44 »

А нелегче сделать так:

Код:
char* fromQStringToChar(const QString &str)
{
QByteArray array = str.toLocal8Bit();
char *tmpC=new char [array.size()];
memmove(tmpC, array.constData(), array.size());
return tmpC;
}
« Последнее редактирование: Апрель 25, 2008, 21:13 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
BRE
Гость
« Ответ #5 : Апрель 25, 2008, 20:35 »

2 Pupapum

QString хранит строки в юникоде. Какую строку преобразуешь?

Интересно, а зачем тебе это надо, да еще так извращенно?  Подмигивающий
« Последнее редактирование: Апрель 25, 2008, 20:37 от BRE » Записан
DenKor
Гость
« Ответ #6 : Апрель 30, 2008, 13:41 »

Я использую такую же процедуру по смыслу.
Т.е. мне нужно из строки QString преобразовать строку в тип char* в локальной кодировке.

Нужно из-за того, что есть движок работы с базой данных в которой поля и процедуры работают с типом char* .

Использую макрос qPrintable() и его модификацию для записи в кодировке отличной по умолчанию от локальной .
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Апрель 30, 2008, 14:40 »

Я использую такую же процедуру по смыслу.
Т.е. мне нужно из строки QString преобразовать строку в тип char* в локальной кодировке.

Нужно из-за того, что есть движок работы с базой данных в которой поля и процедуры работают с типом char* .

Использую макрос qPrintable() и его модификацию для записи в кодировке отличной по умолчанию от локальной .

Как вы используете qPrintable()? Есть подводные камни при работе с ним
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
DenKor
Гость
« Ответ #8 : Май 02, 2008, 09:15 »

Как вы используете qPrintable()? Есть подводные камни при работе с ним

Код:
void QStrToOem(QString *s,unsigned char* buffer,int *len)
{

 
 
  QTextCodec *codec = QTextCodec::codecForName("IBM 866");
  QByteArray tmp=codec->fromUnicode ( *s );
  *len=tmp.length();
  memmove (buffer,tmp.constData(),*len);
  buffer[*len]=0;
  return;
 
}
void OemToQStr(QString *s,unsigned char* buffer,long len)
{
  *s="";
  QByteArray tmp ((char*)buffer);
  QTextCodec *codec = QTextCodec::codecForName("IBM 866");
  *s = codec->toUnicode( tmp );
  return;
 
 
}

Ну и с локальной кодировкой

strcpy(buffer,qPrintable(s));


Что за подводные камни ?
« Последнее редактирование: Май 02, 2008, 09:17 от DenKor » Записан
Sergeich
Гость
« Ответ #9 : Май 02, 2008, 09:45 »

Cи-строки (char*) должны заканчиваться нулевым символом:
Код:
char* fromQStringToChar( const QString& str )
{
char *tmpC=new char [str.size() + 1];
QVariant var;
for(int i=0;i<str.length();i++)
{
       var=str.at(i);
       tmpC[i] = var.toChar().toAscii();
}
           tmpC[str.size()] = 0;
  return tmpC;
}
А вообще нормальные люди юзают
Код:
cstr = str.toLocal8Bit();
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Май 02, 2008, 12:33 »

Что за подводные камни ?

В такой комбинации strcpy(buffer,qPrintable(s)); все ок. Я имел ввиду случай, когда:

Код:
const char *ch = qPrintable(str);
// using ch

при этом указатель ch после вызова qPrintable(str) будет невалиден.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
DenKor
Гость
« Ответ #11 : Май 02, 2008, 14:08 »

Что за подводные камни ?

В такой комбинации strcpy(buffer,qPrintable(s)); все ок. Я имел ввиду случай, когда:

Код:
const char *ch = qPrintable(str);
// using ch

при этом указатель ch после вызова qPrintable(str) будет невалиден.

Эта особенность прописана в справочной документации.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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