Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demiurg от Сентябрь 19, 2013, 13:56



Название: Как работать с QByteArray
Отправлено: demiurg от Сентябрь 19, 2013, 13:56
Собственно сабж!
Сокетом получают массив QByteArray.
В нём данные, разбитые по байтам.

Нужно с С вот такую функцию перегнать...
unsigned int STXBUS_CRC16 (unsigned char  *nData, unsigned char wLength)
 {

 unsigned char  nTemp;
 unsigned int wCRCWord = 0xFFFF;

    while (wLength--)
    {
       nTemp = *nData++ ^ wCRCWord;
       wCRCWord >>= 8;
       wCRCWord ^= wCRCTable[nTemp];
    }
    return wCRCWord;
 }

Проблема в том - как обращаться к элементам массива?
Т.е. допустим передать указатель на 5 байт...А потом двигаться по нему вперёд назад...
Допустим для массива unsigned char - *(nData+5) аналогична nData[5] . А как это реализовать для QByreArray ?

На попытку обращения к элементу... даёт 'QByteArray::operator QNoImplicitBoolCast() const' is private ...


Название: Re: Как работать с QByteArray
Отправлено: Old от Сентябрь 19, 2013, 13:59
Допустим для массива unsigned char - *(nData+5) аналогична nData[5] . А как это реализовать для QByreArray ?
Вы не поверите, также:
nData[5]


Название: Re: Как работать с QByteArray
Отправлено: demiurg от Сентябрь 19, 2013, 14:02
А чож он тогда ругаецО на приведение (unsigned char*)nData[5]


Название: Re: Как работать с QByteArray
Отправлено: Bepec от Сентябрь 19, 2013, 14:20
char   operator[] ( int i ) const
char   operator[] ( uint i ) const

Читайте ассистент. Он отдаёт char, а не char *.



Название: Re: Как работать с QByteArray
Отправлено: demiurg от Сентябрь 19, 2013, 14:26
char   operator[] ( int i ) const
char   operator[] ( uint i ) const
Читайте ассистент. Он отдаёт char, а не char *.
Ступил.
Конечно же.. вот так (unsigned char)nData[5].

Почему в unsigned char не переводит...
Т.е.
QByreArra *data
data[5] эквивалентна *(data+5) - ссылается на элемент.
(unsigned char)data[5] - выдаёт ошибку...
(unsigned char)*data[5] - не выдаёт ошибку. Но я же уже вроде обратился к элементу по указателю...


Название: Re: Как работать с QByteArray
Отправлено: mutineer от Сентябрь 19, 2013, 15:11
QByreArray *data это указатель на QByreArray и чтобы вызвать у него оператор[] надо его сначала разыменовать: (*data)[5]

А вот это data[5] эквивалентно *(data + 5), только data указывает на QByteArray

А ошибки неплохо бы читать и понимать что в них написано, а не просто констатировать факт их наличия


Название: Re: Как работать с QByteArray
Отправлено: demiurg от Сентябрь 19, 2013, 15:25
А вот это data[5] эквивалентно *(data + 5), только data указывает на QByteArray

Так уже ж вроде разыменован...*(data + 5)....К указателю на QByteArray добавляем 5 и разыменовываем. Тоже самое, что data[5]. ???

Цитировать
А ошибки неплохо бы читать и понимать что в них написано, а не просто констатировать факт их наличия
Ну так он и вывел...QByteArray::operator QNoImplicitBoolCast() const' is private...

Цитировать
надо его сначала разыменовать: (*data)[5]
*(*(data)+5)???????
Тогда мы не к указателю добавим 5 , а к содержимому 0 элемента....Не?




Название: Re: Как работать с QByteArray
Отправлено: mutineer от Сентябрь 19, 2013, 15:28
К указателю на QByteArray добавляем 5 и что получаем? Элемент номер 5 в массиве из QByteArray. У тебя есть такой массив и тебе нужен из него QByteArray номер 5? Судя по вопросу нет, QByteArray у тебя один и тебе нужен пятый элемент из него. А для этого надо сделать (*data)[5]

data[5] сработает если data - это объект, а не указатель на объект


Название: Re: Как работать с QByteArray
Отправлено: demiurg от Сентябрь 19, 2013, 15:33
К указателю на QByteArray добавляем 5 и что получаем? Элемент номер 5 в массиве из QByteArray. У тебя есть такой массив и тебе нужен из него QByteArray номер 5? Судя по вопросу нет, QByteArray у тебя один и тебе нужен пятый элемент из него. А для этого надо сделать (*data)[5]
Указатель на 5 элемент. Соответственно *(data+5) - это уже значение элемента. Т.е. data[5]  - значение элемента, а data - указательна QByteArray... ???


Название: Re: Как работать с QByteArray
Отправлено: demiurg от Сентябрь 19, 2013, 15:38
data[5] сработает если data - это объект, а не указатель на объект
Хм, странно.
Я просто в С в основном сижу.

