LOADING

加载过慢请开启缓存 浏览器默认开启

Sunshine的博客

Blog website-Mouz.cn

记录日常的收获和发电

更新日志4

2026/8/8

新增了 Projects 项目展示页面,可以在顶栏菜单中进入。
页面展示了我参与和开发的项目,包含 GitHub 统计、项目卡片和技术栈标签云。
项目数据会持续更新,欢迎查看。

阅读全文

域名更新

2026/6/5

由于原来的域名过期了,
并且续费比新搞一个贵很多,我觉得买个好点的域名,以便以后把我的项目都挂起来。
故域名更改为mouz.cn

阅读全文

DarkBeach

2025/11/21

我梦到一片黑色的沙滩,上面中满着紫蔷薇,蔷薇是怎么活下去的呢,我不知道。
我在蔷薇中躺下,蔷薇是带刺的,衣服被划破了,紫蔷薇带红了。
但是紫蔷薇好香啊,香味和痛苦让我无法起身。
就在这里死去吧,让残躯滋润沙滩,下一世,我希望看到红色的玫瑰。

阅读全文

草原

2025/11/21

我看到一片草原,
草原上有个带着阳伞的白桌,
桌上放着面板牛奶和蜂蜜,
所有人都是穿着白衣在草原上跑和笑,
人们做的事情不用价值和效率衡量,
打开日历,今天就是今天,明天就是明天,不是什么截止日期也不是什么工作日休息日。

阅读全文

那就当盆友吧

2025/11/21

她问我爱她吗,我摇头。
我骗了她,我也骗了自己。
我暗示自己不爱任何人,却忍不住幻想有她的未来。
我嫉妒她的恋人,幻想她被背叛的时候找我哭诉,然后我把那个男人揍一顿。
然后她问我爱她吗,我还是摇头。

阅读全文

2025/11/21

有天我死了,我期待大家哭一场然后忘了我,
不用告诉她我爱她,告诉妈妈就行,
我希望把所有财产分给生命中重要的每个人,
然后把骨灰埋进土里面,然后上面种一棵小树。

阅读全文

堂吉诃德

2025/11/21

(写在前面,其实不是什么抑郁,就是半夜脑子爱乱想,
然后我觉得想出来的也不是垃圾,就还是记录一下吧,都是之前写的)
其实我要成为堂吉柯德了,
我幻想共享单车是风驰电掣的摩托,
我幻想亚力克立牌是最温柔美丽的妻子,
我幻想手里有把杀死恶人的枪,
我幻想生活是个伟岸的巨人而我手上也有把利剑,哦,谁愿当我人生的桑丘。

阅读全文

搞了个新电脑

2025/11/21

好吧,其实最近没咋更新。
一大原因是沟槽的软件学院B事情太多了。
另一方面是趁着最后的国补,用攒下来的钱买了个MacBook air M4 16+512,
代码和学习什么的都在MACOS上搞了,WINDOWS游戏本只在玩游戏的时候打开,
并且这个博客网站文件都在WIN机上,老是忘。
还别说MACOS虽然不习惯一些,但是干活学习什么的舒服多了,谁叫WIN11破毛病那么多。

阅读全文

C和Rust混合探索

2025/9/16

前言
先锋的同学鼓励对于C和Rust混合编程的探索,那就开始吧。
面试题内容之前我多多少少略有涉猎,但是Rust我还真没听过。
之前我一直认为C的恼人的手动管理内存和Java基本数据类型无法修改值等问题是存在于是就合理的,似乎是自它们诞生之初就无法改变的特点。但是目前看来Rust给了个解决方案。但是我觉得语言更不美了 :joy:
C和Rust混合探索
Java、Python和C++ 之间的互调用常常依赖于各自的外部函数接口(FFI)或特定的绑定库。
但是ABI主要用于静态编译(源码转机器码,机器码转可执行文件)的语言,例如 C 和 C++。所以C和Rust使用ABI进行互相调用咯。
调用问题(上)
Rust调用C
在Rust中,先要链接c文件(夹)

#[link(name = "your_c")]

需要使用extern “C”来声明”我要调用c咯”

extern "C" {
    fn add_numbers(a: i32, b: i32) -> i32;//问题:这是什么?
}

调用C语言代码时,Rust编译器无法保证内存安全,因为C语言没有内置的内存安全机制。因此,所有的调用都必须放在unsafe{ }里面。

fn main() {
    unsafe {
        let result = add_numbers(10, 20);
        println!("sum: {}", result);
    }
}

数据类型映射
好的,我们不得不先解决数据映射的问题。:worried:
众所周知,rust整数类型按位长度划分(如i8/i16/i32…u8/u16/u32…)且整数常量默认为i32,因此里面的a、b就是属于系统默认的整数类型,跟C里面的int很像对吧。
Rust的标准库提供了许多与C语言类型对应的类型,数据类型互通正如货币互通,这样两边才好说话吧。
直接叫ai帮忙造个表格~~~~懒得手打~~

C 语言类型 Rust 对应类型 备注
char c_char 通常为 i8u8
int c_int 通常为 i32
float c_float 相当于 f32
double c_double 相当于 f64
void c_void 用于指针,如 void * 对应 *mut c_void
char * *mut c_char 指向 C 字符串的可变指针。
const char * *const c_char 指向 C 字符串的不可变指针。
struct #[repr(C)]struct 必须使用 #[repr(C)] 宏保证内存布局兼容。
enum #[repr(C)]enum 必须使用 #[repr(C)] 宏保证大小和布局兼容。

调用问题(下)
好的好的,数据类型映射问题暂时解决了,继续。
C语言调用Rust函数时,首先需要将Rust函数暴露为C语言兼容的ABI。
具体方式是使用#[no_mangle]和extern “C”这两个属性来修饰函数。

#[no_mangle]//告诉编译器不要对函数名进行“名字重整”
pub extern "C" //按照C语言来编订这个函数
fn add_numbers(a: i32, b: i32) -> i32 {
    a + b
}

第二步将Rust代码编译成一个C动态链接库或者静态链接库(这样C语言才能调用)如示例:

[lib]
name = "rust_lib"
crate-type = ["cdylib"]

然后运行

cargo build --release

生成的库文件将默认位于target/release/目录下。(先锋示例好像没有,是要我自己来吗?)
最后,在C语言代码中,就可以像调用其他C函数一样调用这个Rust函数。

extern int rust_add(int a, int b);// 记得声明Rust函数

但是,先锋示例也不是这样喵。
方法是提供了个头文件,有点像接口。

// rust_functions.h
#ifndef RUST_FUNCTIONS_H
#define RUST_FUNCTIONS_H

int add_numbers(int a, int b);
int multiply_numbers(int a, int b);
#endif

这样其他文件只需要 #include 这个头文件就行了,可以调用了。好吧,这也是种省事的方法。

阅读全文

galgame尝试小记

2025/8/6

一直以来都有自己制作galgame的想法…
暑假花了一些时间尝试使用Ren’Py引擎制作自己的同人galgame《期末周与欧娜尼》
不得不说Ren’Py的语法真的好简单,几乎没啥技术门槛(可能是我不够深入)
为了配音,我还学习了GPT-SoVITS-v2pro训练ai语音的方法(还做了个五字神人小视频)
虽然配音听起来ai味确实很重,但作为练手是足够了
游戏的demo版本已经上传到github上了,感兴趣的可以尝尝(虽然比较粗糙)…

PS:JAVA期末拾遗还是比较成功的,最后拿了4.0.

阅读全文
avatar
Sunshine

东北大学 软件学院
喜欢二次元、打游戏,努力学习中