C# 无法将ref double[]转换为ref对象

C# 无法将ref double[]转换为ref对象,c#,object,reference,measurement-studio,C#,Object,Reference,Measurement Studio,现在我好像每天都在问一个问题。我不确定这是好事还是坏事 今天的“WTF风格”涉及到我在使用NI Measurement Studio对象的函数时的完全和彻底的无俱乐部性。与我之前的大多数问题一样,这是关于一个实习项目,我的任务是在.NETFramework2.0中将VB6项目翻译成C# 原始VB代码如下所示: Public Sub FFT(ZData() As Single, FFTData() As Single) Dim realdata As Variant Dim img

现在我好像每天都在问一个问题。我不确定这是好事还是坏事

今天的“WTF风格”涉及到我在使用NI Measurement Studio对象的函数时的完全和彻底的无俱乐部性。与我之前的大多数问题一样,这是关于一个实习项目,我的任务是在.NETFramework2.0中将VB6项目翻译成C#

原始VB代码如下所示:

Public Sub FFT(ZData() As Single, FFTData() As Single)
    Dim realdata As Variant
    Dim imgdata As Variant

    // (... Some unrelated other code in here ...)

    // Here we pass three variables to a NI CWDSP object's ReFFT function
    CWDSP1.ReFFT ZData, realdata, imgdata

    // (... More unrelated code ...)
End Sub
    private void FFT(float[] ZData, float[] FFTData)
    {
        object realData = new object();
        object imgData = new object();
    
        // (... Unrelated intermediate code ...)
    
        DSP.ReFFT(ZData, ref realData, ref imgData);
        
        // Find out what the type actual is (this will probably only work
        // if the values are assigned with the new data type)
        // but worth a shot:
        type t1 = typeof(realData);
        type t2 = typeof(imgData);
    
        // if t1 and t2 show the actual types, replace the
        // type above (new object() with the type here)
    
        // (... Unrelated intermediate code ...)
    }
我曾一度在MsgBox中查看realdata和imgdata是如何被解释的。它们都是双(Double()s)。在最初的程序中,它可以很好地工作。诚然,我对原始程序的熟悉程度只是平庸的,因为我最近刚开始了这个项目,而且我只有几年的编程经验(没有机械工程经验。程序员是一名机械工程师,应用程序本身就是机器输出的测量工具)

将代码转移到C#,我尝试将其改写为:

private void FFT(float[] ZData, float[] FFTData){
    double[] realData = new double[1000];
    double[] imgData = new double[1000];

    // (... Unrelated intermediate code ...)

    DSP.ReFFT(ZData, realData, imgData);

    // (... Unrelated intermediate code ...)
}
正如你所看到的,我开始做它的方式基本上与原来的VB相同。出现以下错误:
无法将double[]转换为ref对象

那可不行。所以我试着:
DSP.ReFFT(ZData,refrealdata,refimgdata)

仅返回:
无法将ref-double[]转换为ref-object

所以我做了我认为显而易见的事。我将realData和imgData装箱到
对象中
s,并将它们传递给函数。然而,它并不太喜欢这样。如果我在没有
ref
的情况下传递新对象,它坚持认为我需要使用
ref
传递它们。如果我用
ref
传递它们,它会给出错误:

无法将ref-double[]转换为ref-object

嗯。。。看起来很熟悉。当我在两个变量的实例化中将
double[]
更改为
Object
时,我最终使编译器停止产生错误。但是当我运行该函数时,会出现
类型不匹配
错误


我真的不知道我要去哪里。互联网上几乎没有关于使用Measurement Studio进行C#编程的信息。即使有,我确信解决方案比我预期的要简单得多。历史告诉我,当有一个我无法理解的错误时,它几乎总是愚蠢的事情。

试试你的FFT函数:

object realData = new double[1000];
object imgData = new double[1000];
ReFFT(new object(), ref realData, ref imgData);

double[] realDataArray = (double[])realData;
通过将对象实例化为一个新的double[1000],您可以确定,尽管您将realData视为一个对象,但它的底层类型是double[]。稍后,在方法调用之后,您将通过创建一个新的realData数组并将前一个数组转换为原始类型来关闭realData数组。它可能比严格需要的装箱/拆箱更多,但希望它能让人明白这一点

尝试2:

