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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Приведение типа.  (Прочитано 15770 раз)
andrew.k
Гость
« Ответ #30 : Август 24, 2012, 16:11 »

У меня просто сторонняя библиотека, у которой прописаны свои типы данных, дабы охватить наибольшее количество платформ, поэтому и не хранится там ничего в стандартных типах, типа тех же чаров! А насчет reinterpret_cast - если знаешь, что типы приводятся друг к другу, то как может работать 50 на 50? Если приводится, то приводится, если нет, то нет)))
Обычно там что-то вроде #typedef char * LibCharArray, такие типы компилятор должен автоматом приводить, к стандартным.
А вообще похоже Пантер прав про сериализацию.
Записан
OKTA
Гость
« Ответ #31 : Август 24, 2012, 18:25 »

Нет, не приводит автоматически!  А чем сериализация выигрывает?
Записан
andrew.k
Гость
« Ответ #32 : Август 24, 2012, 18:56 »

Нет, не приводит автоматически!  А чем сериализация выигрывает?
Удобнее и логичнее, наверное.
Записан
andrew.k
Гость
« Ответ #33 : Август 24, 2012, 19:03 »

Нет, не приводит автоматически!
А gcc приводит совершенно спокойно. Думаю и остальные должны.
upd. mingw тоже все прекрасно кушает.

Код
C++ (Qt)
typedef char * MyString;
 
{
 MyString s = "test string";
 printf("s = %s"\n", s);
 qDebug() << QString(s);
}
Все прекрасно работает без приведений Улыбающийся
« Последнее редактирование: Август 24, 2012, 19:05 от andrew.k » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


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

Нет, не приводит автоматически!  А чем сериализация выигрывает?

код?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

А gcc приводит совершенно спокойно. Думаю и остальные должны.
upd. mingw тоже все прекрасно кушает.

Код
C++ (Qt)
typedef char * MyString;
 
{
 MyString s = "test string";
 printf("s = %s"\n", s);
 qDebug() << QString(s);
}
Все прекрасно работает без приведений Улыбающийся
Непонимающий А какие тут приведения? У qDebug есть оператор << принимающий QString (экземпляр которого Вы создали)

Нет, не приводит автоматически!  А чем сериализация выигрывает?
Тем что это солидно и надежно. Рано или поздно сериализовать придется. Без этого воспользоваться записанным (raw data) проблематично, считанный объект легко может оказаться невалидным. Все начинают с такого чтенмя/записи как у Вас, и все равно приходят к сериализации (вопрос времени)
Записан
andrew.k
Гость
« Ответ #36 : Август 24, 2012, 22:55 »

А gcc приводит совершенно спокойно. Думаю и остальные должны.
upd. mingw тоже все прекрасно кушает.

Код
C++ (Qt)
typedef char * MyString;
 
{
 MyString s = "test string";
 printf("s = %s"\n", s);
 qDebug() << QString(s);
}
Все прекрасно работает без приведений Улыбающийся
Непонимающий А какие тут приведения? У qDebug есть оператор << принимающий QString (экземпляр которого Вы создали)
приведений масса. Конечно не в qDebug, а в QString. Откуда он знает про новый тип MyString? Не знает, а компилятор выполняет автоматическое приведение типов, т.к. они совместимы с известным кустрингу char *.
C printf может и не удачный пример, там параметры хитро передаются.
В любом случае везде где на входе будет char *, можно будет подавать MyString, в отличие например от С, где типизация более строгая и такой фокус не прокатит, если мне не изменяет память.
и надо было бы писать QString((char *)s), если бы в С были были кустринги)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #37 : Август 24, 2012, 23:29 »

typedef не создает новых типов, а лишь создает алиасы (новые имена, псевдонимы), поэтому при компиляции там будет именно char *
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
andrew.k
Гость
« Ответ #38 : Август 24, 2012, 23:40 »

typedef не создает новых типов, а лишь создает алиасы (новые имена, псевдонимы), поэтому при компиляции там будет именно char *
Действительно. typeid возвращает одно и тоже для этих типов.
Видимо мои знания устарели или уже забыл, но в Си без плюсов это был разные типы на сколько я помню.
По крайней мере в том компиляторе, что был у меня)

В любом случае в библиотеках собственные типы часто делаются через typedef, что подтвердил ТС.
Поэтому я и стал спрашивать, почему у него что-то не приводится.
« Последнее редактирование: Август 24, 2012, 23:42 от andrew.k » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #39 : Август 25, 2012, 02:06 »

нет, в С точно так же, хотя правильнее было бы сказать «в С++ точно так же, как и в С»
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
OKTA
Гость
« Ответ #40 : Август 25, 2012, 08:20 »

Так, сериализация - перевод структуры в последовательность бит - верно? Если у меня есть указатель на данные и их длина, то данные уже сериализированы? Или я путаю?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Так, сериализация - перевод структуры в последовательность бит - верно?
Ну можно и так сказать, только байт а не бит.

Если у меня есть указатель на данные и их длина, то данные уже сериализированы? Или я путаю?
Путаете. Сериализации создает "хранимые" данные, т.е. то из чего десериализацией можно снова получить объект/структуру. Эти данные не равны дампу структуры в памяти. Простой пример
Код
C++ (Qt)
struct MyStruct {
int mID;
char * mName;
};
 
Добавив MyStruct в QByteArray (как у Вас сейчас) Вы затем не сможете его восстановить.

Действительно. typeid возвращает одно и тоже для этих типов.
Видимо мои знания устарели или уже забыл, но в Си без плюсов это был разные типы на сколько я помню.
По крайней мере в том компиляторе, что был у меня)
Наверное имелось ввиду объявление структуры на С
Код
C++ (Qt)
typedef struct {
int mID;
...
} MyStruct, * MyStructPtr;
 
Все равно нового типа typedef не создает, просто дает безымянной структуре имя   
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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