там вот такое
void func (unsigned char *PtR)
{
PtR[5]=10;
};
***
unsigned char array[15];
func(&array[5]);

Запишет в 10 элемент значение 10...


Название: Re: Как работать с QByteArray
Отправлено: mutineer от Сентябрь 19, 2013, 15:38
Блин, нет

Вот указатель на 5 байт из QByteArray
Код
C++ (Qt)
QByteArray data;
data[5];
 

А вот непонятно что:
Код
C++ (Qt)
QByteArray *data;
data[5];
 


Название: Re: Как работать с QByteArray
Отправлено: mutineer от Сентябрь 19, 2013, 15:41
data[5] сработает если data - это объект, а не указатель на объект
Хм, странно.
Я просто в С в основном сижу.

там вот такое
void func (unsigned char *PtR)
{
PtR[5]=10;
};
***
unsigned char array[15];
func(&array[5]);

Запишет в 10 элемент значение 10...

В этом смысле
unsigned char array[15] примерно эквивалентен QByteArray data;

Но ты ведь data объявил указателем на QByteArray. Аналогию с сишным массивом придумай сам

Советую подучить матчасть, ибо в адресной арифметике и указателях ты как-то плаваешь


Название: Re: Как работать с QByteArray
Отправлено: demiurg от Сентябрь 19, 2013, 15:54
В этом смысле
unsigned char array[15] примерно эквивалентен QByteArray data;

Но ты ведь data объявил указателем на QByteArray. Аналогию с сишным массивом придумай сам

Советую подучить матчасть, ибо в адресной арифметике и указателях ты как-то плаваешь
Ну имя массива array - это и есть const указатель на 0 элемент массива. А array[] - как раз разадресует указатель...
Если я объявляю указатель типа unsigned char* ptr; ptr=&array[5], то ptr[5]=0x0А запишет в 10 элемент.
--
data то я опеределил как указатель, но речь то не о data а о *(data+x)(разадресация(указатель+смещение)) иже data[х]....
Получается в C++ с этим по другому?


Название: Re: Как работать с QByteArray
Отправлено: mutineer от Сентябрь 19, 2013, 15:58
В С++ с этим так же. Просто когда ты прибавляешь к char * пятерку, ты получаешь пятый по счету char от твоего указателя. Если ты прибавишь пятерку к QByteArray*, то ты получишь пятый по счету QByteArray начиная от указателя


Название: Re: Как работать с QByteArray
Отправлено: Igors от Сентябрь 19, 2013, 15:59
Нужно с С вот такую функцию перегнать...
unsigned int STXBUS_CRC16 (unsigned char  *nData, unsigned char wLength)
А зачем ее перегонять, просто вызовите ее

Код
C++ (Qt)
QByteArray ba;
...
unsigned int sum = STXBUS_CRC16 ((unsigned char *) ba.data(), ba.size());
 


Название: Re: Как работать с QByteArray
Отправлено: mutineer от Сентябрь 19, 2013, 16:03
Ну и да, в случае QByteArray data эти две записи не эквиваленты:
Код:
data[5];
и
Код:
*(data+5);

Потому что первая разворачивается в data.operator[](5); а вторая в непонятно что


Название: Re: Как работать с QByteArray
Отправлено: demiurg от Сентябрь 19, 2013, 16:15
В С++ с этим так же. Просто когда ты прибавляешь к char * пятерку, ты получаешь пятый по счету char от твоего указателя. Если ты прибавишь пятерку к QByteArray*, то ты получишь пятый по счету QByteArray начиная от указателя
Всё,  въехал.
Он же сдвинет на 5*(размер указателя данного типа-массива)... ;D а не на 5 размеров указателей -составляющих для этого массива.
Получается аналогия для C чтото типа
typedef struct
{
char поле1[х]
поле2
поле3
поле4
} QByteArray;
QByteArray *array;
(*array).поле1[5]

Спасибо :)


Название: Re: Как работать с QByteArray
Отправлено: demiurg от Сентябрь 19, 2013, 16:31
unsigned int sum = STXBUS_CRC16 ((unsigned char *) ba.data(), ba.size());

invalid conversion from 'char*' to 'unsigned char*'...
В том то и прикол - как обратиться к массиву байт внутри QByteArray?


Название: Re: Как работать с QByteArray
Отправлено: Igors от Сентябрь 19, 2013, 16:59
unsigned int sum = STXBUS_CRC16 ((unsigned char *) ba.data(), ba.size());

invalid conversion from 'char*' to 'unsigned char*'...
В том то и прикол - как обратиться к массиву байт внутри QByteArray?
Ну что Вы мне рассказываете сказки Венского леса?  :)  invalid conversion будет без приведения
Код:
unsigned int sum = STXBUS_CRC16 (ba.data(), ba.size());
А если стоит (unsigned char *) ba.data(), то приведет, куда он денется