ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] Странности с QT
@ 2011-11-02 19:10 Paul Wolneykien
  2011-11-02 21:33 ` Hihin Ruslan
  0 siblings, 1 reply; 6+ messages in thread
From: Paul Wolneykien @ 2011-11-02 19:10 UTC (permalink / raw)
  To: ALT Linux Team development discussions


  Всем привет.

  Вопрос, прежде всего, к специалистам по QT.

  На днях боролся с неполадками в Scribus
(http://bugs.scribus.net/view.php?id=10355). Дело оказалось в
преобразовании чисел, а при отладке я обнаружил, как мне кажется,
странное поведение QByteArray, QString либо QChar — точно сказать не могу:

(gdb) p bb->d->data
$1 = 0x8d83fb0 "    "
(gdb) n
44                      bb = bb.insert(0, in.at(3).cell());
(gdb) p bb->d->data
$2 = 0x9651068 "   \305 "
(gdb) n
45                      bb = bb.insert(1, in.at(2).cell());
(gdb) p bb->d->data
$3 = 0x9651068 "  \320 \305 "
(gdb) n
46                      bb = bb.insert(2, in.at(1).cell());
(gdb) p bb->d->data
$4 = 0x9651068 " \323 \320 \305 "
(gdb) n
58                      bb = bb.insert(3, in.at(0).cell());
(gdb) p bb->d->data
$5 = 0x9651068 "\306 \323 \320 \305 "

  Как видно, в bb добавляются не только байты из входной строки, но и
пробелы. Судя по последующему коду (http://clck.ru/OA-n) автор не
предполагал их наличия.

  Проблему я решил, избавившись от использования как insert, так и
QString (http://clck.ru/OA0M). Однако интересно, является ли такое
поведение insert нормальным? Подумал, вдруг эта проблема затрагивает не
только Scribus.


    Паша.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [devel] Странности с QT
  2011-11-02 19:10 [devel] Странности с QT Paul Wolneykien
@ 2011-11-02 21:33 ` Hihin Ruslan
  2011-11-02 22:44   ` Paul Wolneykien
  0 siblings, 1 reply; 6+ messages in thread
From: Hihin Ruslan @ 2011-11-02 21:33 UTC (permalink / raw)
  To: devel

[-- Attachment #1: Type: text/plain, Size: 886 bytes --]

Здравствуйте Paul Wolneykien
  В сообщении от 2 ноября 2011 Paul Wolneykien написал(a):
>  Как видно, в bb добавляются не только байты из входной
> строки, но и пробелы. Судя по последующему коду
> (http://clck.ru/OA-n) автор не предполагал их наличия.

Да вроде пробел - такой-же символ как и любой другой. 
Вставляется-то именно символ, а не слово . и не строка (там еще 
можно говорить о роли пробела).  

-- 
  А ещё говорят так  (fortune):
 
Hope that the day after you die is a nice day. 
________________________________________________________________________
С уважением Хихин Руслан

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [devel] Странности с QT
  2011-11-02 21:33 ` Hihin Ruslan
@ 2011-11-02 22:44   ` Paul Wolneykien
  2011-11-03  4:32     ` Hihin Ruslan
  0 siblings, 1 reply; 6+ messages in thread
From: Paul Wolneykien @ 2011-11-02 22:44 UTC (permalink / raw)
  To: ALT Linux Team development discussions

