代码之家  ›  专栏  ›  技术社区  ›  TimothyP

将一个对象从f传递到c方法中,wich将其作为out参数,但不起作用?

  •  3
  • TimothyP  · 技术社区  · 15 年前

    我使用的库之一在C中定义了这个:

    public ushort GetParameterSet(string name, out ParameterSet parameterSet)
    

    我想从F打电话给你:

    let parameterSet = new ParameterSet();
    let retVal = currentPanel.GetParameterSet(name, ref parameterSet);
    

    但是,即使参数集被设置为 用C方法中的有效数据初始化,它不会在F中更改。

    我这里缺什么?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Tamás Szelei    15 年前

    尝试

    // let parameterSet = null;
    let retval, parameterSet = currentPanel.GetParamterSet(name);
    

    您不应该将实例作为 ref 参数,当方法等待一个out参数时(调用时,该参数应该是一个前面有 out 关键字)。

        2
  •  11
  •   Pavel Minaev    15 年前

    首先,为什么您的代码不能正常工作: ref 在f中的含义与c中的含义不同。在F, 'a ref 是一个 类型 . 它也不神奇-它只是一张单场唱片 contents ,定义如下:

    type 'a ref = { mutable contents : 'a }
    

    不是 指向局部变量的指针或引用。因此,当你写这篇文章时:

    let x = 0
    let y = ref x
    

    不要 有变量 y 引用 x . 相反,您有变量 Y 类型的 int ref ,值为 内容 初始化为 X had(即0)。您可以更改:

    y.contents <- 1
    

    这不会改变 X . 它只会改变 目录

    f还提供了 一个裁判 . 具体来说,这是:

    y.contents <- y.contents + 1
    

    可以缩短为:

    y := !y + 1
    

    因此 := 是分配给 内容 ! 是读取其值的简写。

    Reference Cells 有关详细信息,请参阅msdn 裁判 .

    现在F有一个与 一个裁判 类型,它允许您将该类型的实例传递给需要 byref 论证(两者) 裁判 out C语言映射到 拜雷夫 在IL)。在这种情况下,如果函数更改了参数的值,则 内容 在你 裁判 实例会相应地更改。在你的例子中, ref parameterSet 已创建的新实例 裁判 ,将它传递给更改它的函数,然后丢弃它。你应该做的是:

    let parameterSet = ref(new ParameterSet())
    let retVal = currentPanel.GetParameterSet(name, parameterSet)
    ...
    // use parameterSet.contents as needed
    

    或者,您可以使用 let mutable 声明一个可变的局部变量,然后使用 & 运算符将其直接传递给函数 拜雷夫 :

    let mutable parameterSet = new ParameterSet()
    let retVal = currentPanel.GetParameterSet(name, &parameterSet)