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

时间:2010-07-08 18:14:23

标签: c# object reference measurement-studio

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

当使用NI Measurement Studio对象的功能时,今天的“WTF的风味”涉及到我完全彻底的无知。与我以前的大多数问题一样,这是关于实习项目,我在这个项目中负责将VB6项目转换为.Net Framework 2.0中的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

我一度陷入MsgBox,看看是如何解释realdata和imgdata的。他们都是Double()。它在原始程序中的工作原理很好。不可否认,我对原始程序的深入了解只是平庸,因为我最近选择了这个项目,并且只有几年的编程工作(而且没有多年的机械工程。程序员是机械工程师,应用程序本身用于机器输出的测量工具。)

将代码转到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基本相同。出现以下错误:Cannot Convert double[] to ref object

嗯,这不好。所以我尝试了:DSP.ReFFT(ZData, ref realData, ref imgData);

仅返回:Cannot Convert ref double[] to ref object

所以我做了我认为很明显的事情。我将realData和imgData装入object s,并将它们传递给函数。然而,它并不太喜欢。如果我在没有ref的情况下传递新对象,则表示我需要使用 ref传递。如果我使用ref传递它们,则会给出错误:

Cannot Convert ref double[] to ref object

嗯......看起来很熟悉。当我在两个变量的实例化中将double[]更改为Object时,我终于让编译器停止产生错误。但是......当我运行该函数时,我收到Type Mismatch错误。

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

4 个答案:

答案 0 :(得分:3)

在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数组。它可能比严格需要的更多装箱/拆箱,但希望它能得到重点

尝试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]);

我在.NET 2.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]);

答案 1 :(得分:0)

如果只想尝试发送一个对象,然后检查你得到的内容的类型。所以像这样:

    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都是新对象()的。

来自this帖子,它说文档要执行以下操作:

  

开始>>所有程序>> National Instruments>> Measurement Studio 7.1 for VS .NET 2003> Measurement Studio文档

     

然后在Filter下拉菜单下选择“Measurement Studio”。

     

现在导航帮助树   “NI Measurment Studio帮助>> NI Measurement Studio .NET类库>>参考>> National Instruments.Analysis.SpectralMeasurements>>测量类>>方法>> ReFFT ???方法

答案 2 :(得分:0)

你说DSP是COM,你得到的奇怪错误告诉我,底层问题是“编组”.NET和COM之间的参数。我不是这方面的专家,所以这更像是一个建议来研究如何将DSP封装在COM-interop层并通过该层调用它。

这是MSDN的一个很好的起点:Introduction to COM Interop

答案 3 :(得分:0)

我从未弄清楚这个功能有什么问题,所以这个答案可能对某些人没有帮助。然而,如果你像我一样在C#中使用Measurement Studio并且需要进行FFT,那么显然有一个包含它的.NET类,并且似乎可以工作。

NationalInstruments.Analysis.Dsp.Transforms.FFT(和InverseFFT以及其他一些人)。我仍然想知道与另一个人的交易是什么,但是......

感谢大家的建议。它们都是合乎逻辑的,可能应该有效,但不是出于某种未知原因(可能与函数的内部工作有关)。