Russian Qt Forum

Qt => Общие вопросы => Тема начата: pupapum от Апрель 25, 2008, 10:59



Название: Char* ....
Отправлено: 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;
}


Название: Re: Char* ....
Отправлено: pupapum от Апрель 25, 2008, 11:12
Люди там строчка tmpC = var.toChar().toAscii();, почему - то у нее пропадает при tmpC.
Админы обратите внимание.
я писал:

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

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


Потому что теги КОД нужно юзать, я уже писал неоднократно про это


Название: Re: Char* ....
Отправлено: vaprele07 от Апрель 25, 2008, 11:24
не путай size (размер) и length(число элементов)
возможно я тебя не понял  ::)


Название: Re: Char* ....
Отправлено: pupapum от Апрель 25, 2008, 11:29
В ассистанте написано что это одно и тоже, я говорю, что размер возвращается правильный, но char создается на где - то на 15 элементов больше


Название: Re: Char* ....
Отправлено: pastor от Апрель 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;
}


Название: Re: Char* ....
Отправлено: BRE от Апрель 25, 2008, 20:35
2 Pupapum

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

Интересно, а зачем тебе это надо, да еще так извращенно?  ;)


Название: Re: Char* ....
Отправлено: DenKor от Апрель 30, 2008, 13:41
Я использую такую же процедуру по смыслу.
Т.е. мне нужно из строки QString преобразовать строку в тип char* в локальной кодировке.

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

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


Название: Re: Char* ....
Отправлено: pastor от Апрель 30, 2008, 14:40
Я использую такую же процедуру по смыслу.
Т.е. мне нужно из строки QString преобразовать строку в тип char* в локальной кодировке.

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

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

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


Название: Re: Char* ....
Отправлено: DenKor от Май 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));


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


Название: Re: Char* ....
Отправлено: Sergeich от Май 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();


Название: Re: Char* ....
Отправлено: pastor от Май 02, 2008, 12:33
Что за подводные камни ?

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

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

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


Название: Re: Char* ....
Отправлено: DenKor от Май 02, 2008, 14:08
Что за подводные камни ?

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

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

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

Эта особенность прописана в справочной документации.