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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Приведение типа.  (Прочитано 15680 раз)
OKTA
Гость
« : Август 24, 2012, 10:00 »

Товарищи! Вопрос! Есть ли возможность без приведения типов засунуть например в QByteArray данные, если я знаю указатель на них и их размер? Указатель соответственно левого типа!
« Последнее редактирование: Август 24, 2012, 12:21 от OKTA » Записан
Bepec
Гость
« Ответ #1 : Август 24, 2012, 10:12 »

Неа, вроде. Нужно указатель привести к нужному типу. У тебя компилятор с ума сойдёт по идее.

PS хотя вон недавно библиотеку собирать пытался одну - там какой то компилятор использовался С++, который позволял всякие массивы переменной длины, так что мб и есть такие компиляторы Веселый
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Август 24, 2012, 10:12 »

Простой вариант с приведением:
Код
C++ (Qt)
byteArray.append( reinterpret_cast< const char * >( &data ), size );

А без приведения можно через QDataStream сериализацию сделать определив:
Код
C++ (Qt)
QDataStream& operator << ( QDataStream& out, const YourData& data );
QDataStream& operator >> ( QDataStream& in, YourData& data );
Но кода будет значительно больше, зато можно адекватно сохранять динамические данные.
Записан
andrew.k
Гость
« Ответ #3 : Август 24, 2012, 10:24 »

Код
C++ (Qt)
QByteArray QByteArray::fromRawData ( const char * data, int size )
QByteArray & QByteArray::setRawData ( const char * data, uint size )
при этом буфер должен оставаться валидным, пока используется массив, буфер нужно будет удалить самостоятельно, QByteArray его не удалит.
Записан
OKTA
Гость
« Ответ #4 : Август 24, 2012, 10:29 »

Код:
byteArray.append( reinterpret_cast< const char * >( &data ), size );
Да, вот этот вариант работает! Попутно прочел, что reinterpret_cast - самый опасный способ и результат не всегда гарантирован!

с RawData не пойдет, т.к. указатель все равно надо перед этим привести к char!
Записан
Bepec
Гость
« Ответ #5 : Август 24, 2012, 10:32 »

reinterpret_cast - Программист сам дурак, если ошибся Веселый Веселый
dynamic_cast - я всё за тобой проверю Веселый
Записан
andrew.k
Гость
« Ответ #6 : Август 24, 2012, 10:36 »

Код:
byteArray.append( reinterpret_cast< const char * >( &data ), size );
Да, вот этот вариант работает! Попутно прочел, что reinterpret_cast - самый опасный способ и результат не всегда гарантирован!
А это че типа не приведение типа?

с RawData не пойдет, т.к. указатель все равно надо перед этим привести к char!
А у тебя какая-то детская фобия, что ты типы боишься приводить?

А вообще, похоже ты что-то делаешь не так.
append копирует данные кстати.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Август 24, 2012, 10:56 »

dynamic_cast - я всё за тобой проверю Веселый
В данном случае он не применим, так как типы скорее всего не приводимы.


с RawData не пойдет, т.к. указатель все равно надо перед этим привести к char!
ORLY?
То что кастуется к char не означает, что оно по нулю закончится.
Записан
OKTA
Гость
« Ответ #8 : Август 24, 2012, 10:58 »

Как я понял, без приведения никак, поэтому и говорю, что вариант работает)
Да, сам понял, что append копирует уже, пробую с setRawData! Спасибо!
А почему кажется, что что-то не так?))) Не сразу просто вдуплил в твой совет с setRawData - не свел одно к другому в торопях))

Ужас какой вычитал!

dynamic_cast<derv_class *>(base_class_ptr_expr)
Используется RTTI (Runtime Type Information), чтобы привести один указатель на объект класса к другому указателю на объект класса. Классы должны быть полиморфными, то есть в базовом классе должна быть хотя бы одна виртуальная функция. Если эти условие не соблюдено, ошибка возникнет на этапе компиляции. Если приведение невозможно, то об этом станет ясно только на этапе выполнения программы и будет возвращен NULL.
Записан
OKTA
Гость
« Ответ #9 : Август 24, 2012, 11:00 »

Dynamic_cast не подойдет, т.к. const char * не указатель на класс!! 
Записан
OKTA
Гость
« Ответ #10 : Август 24, 2012, 11:14 »

Или я что-то недопонимаю?)
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #11 : Август 24, 2012, 12:14 »

Или я что-то недопонимаю?)
Всё правильно понимаешь )
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Август 24, 2012, 13:07 »

Код:
byteArray.append( reinterpret_cast< const char * >( &data ), size );
Да, вот этот вариант работает! Попутно прочел, что reinterpret_cast - самый опасный способ и результат не всегда гарантирован!
Эта запись равноценна
Код
C++ (Qt)
byteArray.append( (char *) &data, size );
 
В обоих случаях это плохо, проблемы с доставанием записанного назад практически обеспечены. Достоинство reinterpret_cast в том что эта длинная сопля бросается в глаза и как бы сигналит "здесь плохо"  Улыбающийся
Записан
Bepec
Гость
« Ответ #13 : Август 24, 2012, 13:10 »

Достоинство реинтерпрет каста в том, что из 1 байта при помощи такой то матери, он может сделать трёхмерную матрицу и не падать в 50% случае.
Записан
andrew.k
Гость
« Ответ #14 : Август 24, 2012, 13:21 »

А почему кажется, что что-то не так?))) Не сразу просто вдуплил в твой совет с setRawData - не свел одно к другому в торопях))
Потому что у тебя массив данных хранится не в массиве чаров, а непонятно в чем и тебе приходится что-то приводить. Всякого рода IO девайсы работают обычно с массивом чаров (я о сторонних библиотеках). Откуда у тебя что-то другое не ясно.
а с setRawData тебе надо все время помнить, что массив данных должен жить, до тех пор, пока ты работаешь с экземпляром QByteArray, даже если ты его передал в сигнале или параметром.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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