Size: a a a

Rust — русскоговорящее сообществo

2020 August 09

D

Denis in Rust — русскоговорящее сообществo
ВОУ ВОУ ПАЛЕХЧЕ
источник

Э

Эрик in Rust — русскоговорящее сообществo
Но если там много структур, то на каждую писать такую штуку — неудобно, всё-таки.
источник

Ct

Casual tears in Rust — русскоговорящее сообществo
Эрик
Но если там много структур, то на каждую писать такую штуку — неудобно, всё-таки.
Можно процедурный макрос написать на такое наверное, если очень хочется.
источник

EB

Eva Baka in Rust — русскоговорящее сообществo
Эрик
Вообще, идеальный вариант — делать true Rust структуру из packed C++
struct Unpacked {
 i: i8,
 f: f32
}

impl Unpacked {
 fn from_packed(pack: CppStruct) -> Self {
   const SIZE: usize = mem::size_of<CppStruct>();
   let buf: [u8; SIZE] = unsafe { mem::transmute(pack) };
   Self { i: buf[0] as i8, f: f32::from_ne_bytes(buf[1..]);
 }
}
у меня сейчас что-то подобное и реализовано, но ты прав, что можно сдохнуть для каждой делать подобное
да и гонять туда-сюда биты байты не очень хочется
источник

Э

Эрик in Rust — русскоговорящее сообществo
Там ещё придётся вместо let buf: [u8; N] писать #[repr(C)] Buf([u8; N], [u8; M], [u8; K]) и let buf: Buf = transmute
источник

D

Denis in Rust — русскоговорящее сообществo
просто добавляешь себе в приложение #![deny(safe_packed_borrows)] и горя не знаешь
источник

Э

Эрик in Rust — русскоговорящее сообществo
Но в принципе да, попадает под процедурный макрос.
источник

D

Denis in Rust — русскоговорящее сообществo
источник

Э

Эрик in Rust — русскоговорящее сообществo
Хм...
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну вот, а я тут уже порасписал.
источник

D

Denis in Rust — русскоговорящее сообществo
короче к полям можно обращаться спокойно, главное, ссылку на них не брать, но от этого успешно защищает #![deny(safe_packed_borrows)]
источник

EB

Eva Baka in Rust — русскоговорящее сообществo
ясно всем пока я пошел вешаться
источник

D

Denis in Rust — русскоговорящее сообществo
ну дык а ты как хотел
источник

D

Denis in Rust — русскоговорящее сообществo
делай let f = packed.f; println!("{}", f);
источник

EB

Eva Baka in Rust — русскоговорящее сообществo
ну я это ... как его ... для ДЕБАГА так сказать печятал значения оттуда, вот и падало все =))
источник

D

Denis in Rust — русскоговорящее сообществo
Denis
делай let f = packed.f; println!("{}", f);
^
источник

D

Denis in Rust — русскоговорящее сообществo
println!("{}", { packed.f }); тоже катит
источник

Э

Эрик in Rust — русскоговорящее сообществo
Eva Baka
ну я это ... как его ... для ДЕБАГА так сказать печятал значения оттуда, вот и падало все =))
Да, старая шутка из С про то, что принты валят программу (потому что принтят данные по null указателю).
источник

В

Вафель in Rust — русскоговорящее сообществo
Denis
просто добавляешь себе в приложение #![deny(safe_packed_borrows)] и горя не знаешь
forbid  сразу
источник

AV

A V in Rust — русскоговорящее сообществo
Eva Baka
так мужики помогайте и спасайте, как жить с #[repr(packed)] на arm? при обращении к полю струтуры (но не к первому) все падает. при условии, что те же плюсы это осиливают и работает как надо
я прошу прощения, но зачем тебе packed?
источник