将C转换为C#,处理缺少局部静态变量的问题

罗丹

活跃成员
已加入
2015年4月7日
留言内容
41
编程经验
10+
我找不到libastro的C#版本,所以我想我必须自己转换。尽管它确实使用了很多c#不支持的静态局部语言,但看起来并不难。我想我必须使用类静态变量并重命名它们,以便不同的方法不会与使用相同本地变量名的其他方法混淆。

所以我的问题是,这是一种合理的方法还是有人知道更好的方法?下面是C代码的示例。

C code:
static void
aaha_aux (
double lt,
double x, double y,
double *p, double *q)
{
    static double last_lt = -3434, slt, clt;
    double cap, B;

    if (lt != last_lt) {
        slt = sin(lt);
        clt = cos(lt);
        last_lt = lt;
    }

    solve_sphere (-x, PI/2-y, slt, clt, &cap, &B);
    *p = B;
    *q = PI/2 - acos(cap);
}
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,530
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果您只是对代码进行简单的机械移植,这似乎是合理的。

With the specific code above, though, it seems like the use of the static variable is an attempt to shave off a few milliseconds of time by avoiding recomputing the sine and cosine of lt. (Furthermore it seems to violate on the key rules about dealing with floating point numbers -- do not do equality comparisons.) This also brings into question thread safety. What happens when two different threads come in with different values of lt?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,530
地点
弗吉尼亚州切萨皮克
编程经验
10+
另外,这与PyEphem中的libastro相同吗?如果是这样,请注意C库代码是Elwood Downey所拥有的,他明确地从他的话中说 下载页面:
未经事先同意,在任何情况下都不得将XEphem源代码全部或部分用于构建其他计算机程序。
PyEphem的作者Brandon Rhodes获得了在PyEphem中使用的许可。
 

赫尔曼

活跃成员
已加入
2016年5月5日
留言内容
31
编程经验
10+
如果在VS中安装了Visual C ++,也可以只编译C源代码,然后创建一个.NET包装器,该包装器P /调用原始库并进行转换/编组。

VC ++包含一个C编译器,您可以使用以下命令在Visual Studio命令行中调用它"cl.exe"...

C#:
cl /W4 file1.c file2.c file3.c /link /out:lib1.dll


然后在C#中,P /调用C库:

C#:
[DllImport("lib1.dll")]
public static extern void aaha_aux(double lt, double x, double y, ref double p, ref double q);

请注意,您将必须仔细检查类型映射,我*认为*这是正确的,但不确定两个ref参数...您可以弄清楚! :)

这是你的票:

重新分发权:您只能完整地重新分发XEphem源代码,而无需进行修改。仅当二进制文件是从原始源代码构建的,或者是从源代码构建的,仅出于移植目的而不是出于更改功能的目的而进行了很小的更改时,才可以重新分发二进制文件。

如果您设法通过Windows中C语言中的原始源代码完整地移植和构建XEphem,请联系原始作者,与他共享您的构建脚本,并询问您是否愿意使用该端口。但是,从XEphem的广度来看,整个可视化层都必须从X11 / Motif移植到GDI +或DirectDraw或GTK#之类的东西,这可能是一项艰巨的任务。
 
Last edited:
最佳 底部