关于复合类型的自引用

#结构参考:G5R10SimulationCalculate.SLDDRW
struct MoldCarrier
    R1::Complex # 模架固定杆
    r2::Real # 模架摆杆长度
    r3::Real # 模架连杆长度
    r4::Real # 模架连杆长度
    dh::Real #
    r5::Real # 摆臂连杆长度
    R6::Complex # 旋转中心至模架矢量
    r7::Real # 开合模向径初始长度
    α::Real # 模架角度常数
end
MoldCarrier(R1, r2, r3, r4, dh, r5, r6, r7) =
    MoldCarrier(R1, r2, r3, r4, dh, r5, r6, r7, asin(dh / r4) + π / 2)

end  # module MoldCarrierSys

代码如上,每建一个变量都需要将,最后一字段的值用前面的值计算出来,复合类型前没有mutable标识,可是初始会报错。无适配方法!我该怎么做?

我记得结构体的构造函数可以在内部定义
文档在这里
重点是new函数默认会分配好各个字段的内存,记得把struct改成mutable struct,先定义一个对象obj = new(),然后慢慢修改这个对象就可以了

1 个赞

如果你这些就是常数,初始化后无需修改,而且 你不会用到手工指定 α 的情况,那就用内部构造器+不可变(默认)。

struct MoldCarrier
    R1::Complex # 模架固定杆
    r2::Real # 模架摆杆长度
    r3::Real # 模架连杆长度
    r4::Real # 模架连杆长度
    dh::Real # 
    r5::Real # 摆臂连杆长度
    R6::Complex # 旋转中心至模架矢量
    r7::Real # 开合模向径初始长度
    α::Real # 模架角度常数

    MoldCarrier(R1, r2, r3, r4, dh, r5, r6, r7) = 
        new(R1, r2, r3, r4, dh, r5, r6, r7, asin(dh / r4) + π / 2)
end
julia> struct MoldCarrier
           R1::Complex # 模架固定杆
           r2::Real # 模架摆杆长度
           r3::Real # 模架连杆长度
           r4::Real # 模架连杆长度
           dh::Real #
           r5::Real # 摆臂连杆长度
           R6::Complex # 旋转中心至模架矢量
           r7::Real # 开合模向径初始长度
           α::Real # 模架角度常数

           MoldCarrier(R1, r2, r3, r4, dh, r5, r6, r7) =
               new(R1, r2, r3, r4, dh, r5, r6, r7, asin(dh / r4) + π / 2)
       end

julia> MoldCarrier(1,2,3,4,0,5,6,7)
MoldCarrier(1 + 0im, 2, 3, 4, 0, 5, 6 + 0im, 7, 1.5707963267948966)

julia> methods(MoldCarrier)
# 1 method for type constructor:
[1] MoldCarrier(R1, r2, r3, r4, dh, r5, r6, r7) in Main at REPL[1]:12

julia> MoldCarrier(1,2,3,4,0,5,6,7, 0.0)
ERROR: MethodError: no method matching MoldCarrier(::Int64, ::Int64, ::Int64, ::Int64, ::Int64, ::Int64, ::Int64, ::Int64, ::Float64)

但我发现你写的那个其实是能用的。
你初始化报什么错?

1 个赞

谢谢,我初始化时复数R6时写在成浮点数了所以报错!