Thursday, January 25, 2018

Foreign Function Interface of Rust

I am trying to figure out how to run Rust program in our C-written system. Then I read the FFI document.

There is a simple example.

Rust code: mymod.rs
#![crate_type = "staticlib"]
#[no_mangle]
pub extern fn hello_rust() -> *const u8
{
  "Hello from Rust\0".as_ptr()
}

C code: main.c

#include <stdio.h>

extern const char* hello_rust();

int main()
{
    printf("%s\n", hello_rust());
    return 0;
}


Build and run
$ rustc  mymod.rs --emit obj
$ gcc -c main.c -Wall
$ gcc main.o mymod.o
$ ./a.out
Hello from Rust

Notice:
Remember to use "no_mangle" attribute in the Rust source code to avoid name mangling. You can use "objdump -t" to see the symbols of a object file.

Next question:
How to load C headers into Rust program.

Monday, November 30, 2015

我和托福的相遇

半个多月前一天,门外有猫叫声,我开门,看到一只瘦小的猫,让人心疼。我把她引到门口,内心OS“快进来,快进来”,她果然跳跃着进了我家。

一直想养猫,一直想以后稳定了养一只。因此,在这不该相遇的时刻,遇到她,我是有别的打算的:给爷爷养,农村里条件再差,也比她流浪好;网上发个帖,想养猫的人多了去了,一定有人要。

一天,两天,三天 …… 也没几天,她可爱且粘人,躺在我旁边或者腿上睡觉,我去哪儿她要跟着,我越来越喜欢她。奶奶说爷爷已经有猫,不需要了。我网上发帖,有挺多人回复说要,但我留下了手机号、微信号,并没有人联系我,我觉得,也许他们只是一时想养,之后细思,又不愿意了吧。在一群里问,一同学或许是好意想帮个忙,但似乎对养猫也不是很有心思,说他要养,我也不放心给他。

一周,两周,到现在差不多三周了,我充分体验到了养猫的欢乐与辛苦,当然,欢乐远大于那点辛苦。我还给她取了名字,叫托福,因为她来的那天,我还在备考托福,充满悲与苦,她的降临却带给我幸福。我第一次知道,养猫是需要耐心的,他们并不是只有惹人爱的一面,更有调皮捣蛋闹翻天的一面,需要养猫人慢慢引导才可和谐相处。我越来越爱她了。

然而,现实的问题摆在面前,我只是暂居老家,不出意外的话,明年会去美帝。带她去美帝的时间成本和金钱成本都比较高,和男友商量后,觉得可以克服。还有一个小问题,我父母不太理解我喜欢猫的心情,不过恰当的沟通可以解决此问题。我开始预想实施过程,想到,这么远的行程,对托福的身体也是极大挑战啊,风险很大,并且我一个人,又带行李又带猫,也十分困难。

最近,时不时就纠结一下,是带托福去美帝,还是给她另找一个靠谱的家?

Tuesday, April 22, 2014

To be professional

前老大经常对我们说的一句话,现在觉得,真的很重要啊

Sunday, February 17, 2013

C语言中inline和宏的区别

刚才看书的时候突然想到,C语言中inline函数和宏定义的函数是一样的嘛,有宏了为啥还要inline这个东西呢。就问了弟弟,弟弟详细解答了。

 

  1. 处理的阶段不一样。inline是在编译阶段处理的,宏是在预处理阶段处理的。
  2. inline函数是被分配symbol的,是可以取地址的,也就是说链接器看得懂call inline这样的指令。
  3. inline函数会对参数类型进行检查。宏在预处理阶段不检查参数类型,因此宏可以实现类似泛型的东西。比如
#define max(a,b) (a>b? a: b)
它其实是一个泛型的概念。
但inline就不是了
inline max(int a, int b) {
   return a>b? a: b;
}

 

弟弟讲得挺清楚的。

Monday, May 14, 2012

5-cell

原来上一篇所说的正四维体的官方名字叫5-cell。

之前都在凭空想象,其实建立四维空间坐标系,把五个顶点的坐标标出来,就可以推得5-cell的所有性质了。有空了算算坐标,wikipedia上面也给出了。

