Julia 如何连接C++;茱莉亚联盟

Julia 如何连接C++;茱莉亚联盟,julia,Julia,我正在尝试移植一些代码,现在遇到了一点棘手的问题。原代码是C++的。我需要移植一个具有两个32位整数(在一个数组中)和一个双精度整数的并集 到目前为止,我已经: I1 = UInt32(56) # arbitrary integer values for example I2 = UInt32(1045195987) # do transforms on I1 and I2 as per the code I'm porting A = bits(I1) B = bits(I2) return

我正在尝试移植一些代码,现在遇到了一点棘手的问题。原代码是C++的。我需要移植一个具有两个32位整数(在一个数组中)和一个双精度整数的并集

到目前为止,我已经:

I1 = UInt32(56) # arbitrary integer values for example
I2 = UInt32(1045195987)
# do transforms on I1 and I2 as per the code I'm porting
A = bits(I1)
B = bits(I2)
return parse(Float64, string(A,B))

这样做吗?字符串操作似乎很昂贵。感谢您的建议。

我也主要来自C/C++编程,这就是我处理问题的方法:

首先,创建一个包含两个
UInt32
元素的不可变类型:

immutable MyType
    a::UInt32
    b::UInt32
end
然后,您可以使用
重新解释
Float64
的向量转换为该类型

例如:

julia> x = [1.5, 2.3]
2-element Array{Float64,1}:
 1.5
 2.3

julia> immutable MyType ; a::UInt32 ; b::UInt32 ; end

julia> y = reinterpret(MyType, x)
2-element Array{MyType,1}:
 MyType(0x00000000,0x3ff80000)
 MyType(0x66666666,0x40026666)

julia> x[1]
1.5

julia> y[1]
MyType(0x00000000,0x3ff80000)

julia> y[1].a
0x00000000

julia> y[1].b
0x3ff80000
注意:这两个向量仍然指向相同的内存,因此您甚至可以使用任意一种类型更新元素

julia> x[1] = 10e91
1.0e92

julia> y[1].a
0xbf284e24

julia> y[1].b
0x53088ba3

julia> y[1] = MyType(1,2)
MyType(0x00000001,0x00000002)

julia> x[1]
4.2439915824e-314

它可能看起来很粗糙,但是
afloat64=reinterpret(Float64[I1;I2])[1]
也可以这样做。还有其他方法可以使用
不可变的
类型和
不安全的
操作来获得相同的效果。哦,看起来好多了。我试试看。我只是在学习这门语言并热爱它。我决定学习它的最好方法是把我们的C++代码转换成它。到目前为止,学习体验非常好。看起来它只是重新解释数组中的第一个值。重新解释(Float64,[UInt32(1010101000020),UInt32(1010001010)]产生不精确错误是
UInt32(1010101000020)
产生
不精确错误。它获取一个32位无符号整数无法表示的参数。您应该尝试其他的值作为参数。请发布联盟定义和任何您试图导出的特定C++代码的示例。否则我们只能在这里猜测目标。这很接近,但是原始源代码有一个2 UInt32变成了一个64。我读了联合,这不是最流行的特点,C++。我的C++编码日在14年前就停止了,所以我不确定我是否知道工会。然而,我的OP中的过程似乎有效。如果我能让重新解释程序不创建数组,而是从两个32位无符号整数创建一个真正的64位浮点,我会很高兴。请参阅以下线程:。您可以向任意方向执行。您可以从
UInt32
的向量开始,将其重新解释为
MyType
的向量,并将其重新解释为
Float64
的向量<代码>[MyType(1,2),MyType(5,6)]
将创建
MyType
@MattB的向量。这很有帮助!我能够看到,将int的位串接起来并解析成float的任何组合都不起作用。我用单词来检查一个浮点,转换成比特,然后用parse重新创建,结果失败了。所以我回到原点,但是有更多的信息。