03.11.2011 01:33, Hihin Ruslan пишет:
> Здравствуйте Paul Wolneykien
>   В сообщении от 2 ноября 2011 Paul Wolneykien написал(a):
>>  Как видно, в bb добавляются не только байты из входной
>> строки, но и пробелы. Судя по последующему коду
>> (http://clck.ru/OA-n) автор не предполагал их наличия.
> 
> Да вроде пробел - такой-же символ как и любой другой. 
> Вставляется-то именно символ, а не слово . и не строка (там еще 
> можно говорить о роли пробела).

  Я имел в виду, что пробел вставляется в дополнение к байту из исходной
строки in. Это нормально?

  Судя по коду автор просто хотел аккуратно перенести 4 байта из in в
bb, меняя порядок при необходимости. А получается, что в записываются
только 2 байта из in, а в остальных двух позициях между ними — пробелы.

> 
> 
> 
> 
> _______________________________________________
> Devel mailing list
> Devel@lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/devel



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [devel] Странности с QT
  2011-11-02 22:44   ` Paul Wolneykien
@ 2011-11-03  4:32     ` Hihin Ruslan
  2011-11-03  5:04       ` Sergei Epiphanov
  0 siblings, 1 reply; 6+ messages in thread
From: Hihin Ruslan @ 2011-11-03  4:32 UTC (permalink / raw)
  To: devel

[-- Attachment #1: Type: text/plain, Size: 2534 bytes --]

Здравствуйте Paul Wolneykien
  В сообщении от 3 ноября 2011 Paul Wolneykien написал(a):
>  Я имел в виду, что пробел вставляется в дополнение к байту из
> исходной строки in. Это нормально?
Я так понимаю, что ошибка где-то раньше - в том, что туда попали 
пробелы.
Не могу гарантировать, но IMHO - это нормально.

Как я понимаю, пробелы возникли из-за чего-то, связанного с 
уникодом. Насколько я помню, QT хранит данные в юникоде (и даже 
не utf8. а в чём-что ещё). И сколько занимает один символ - не 
определено (зависит от языка и т.п.). 

Теперь полез по справочникам:

Функция at вытаскивает символ типа QChar по индексу. 
Вот - описание QCcar:
"The QChar class provides a 16-bit Unicode character.
In Qt, Unicode characters are 16-bit entities without any markup 
or structure. This class represents such an entity. It is 
lightweight, so it can be used everywhere. Most compilers treat 
it like a unsigned short."

Т.е. один QChar занимает 2 байта. 


QByteArray bb(4, ' '); - отводит 4 байта (не символа).  IMHo 
отсюда и проблема. 16-битный символ пытаются запихнуть в один 
байт. 

Т.е. должно быть что-то типа:
   QByteArray bb(8, ' ');
       bb = bb.insert(6, in.at(0));
       bb = bb.insert(4, in.at(1));
       bb = bb.insert(2, in.at(2));
       bb = bb.insert(0, in.at(3));

Начсколько это верно, зависит от операции = (как приводятся типы 
и т.п.)

Или
QChar bb[4]
bb = in.at(0);
....
bb = in.at(3));

Я конечно могу ошибаться, но ошибка возникает из-за представления 
программиста, что символ занимает один байт.


-- 
  А ещё говорят так  (fortune):
 
The trouble with you Is the trouble with me. Got two good eyes 
But we still don't see. -- Robert Hunter, "Workingman's Dead" 
________________________________________________________________________
С уважением Хихин Руслан

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [devel] Странности с QT
  2011-11-03  4:32     ` Hihin Ruslan
@ 2011-11-03  5:04       ` Sergei Epiphanov
  2011-11-03  6:59         ` Damir Shayhutdinov
  0 siblings, 1 reply; 6+ messages in thread
From: Sergei Epiphanov @ 2011-11-03  5:04 UTC (permalink / raw)
  To: ALT Linux Team development discussions

On 3 ноября 2011 08:32 Hihin Ruslan wrote:
> "The QChar class provides a 16-bit Unicode character.

На мой взгляд UTF16 тут ни причём. Вместо извращений с QByteArray, сдвигами и 
прочим проще сделать 

union{
    uint ret;
    char c[4];
}

И заполнив массив, получить на выходе нужное число. Кстати, функция getDouble 
намекает на выдачу double, а не unsigned int.

-- 
С уважением, Епифанов Сергей

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [devel] Странности с QT
  2011-11-03  5:04       ` Sergei Epiphanov
@ 2011-11-03  6:59         ` Damir Shayhutdinov
  0 siblings, 0 replies; 6+ messages in thread
From: Damir Shayhutdinov @ 2011-11-03  6:59 UTC (permalink / raw)
  To: ALT Linux Team development discussions

> На мой взгляд UTF16 тут ни причём. Вместо извращений с QByteArray, сдвигами и
> прочим проще сделать
>
> union{
>    uint ret;
>    char c[4];
> }
>
> И заполнив массив, получить на выходе нужное число.

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-11-03  6:59 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-02 19:10 [devel] Странности с QT Paul Wolneykien
2011-11-02 21:33 ` Hihin Ruslan
2011-11-02 22:44   ` Paul Wolneykien
2011-11-03  4:32     ` Hihin Ruslan
2011-11-03  5:04       ` Sergei Epiphanov
2011-11-03  6:59         ` Damir Shayhutdinov

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git