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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как работать с QByteArray  (Прочитано 16414 раз)
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 ...
« Последнее редактирование: Сентябрь 19, 2013, 13:59 от demiurg » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Сентябрь 19, 2013, 13:59 »

Допустим для массива unsigned char - *(nData+5) аналогична nData[5] . А как это реализовать для QByreArray ?
Вы не поверите, также:
nData[5]
Записан
demiurg
Гость
« Ответ #2 : Сентябрь 19, 2013, 14:02 »

А чож он тогда ругаецО на приведение (unsigned char*)nData[5]
Записан
Bepec
Гость
« Ответ #3 : Сентябрь 19, 2013, 14:20 »

char   operator[] ( int i ) const
char   operator[] ( uint i ) const

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

Записан
demiurg
Гость
« Ответ #4 : Сентябрь 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] - не выдаёт ошибку. Но я же уже вроде обратился к элементу по указателю...
« Последнее редактирование: Сентябрь 19, 2013, 14:55 от demiurg » Записан
mutineer
Гость
« Ответ #5 : Сентябрь 19, 2013, 15:11 »

QByreArray *data это указатель на QByreArray и чтобы вызвать у него оператор[] надо его сначала разыменовать: (*data)[5]

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

А ошибки неплохо бы читать и понимать что в них написано, а не просто констатировать факт их наличия
Записан
demiurg
Гость
« Ответ #6 : Сентябрь 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 элемента....Не?


« Последнее редактирование: Сентябрь 19, 2013, 15:28 от demiurg » Записан
mutineer
Гость
« Ответ #7 : Сентябрь 19, 2013, 15:28 »

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

data[5] сработает если data - это объект, а не указатель на объект
« Последнее редактирование: Сентябрь 19, 2013, 15:30 от mutineer » Записан
demiurg
Гость
« Ответ #8 : Сентябрь 19, 2013, 15:33 »

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

data[5] сработает если data - это объект, а не указатель на объект
Хм, странно.
Я просто в С в основном сижу.

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

Запишет в 10 элемент значение 10...
Записан
mutineer
Гость
« Ответ #10 : Сентябрь 19, 2013, 15:38 »

Блин, нет

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

А вот непонятно что:
Код
C++ (Qt)
QByteArray *data;
data[5];
 
Записан
mutineer
Гость
« Ответ #11 : Сентябрь 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. Аналогию с сишным массивом придумай сам

Советую подучить матчасть, ибо в адресной арифметике и указателях ты как-то плаваешь
Записан
demiurg
Гость
« Ответ #12 : Сентябрь 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++ с этим по другому?
« Последнее редактирование: Сентябрь 19, 2013, 15:56 от demiurg » Записан
mutineer
Гость
« Ответ #13 : Сентябрь 19, 2013, 15:58 »

В С++ с этим так же. Просто когда ты прибавляешь к char * пятерку, ты получаешь пятый по счету char от твоего указателя. Если ты прибавишь пятерку к QByteArray*, то ты получишь пятый по счету QByteArray начиная от указателя
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 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());
 
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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