我如何将这个程序从 Vala 翻译成 Genie?
How can I translate this program from Vala to Genie?
我想那里有 参考和一些例子,但我的 Google-fu 和 Genie 的文档页面都失败了。
让我们举一个非常具体的例子,一些来自 there:
的 Vala 代码
using GLib;
using Gsl;
public class Test : GLib.Object
{
public static void main (string[] args)
{
double[] a_data = new double[] { 0.18, 0.60, 0.57, 0.96,
0.41, 0.24, 0.99, 0.58,
0.14, 0.30, 0.97, 0.66,
0.51, 0.13, 0.19, 0.85 };
double[] b_data = new double[] { 1.0, 2.0, 3.0, 4.0 };
MatrixView m = MatrixView.array (a_data, 4, 4);
VectorView b = VectorView.array (b_data);
Vector x = new Vector (4);
int s;
Permutation p = new Permutation (4);
LinAlg.LU_decomp ((Matrix)(&m.matrix), p, out s);
LinAlg.LU_solve ((Matrix)(&m.matrix), p, (Vector)(&b.vector), x);
stdout.printf("x = \n");
Vector.fprintf(stdout, x, "%g");
}
}
以下是我尝试将该程序转换为 Genie 的方法:
[indent=4]
uses Gsl
init
a_data: array of double = { 0.18, 0.60, 0.57, 0.96,
0.41, 0.24, 0.99, 0.58,
0.14, 0.30, 0.97, 0.66,
0.51, 0.13, 0.19, 0.85 }
b_data: array of double = { 1.0, 2.0, 3.0, 4.0 }
var m = Gsl.MatrixView.array(a_data, 4, 4)
var b = Gsl.VectorView.array(b_data)
var x = new Gsl.Vector(4)
s:int = 0
var p = new Gsl.Permutation(4)
Gsl.LinAlg.LU_decomp(m, p, out s)
Gsl.LinAlg.LU_solve(m, p, b, x)
print "x =\n%g", x
根据 this reference.
这应该是正确的
但是失败了:
LA.gs:12.28-12.32: error: syntax error, expected identifier
var m = Gsl.MatrixView.array(a_data, 4, 4)
^^^^^
LA.gs:13.28-13.32: error: syntax error, expected identifier
var b = Gsl.VectorView.array(b_data)
^^^^^
Compilation failed: 2 error(s), 0 warning(s)
那么,谁能向我解释一下这个特定错误的含义? Genie 上下文中的标识符是什么?
在 Genie 中调用这种静态方法的正确方法是什么?
array是保留关键字,所以要在保留关键字前加上@符号:
var m = Gsl.MatrixView.@array(a_data, 4, 4)
var b = Gsl.VectorView.@array(b_data)
打印行也不正确,我已经解决了大部分问题:
[indent=4]
uses Gsl
init
a_data: array of double = { 0.18, 0.60, 0.57, 0.96,
0.41, 0.24, 0.99, 0.58,
0.14, 0.30, 0.97, 0.66,
0.51, 0.13, 0.19, 0.85 }
b_data: array of double = { 1.0, 2.0, 3.0, 4.0 }
var m = Gsl.MatrixView.@array(a_data, 4, 4)
var b = Gsl.VectorView.@array(b_data)
var x = new Gsl.Vector(4)
s:int = 0
var p = new Gsl.Permutation(4)
Gsl.LinAlg.LU_decomp((Matrix) m, p, out s)
Gsl.LinAlg.LU_solve((Matrix) m, p, (Vector) b.vector, x)
stdout.printf("x =\n")
Vector.fprintf(stdout, x, "%g")
这仍然无法编译,因为 LU_
方法需要类型转换,我不是 100% 确定该怎么做。
更新:此代码编译并运行,但我不知道它是否真的正确:
[indent=4]
uses Gsl
init
a_data: array of double = { 0.18, 0.60, 0.57, 0.96,
0.41, 0.24, 0.99, 0.58,
0.14, 0.30, 0.97, 0.66,
0.51, 0.13, 0.19, 0.85 }
b_data: array of double = { 1.0, 2.0, 3.0, 4.0 }
var m = Gsl.MatrixView.@array(a_data, 4, 4)
var b = Gsl.VectorView.@array(b_data)
var x = new Gsl.Vector(4)
s:int = 0
var p = new Gsl.Permutation(4)
mp : MatrixView* = &m
vp : Vector** = &(b.vector)
Gsl.LinAlg.LU_decomp((Matrix) mp, p, out s)
Gsl.LinAlg.LU_solve((Matrix) mp, p, (Vector) vp, x)
stdout.printf("x =\n")
Vector.fprintf(stdout, x, "%g")
我想那里有 参考和一些例子,但我的 Google-fu 和 Genie 的文档页面都失败了。
让我们举一个非常具体的例子,一些来自 there:
的 Vala 代码using GLib;
using Gsl;
public class Test : GLib.Object
{
public static void main (string[] args)
{
double[] a_data = new double[] { 0.18, 0.60, 0.57, 0.96,
0.41, 0.24, 0.99, 0.58,
0.14, 0.30, 0.97, 0.66,
0.51, 0.13, 0.19, 0.85 };
double[] b_data = new double[] { 1.0, 2.0, 3.0, 4.0 };
MatrixView m = MatrixView.array (a_data, 4, 4);
VectorView b = VectorView.array (b_data);
Vector x = new Vector (4);
int s;
Permutation p = new Permutation (4);
LinAlg.LU_decomp ((Matrix)(&m.matrix), p, out s);
LinAlg.LU_solve ((Matrix)(&m.matrix), p, (Vector)(&b.vector), x);
stdout.printf("x = \n");
Vector.fprintf(stdout, x, "%g");
}
}
以下是我尝试将该程序转换为 Genie 的方法:
[indent=4]
uses Gsl
init
a_data: array of double = { 0.18, 0.60, 0.57, 0.96,
0.41, 0.24, 0.99, 0.58,
0.14, 0.30, 0.97, 0.66,
0.51, 0.13, 0.19, 0.85 }
b_data: array of double = { 1.0, 2.0, 3.0, 4.0 }
var m = Gsl.MatrixView.array(a_data, 4, 4)
var b = Gsl.VectorView.array(b_data)
var x = new Gsl.Vector(4)
s:int = 0
var p = new Gsl.Permutation(4)
Gsl.LinAlg.LU_decomp(m, p, out s)
Gsl.LinAlg.LU_solve(m, p, b, x)
print "x =\n%g", x
根据 this reference.
这应该是正确的但是失败了:
LA.gs:12.28-12.32: error: syntax error, expected identifier
var m = Gsl.MatrixView.array(a_data, 4, 4)
^^^^^
LA.gs:13.28-13.32: error: syntax error, expected identifier
var b = Gsl.VectorView.array(b_data)
^^^^^
Compilation failed: 2 error(s), 0 warning(s)
那么,谁能向我解释一下这个特定错误的含义? Genie 上下文中的标识符是什么?
在 Genie 中调用这种静态方法的正确方法是什么?
array是保留关键字,所以要在保留关键字前加上@符号:
var m = Gsl.MatrixView.@array(a_data, 4, 4)
var b = Gsl.VectorView.@array(b_data)
打印行也不正确,我已经解决了大部分问题:
[indent=4]
uses Gsl
init
a_data: array of double = { 0.18, 0.60, 0.57, 0.96,
0.41, 0.24, 0.99, 0.58,
0.14, 0.30, 0.97, 0.66,
0.51, 0.13, 0.19, 0.85 }
b_data: array of double = { 1.0, 2.0, 3.0, 4.0 }
var m = Gsl.MatrixView.@array(a_data, 4, 4)
var b = Gsl.VectorView.@array(b_data)
var x = new Gsl.Vector(4)
s:int = 0
var p = new Gsl.Permutation(4)
Gsl.LinAlg.LU_decomp((Matrix) m, p, out s)
Gsl.LinAlg.LU_solve((Matrix) m, p, (Vector) b.vector, x)
stdout.printf("x =\n")
Vector.fprintf(stdout, x, "%g")
这仍然无法编译,因为 LU_
方法需要类型转换,我不是 100% 确定该怎么做。
更新:此代码编译并运行,但我不知道它是否真的正确:
[indent=4]
uses Gsl
init
a_data: array of double = { 0.18, 0.60, 0.57, 0.96,
0.41, 0.24, 0.99, 0.58,
0.14, 0.30, 0.97, 0.66,
0.51, 0.13, 0.19, 0.85 }
b_data: array of double = { 1.0, 2.0, 3.0, 4.0 }
var m = Gsl.MatrixView.@array(a_data, 4, 4)
var b = Gsl.VectorView.@array(b_data)
var x = new Gsl.Vector(4)
s:int = 0
var p = new Gsl.Permutation(4)
mp : MatrixView* = &m
vp : Vector** = &(b.vector)
Gsl.LinAlg.LU_decomp((Matrix) mp, p, out s)
Gsl.LinAlg.LU_solve((Matrix) mp, p, (Vector) vp, x)
stdout.printf("x =\n")
Vector.fprintf(stdout, x, "%g")