这个问题是在我将 pi_agm.c 移植到 C#时研究的,话不多说,直接进入正题。
提示:如果你从来没有用过指针,请先学习指针的含义以及用法。
首先在类名前面加入 unsafe 关键字,例如
unsafe class Program
这是由于 C#程序托管于.NET 平台之上,对指针的操作是有危险性的。并且要在 Properties(在解决方案资源管理器中)中勾选 “允许不安全代码 (F)”。 然后再引用中加入:
using System.Runtime.InteropServices;
这是非托管代码类。我们就要用到这个类的 Marshal.AllocHGlobal 与 Marshal.FreeHGlobal。下面用一个例子解释一下用法。例如,在 C 中有以下语句:
short *a;
a = (short*)malloc(sizeof(short)*SIZE);
//程序内容
free(a);
那么在 C#中就要写成:
short* a;
IntPtr ap = Marshal.AllocHGlobal(sizeof(short) * SIZE); //申请非托管指针
a = (short*)ap; //将指针地址传给 a
//程序内容
Marshal.FreeHGlobal(ap); //释放指针
这里就是绕了个弯子。我在移植这个程序时想了各种方法,还有类似于建数组然后传 [0] 的地址的,但是由于.NET 有垃圾回收器,而且这个数组的地址会不断的变化,即使使用 fixed 也还是不尽人意。最后还是推荐大家在 C#中尽量不要使用指针。除非用到图片处理这些功能。
//这篇文章写得比较仓促,如果你觉得看不懂或者什么的可以到我微博来找私信我。。。
Comments | NOTHING