Конвертация типа указателя
От: awqez  
Дата: 04.05.13 23:19
Оценка:
указатель sadr является типом char мне нужно перопределить его на типы на int и double
int a;
double b;
void cr(char **sadr)
{
*(*wtadr) = a;//если буду так делать запишет только один байт
*(*wtadr) = b;//здесь тоже только один байт
}
Re: Конвертация типа указателя
От: ArtDenis Россия  
Дата: 05.05.13 03:52
Оценка:
Код опасный. Лучше делать так:

int a;
double b;

typedef boost::variant<int, double> IntOrDouble;
void cr(IntOrDouble &value)
{
    value = a;
    value = b;
}


Ну если уж совсем сильно хочется, то вот:
int a;
double b;
void cr(char *adr)
{
    *reinterpret_cast<int*>(adr) = a;
    *reinterpret_cast<double*>(adr) = b;
}
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Конвертация типа указателя
От: Mazay Россия  
Дата: 05.05.13 07:28
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Код опасный. Лучше делать так:


AD>
AD>int a;
AD>double b;

AD>typedef boost::variant<int, double> IntOrDouble;
AD>void cr(IntOrDouble &value)
AD>{
AD>    value = a;
AD>    value = b;
AD>}
AD>

Таки да.

AD>Ну если уж совсем сильно хочется, то вот:

AD>
AD>int a;
AD>double b;
AD>void cr(char *adr)
AD>{
AD>    *reinterpret_cast<int*>(adr) = a;
AD>    *reinterpret_cast<double*>(adr) = b;
AD>}
AD>

Только если там с выравниванием всё в порядке. По-хорошему бы иметь гарантию, что adr когда-то был указателем именно на int или double.
Главное гармония ...
Re[3]: Конвертация типа указателя
От: awqez  
Дата: 06.05.13 16:36
Оценка:
Здравствуйте, Mazay, Вы писали:

M>Здравствуйте, ArtDenis, Вы писали:


AD>>Код опасный. Лучше делать так:


AD>>
AD>>int a;
AD>>double b;

AD>>typedef boost::variant<int, double> IntOrDouble;
AD>>void cr(IntOrDouble &value)
AD>>{
AD>>    value = a;
AD>>    value = b;
AD>>}
AD>>

M>Таки да.

AD>>Ну если уж совсем сильно хочется, то вот:

AD>>
AD>>int a;
AD>>double b;
AD>>void cr(char *adr)
AD>>{
AD>>    *reinterpret_cast<int*>(adr) = a;
AD>>    *reinterpret_cast<double*>(adr) = b;
AD>>}
AD>>

M>Только если там с выравниванием всё в порядке. По-хорошему бы иметь гарантию, что adr когда-то был указателем именно на int или double.

здесь мне предложили вот так сделать

*((int*)(*wtadr)) = a;
*((double*)(*wtadr)) = b;

вызывает ошибку — "программа вызвала ошибку" и т. д. почему так вроде и нудно преопределять типы.
а как Mazay предложил работает.
Re: Конвертация типа указателя
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 06.05.13 16:58
Оценка:
Здравствуйте, awqez, Вы писали:

A>указатель sadr является типом char мне нужно перопределить его на типы на int и double

A>
A>int a;
A>double b;
A>void cr(char **sadr)
A>{
A>*(*wtadr) = a;//если буду так делать запишет только один байт
A>*(*wtadr) = b;//здесь тоже только один байт
A>}
A>

Парсер пишешь или байты с регистров читаешь?
Sic luceat lux!
Re[2]: Конвертация типа указателя
От: awqez  
Дата: 06.05.13 17:47
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, awqez, Вы писали:


A>>указатель sadr является типом char мне нужно перопределить его на типы на int и double

A>>
A>>int a;
A>>double b;
A>>void cr(char **sadr)
A>>{
A>>*(*wtadr) = a;//если буду так делать запишет только один байт
A>>*(*wtadr) = b;//здесь тоже только один байт
A>>}
A>>

K>Парсер пишешь или байты с регистров читаешь?

нет статистическое вычисление что бы не запутаться.
Re[3]: Конвертация типа указателя
От: ArtDenis Россия  
Дата: 08.05.13 05:14
Оценка: +3
Здравствуйте, awqez, Вы писали:

K>>Парсер пишешь или байты с регистров читаешь?


A>нет статистическое вычисление что бы не запутаться.


Я бы наоборот сказал "что бы запутаться"
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Конвертация типа указателя
От: __kot2  
Дата: 08.05.13 20:59
Оценка:
Здравствуйте, awqez, Вы писали:
A>нет статистическое вычисление что бы не запутаться.
значит что-то неправильно делаешь
Re: Конвертация типа указателя
От: artem.komisarenko Украина  
Дата: 08.05.13 21:14
Оценка:
Здравствуйте, awqez, Вы писали:

A>
A>int a;
A>double b;
A>void cr(char **sadr)
A>{
A>*(*wtadr) = a;//если буду так делать запишет только один байт
A>*(*wtadr) = b;//здесь тоже только один байт
A>}
A>


Есть как минимум две причины так не делать. Первая называется alignment, вторая — strict aliasing.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.