указатель sadr является типом char мне нужно перопределить его на типы на int и double
int a;
double b;
void cr(char **sadr)
{
*(*wtadr) = a;//если буду так делать запишет только один байт
*(*wtadr) = b;//здесь тоже только один байт
}
Код опасный. Лучше делать так:
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;
}
Здравствуйте, 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.
Здравствуйте, 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 предложил работает.
Здравствуйте, 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>
Парсер пишешь или байты с регистров читаешь?
Здравствуйте, 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>Парсер пишешь или байты с регистров читаешь?
нет статистическое вычисление что бы не запутаться.
Здравствуйте, awqez, Вы писали:
K>>Парсер пишешь или байты с регистров читаешь?
A>нет статистическое вычисление что бы не запутаться.
Я бы наоборот сказал "что бы запутаться"
Здравствуйте, 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.