参考:http://en.wikipedia.org/wiki/5-cell

Sunday, May 13, 2012

最简单的正四维体

早上7点起来,猴哥说他在想最简单的四维体投射到三维空间的正投体和侧投体。思考和讨论之后得到一些结论,觉得很有趣,就记下来。

最简单的正四维体

先从我们最熟悉的二维、三维开始考虑。

最简单的正二维体是正三角形,由三条一维的直线围成,三个顶点;最简单的正三维体是正三棱锥,由四个二维的正三角围成,四个顶点;然后,最简单的正四维体,由五个三维的正三棱锥围成,五个顶点

猴哥说:封闭体的截面也是封闭的。由这条可以推导出上面三个结论)

同时,可推测出最简单的正四维体的三截体(三维体的叫截面,所以我给四维的截体取了这个名字)是正三棱锥。

总结:最简单的正四维体有五个顶点,由五个三维的正三棱锥围成,三截体为正三棱锥。

正投体

任意维体投射到其维度的低维空间时,该维体的顶点个数是不变的,只是有时候有的顶点重合在其它的顶点上或者边上,看不见了而已。

四维和三维二维一样,也有垂直的概念。从垂直于正四维体中某个正三椎体所在的三维空间的方向投影正四维体,这个正三椎体投到它所在的三维空间的投体是它本身,也就有了四个顶点,第五个顶点会投到哪个地方呢?我画了个很恶心的图,如下

正投体

ABCD组成的是正三椎体投射到它所在三维空间的投体,E是第五个顶点投射到该三维空间的位置,是在正三棱锥的重心位置。

假设原四维体是ABCDF,将其投射到ABCD所在的三维空间,投射体为上图中的ABCDE。五个三椎体的投射情况分别是,ABCD投射到ABCD,ABCF投射到ABCE,ABDF投射到ABDE,ACDF投射到ACDE,BCDF投射到BCDE。ABCD由于是投射到它所在的三维空间,所以仍是它本身,而ABCF是从一个三维空间投射到另一个三维空间,投射体就变成了ABCE。再看,ABCE、ACDE、ABDE、BCDE是形状相同的三椎体,因为原本的四个正三棱锥所在的三维空间和ABCD所在三维空间的角度都是相同的,它们的形状原本也是相同的,所以投射到ABCD三维空间后,其形状仍然相同,这证明了此投射猜想的正确性。

侧投体

正投其实算是侧投的特殊情况,我们再来考虑一种特殊情况。考虑将某个正三棱锥投射到与它所在三维空间垂直的三维空间,该三棱锥的投射体重合成一个面了。于是,我们就得到了一个特殊的侧投体,仍然是ABCDE五个顶点,ABCD组合成一个三棱锥,E在这个三棱锥的某个面上。

考虑一般情况下的侧投的时候,可以从两个角度进行考虑:

  1. 将最简单的正四维体分解为五个正三维体,分别考虑它们投射到某个三维空间的情况
  2. 最简单的正四维体的三截体是三棱锥,这样考虑简单了许多

就考虑到这里吧,还要做毕设什么的。最后总结和联想一下。

思考四维的方法

  1. 很多二维、三维的概念在高维中也是可用的,比如垂直
  2. 很多二维、三维的概念稍作修改,也是可用的,比如截面、三截体
  3. 类比二维、三维的情况,这样来考虑四维就容易多了

联想

由于高维的存在,所以所谓的平行空间是存在的,还有交叉的各种空间,我会不会一不小心从我所在的空间走到了里给你一个空间?

想起了前段时间看过的三体,记得里面说过这样的话,假设有只蚂蚁生活在二维空间,它只能在一条线上生活,它是感受不到三维空间的存在的。作为四维空间的人,我想五维或者更高维空间里的会不会有个怪物像看蚂蚁一样的在看我,看我不爽的时候,它就从我看不见的地方伸出一只手来掐我……

尾注:没有理论基础的想法总是很幼稚的,请访客不吝指正。