double[] somerealData = new double[1000];
double[] someimgData = new double[1000];
object realData, imgData;
realData = somerealData;
imgData = someimgData;

ReFFT(new object(), ref realData, ref imgData);

double[] realDataArray = (double[])realData;
Console.WriteLine(realDataArray.Length);
realDataArray[0] = 1.0d;
Console.WriteLine(realDataArray[0]);
我已经在.NET2.0控制台应用程序中尝试了第二种方法,所以我非常确定它是有效的。如果没有,那么我们需要后退一步,重新评估形势

尝试3:刚刚注意到ReFFT方法的第一个参数是float[]。让我们试试这个:

double[] somerealData = new double[1000];
double[] someimgData = new double[1000];
//float[] zData placeholder since array comes from input param

object realData, imgData, zObj;
realData = somerealData;
imgData = someimgData;
zObj = zData;

ReFFT(zObj, ref realData, ref imgData);

double[] realDataArray = (double[])realData;
Console.WriteLine(realDataArray.Length);
realDataArray[0] = 1.0d;
Console.WriteLine(realDataArray[0]);

如果只是尝试向它发送一个对象,然后检查返回内容的类型,会怎么样。比如说:

Public Sub FFT(ZData() As Single, FFTData() As Single)
    Dim realdata As Variant
    Dim imgdata As Variant

    // (... Some unrelated other code in here ...)

    // Here we pass three variables to a NI CWDSP object's ReFFT function
    CWDSP1.ReFFT ZData, realdata, imgdata

    // (... More unrelated code ...)
End Sub
    private void FFT(float[] ZData, float[] FFTData)
    {
        object realData = new object();
        object imgData = new object();
    
        // (... Unrelated intermediate code ...)
    
        DSP.ReFFT(ZData, ref realData, ref imgData);
        
        // Find out what the type actual is (this will probably only work
        // if the values are assigned with the new data type)
        // but worth a shot:
        type t1 = typeof(realData);
        type t2 = typeof(imgData);
    
        // if t1 and t2 show the actual types, replace the
        // type above (new object() with the type here)
    
        // (... Unrelated intermediate code ...)
    }
更新:刚刚看到你上面的最后一条评论。您可能需要创建三个独立的对象。Test1、Test2和Test3都作为新对象()

在post中,它指出,对于文档,要执行以下操作:

开始>>所有程序>>国家仪器>>测量工作室7.1 for VS.NET 2003>>测量工作室文档

然后在过滤器下拉菜单下选择“Measurement Studio”

现在导航帮助树到 “NI测量工作室帮助>>NI测量工作室.NET类库>>参考>>国家仪器.分析.光谱测量>>测量类>>方法>>参考FT???方法


你说DSP是COM,你得到的奇怪错误向我表明,根本的问题是在.NET和COM之间“编组”参数。我不是这方面的专家,所以这更像是一个建议,即研究如何将DSP封装在COM互操作层中,并通过该层调用它


关于MSDN,这里有一个很好的起点:

我从来没有找出函数的错误所在,所以这个答案可能对某些人没有帮助。不过,如果你在C#中使用Measurement Studio,就像我一样,需要进行FFT,显然有一个.NET类包含了它,并且似乎可以工作

NationalInstruments.Analysis.Dsp.Transforms.FFT(以及InverseFFT和其他一些)。不过,我还是很想知道另一个的处理方法是什么


谢谢大家的建议。这些建议都是合乎逻辑的,可能应该有效,但由于一些未知的原因没有有效(可能与函数的内部工作有关).

No.COM.很抱歉没有指定。在VB6代码中,
realdata
imgdata
实际包含的类型是什么?DSP
类的方法签名是什么?就像我在我的帖子中所说的(承认很长),我运行了一个MSGBoxTypeName()axCWDSP.ReFFT的签名似乎是:
public virtual void ReFFT(object x,ref object y,ref object z);
我喜欢这个想法,但我已经尝试过了(而且刚刚又尝试过,这是非常肯定的)。我仍然遇到困扰我的类型不匹配错误。我注意到,当我在程序中放置断点时,它告诉我“realData”和“imgData”的类型为
对象{double[]}
与纯
对象相反
。可能与此有关。Hmmm。我在LINQPad中尝试了答案中的代码,效果很好。使用不同的方法更新答案注意,FFT函数来自外部来源:National Instruments Measu