我正在将一个ARM芯片的程序从IAR编译器移植到gcc.
在原始代码中,IAR特定的运算符如__segment_begin和__segment_size用于分别获取某些内存段的开头和大小.
有没有办法和海湾合作委员会做同样的事情?我查了GCC手册,却找不到任何相关内容.
更多细节:所讨论
的存储器段必须位于固定位置,以便程序可以正确连接芯片上的某些外设.原始代码使用__segment_begin运算符来获取此内存的地址,并__segment_size确保它不会溢出此内存.
我可以通过添加变量来指示这些内存段的开始和结束来实现相同的功能,但是如果GCC具有类似的运算符,这将有助于最小化编译器相关代码的数量,我最终必须编写和维护.
我编写了以下方法,使用Flate2库中的GzDecoder从 gzip压缩文件解析二进制数据
fn read_primitive<T: Copy>(reader: &mut GzDecoder<File>) -> std::io::Result<T>
{
let sz = mem::size_of::<T>();
let mut vec = Vec::<u8>::with_capacity(sz);
let ret: T;
unsafe{
vec.set_len(sz);
let mut s = &mut vec[..];
try!(reader.read(&mut s));
let ptr :*const u8 = s.as_ptr();
ret = *(ptr as *const T)
}
Ok(ret)
}
Run Code Online (Sandbox Code Playgroud)
它有效,但我对代码并不是特别满意,尤其是使用虚拟向量和临时变量ptr.这对我来说都是非常不优雅的,我相信有更好的方法可以做到这一点.我很高兴听到有关如何清理此代码的任何建议.
为什么以下Rust代码会出错?
fn getVecSlice(vec: &Vec<f64>, start: i32, len: i32) -> &[f64] {
vec[start..start + len]
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是
the trait `core::ops::Index<core::ops::Range<i32>>` is not implemented for the type `collections::vec::Vec<f64>` [E0277]
Run Code Online (Sandbox Code Playgroud)
在后来的Rust版本中,我得到了
error[E0277]: the trait bound `std::ops::Range<i32>: std::slice::SliceIndex<[f64]>` is not satisfied
--> src/main.rs:2:9
|
2 | vec[start..start + len]
| ^^^^^^^^^^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[f64]>` is not implemented for `std::ops::Range<i32>`
= note: required because of the requirements on the impl of `std::ops::Index<std::ops::Range<i32>>` …Run Code Online (Sandbox Code Playgroud) 我通过Google 找到了 Primitive,但它似乎是来自测试版之前的版本,我的编译器(测试版3)抱怨它无法找到它.有人能指出我搬到哪里或者是否有同等的东西?网络搜索并没有带来任何有希望的东西