不高端。我本来想收台工业级的3d打印机回来改造的。好不容易有台看中的聊了半天人家又不卖了。
一怒之下找个比较好的开源方案先搭起来后面再改造。
你这个学了一天也没法多要求你什么...rust确实学习曲线还是比较陡的...
但你想下,这么典型的需求,怎么可能支持不了...
我先贴段代码:
#[derive(Debug)]
enum SafeIntOrFloat {
Float(f32, f32),
Integer(i32, i32),
}
union IntOrFloat {
i: u32,
f: f32,
}
fn main() {
let mut a: SafeIntOrFloat = SafeIntOrFloat::Float(0.1, 0.2);
println!("enum: {:?}", a);
a = SafeIntOrFloat::Integer(2, 3);
println!("enum: {:?}", a);
let mut b: IntOrFloat = IntOrFloat { i: 1 };
b.i = 2;
let i = unsafe { b.i };
let f = unsafe { b.f };
println!("union: {} {}", i, f);
}
这段代码要讲2个事情,首先rust可以随时用unsafe退回到c状态,比如c版本的union在rust里面也叫union,只不过是unsafe的,需要封装一下把unsafe包起来,如这段代码所演示的。你要是嫌封装unsafe是脱裤子放屁,那可以直接把所有代码都用unsafe来写,只不过这样用rust是为了图啥呢...
其次rust里更好的做法是不要用union这么原始的(直接操作内存的)东西,而是应该用enum。enum的作用和union本质上是一样的,也是同一块内存,记录不同类型的数据。但它已经封装好了不需要你去考虑具体的内存问题。当你需要把enum转换成数据流发出去的时候,你给他整一个serializer/deserializer。这才是更为通行的做法。
当然这个做法性能是有损失的,serdes一般来说会有协议结构,会有内存复制。而c下面的做法其实本质上就是个dummy serdes,也即直接把内存指针指向的内容丢出去。但这个方法本身就是诸多问题的根源,诸如alignment,big/little endian等等。rust里面理论上也可以做个类似的dummy serdes,但enum是有额外的内存占用来记录更多的meta信息,我相当怀疑这么搞的通用性。
总的来说,田园时代就是眉毛胡子一把抓,而现在系统复杂了之后是很讲抽象和设计的。好的设计可以把问题消灭于无形。比如你用c处理网络数据的时候要手动做big/little endian转换,这个本质上就是人肉实现的serdes,这种东西本身就不应该让人去操心。
【 在 dismoon 的大作中提到: 】
: 什么高端3D打印机还有上位机?
: 现在的3D打印机不都是直接弄个TF卡上面拷了STL或者STEP就能打印的么
: 说到rust的指针,我就举个例子
: ...................
--
修改:lvsoft FROM 180.111.26.*
FROM 180.111.26.*