我试图找到一种方法来构建一个结构来保存一个可以处理任何数据类型的动态数组(包括用户定义的数据类型),到目前为止,这就是我想出的.
#define Vector(DATATYPE) struct { DATATYPE* data; size_t size; size_t used; }
typedef Vector(int) int_Vector;
int main(int argc, char* argv[]){
int_Vector vec;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然这很有效但我很想知道,这是一个好习惯吗?我应该做这样的事情还是有更好的方法?还有一种方法可以实现这个typedef Vector(int) int_vector部分.基本上这种方式可以让我使用数组,就像c ++使用模板一样,它看起来像这样:
#define Vector(DATATYPE) struct { DATATYPE* data; size_t size; size_t used; }
int main(int argc, char* argv[]){
Vector(int) vec;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
主要是为了避免这么多的typedef并将它们全部放在一个名字下面.
我有一个阅读器,其中包含有关 51*51 网格的信息,其中网格上的每个点都由f32. 我想将这些数据读入向量中,以便我可以轻松处理它:
pub fn from_reader<R: Read + Seek>(reader: &mut R) -> Arena {
let arena_size = 51 * 51;
let arena_byte_size = arena_size * size_of::<f32>();
let mut arena = vec![0.0f32; arena_size];
unsafe {
let mut arena_slice =
std::slice::from_raw_parts_mut(arena.as_mut_ptr() as *mut u8, arena_byte_size);
let _ = reader.read(&mut arena_slice);
};
//...
}
Run Code Online (Sandbox Code Playgroud)
此方法不方便且不必要地缓慢,因为它强制向量的所有元素都使用 0 值进行初始化。我最初想简单地分配一个缓冲区,而不是初始化它,将数据读入其中,然后用from_raw_parts它来创建一个向量。然而,我被告知这是未定义的行为,因为出于某种难以理解的原因,read并且read_exact要求调用者在调用它们中的任何一个之前初始化传递给它们的数据。
为什么会这样呢?有什么解决方法吗?Rust 团队正在研究任何解决方案吗?
我正在使用linux系统(特别是arch linux),并且试图从官方glfw页面上编译引入项目,但似乎无法让gcc对其进行编译。如果有人不知道我说的是这个。
这也是我试图编译它的方式:
gcc -Iinclude test.c -o test -lglfw3 -lm -lGL -lGLU
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:
/usr/bin/ld: cannot find -lglfw3
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我也尝试使用-lglfw标志进行编译,只是得到相同的错误。我通过进入主glfw目录并键入以下命令来安装glfw:
cmake .
make
Run Code Online (Sandbox Code Playgroud)
有什么想法我做错了吗?
正如标题所示,我正在编写一个内核模块,我希望该模块创建的字符设备自动显示。我可以在我的and中使用mknodand来创建和删除设备吗?rmmodule_initmodule_exit
编辑:不确定这是否允许,但作为问题的扩展,我在哪里可以找到更多这样的信息?我的大多数谷歌搜索都会导致对非常旧的信息(内核 2.6 及更早版本)感到非常困惑,学习如何编写内核模块的最佳位置是什么?
我想打开一个文件,但如果我的程序无法打开它,我想向用户打印一条错误消息并提前退出。
use std::fs::File;
fn main() {
let file = "something.txt";
let file = match File::open(file) {
Ok(val) => val,
Err(e) => {
//err_string is not a real function, what would you use?
println!("failed to open file: {}", e.err_string());
return;
}
};
}
Run Code Online (Sandbox Code Playgroud) 我正在查看 cppreference 上的 printf 文档(https://en.cppreference.com/w/c/io/fprintf),我注意到当使用z修饰符和d说明符时,类型被列为“signed size_t”。这让我很好奇,所以我研究了为什么它不使用,ssize_t只是发现它ssize_t是 POSIX 类型而不是标准类型。那么,这期待什么类型呢?ssize_t除了寻找签名类型之外,我找不到任何其他东西size_t。
编辑:为了澄清,我问我将使用什么数据类型来表示签名size_t
我现在正在使用向量和矩阵,有人建议我应该使用SSE而不是使用float数组.然而,在阅读C内在函数和汇编指令的定义时,看起来有一些函数的不同版本,其中向量必须是"16字节对齐",而较慢的版本,其中向量未对齐.矢量是16字节对齐的意思是什么?如何确保我的向量是16字节对齐的?